#javascript #jquery #html #webview #google-chrome-app
#javascript #jquery #HTML #webview #google-chrome-приложение
Вопрос:
Я создаю приложение Chrome и использую тег web view, который похож на iframe.
Есть ли способ загрузить половину веб-страницы, которая находится внутри веб-представления?
Я пробовал:
<webview onLoad="window.scroll(0, 150)" class="test" src="http://example.co.uk/test.aspx"></webview>
Но, похоже, это было бы далеко не просто. Я не уверен, что это вообще возможно.
Спасибо
Комментарии:
1. Вот вам подсказка: предполагая, что код будет выполняться при загрузке webview (это не так, но это отдельная проблема), на что будет
window
ссылаться?
Ответ №1:
Предполагая на мгновение, что код будет выполняться (это не будет из-за CSP), window
будет ссылаться на страницу приложения, а не на встроенную страницу.
Вам нужно выполнить код в контексте встроенной страницы.
Если вы раньше работали с расширениями Chrome, вы бы знали, что часть, взаимодействующая с веб-контентом, называется скриптом содержимого.
Приложения имеют аналогичную концепцию для <webview>
элементов. Вы можете либо заранее объявить, какие страницы должны получать какой сценарий содержимого во время их загрузки, либо вы можете явно загрузить сценарий содержимого.
Итак, предположим, у вас есть файл content.js
со следующим содержимым (извините за каламбур):
window.scroll(0, 150);
Кроме того, предположим, что у вас есть скрипт app.js
, запущенный на странице вашего приложения, а переменная webview
является ссылкой <webview>
на нее.
Затем вы можете заставить webview выполнить его:
-
Декларативно, вызывая
webview.addContentScripts
перед загрузкой страницы (например, перед настройкойsrc
изapp.js
кода):// Assuming <webview id="wv"></webview> var webview = document.getElementById("wv"); webview.addContentScripts([{ name: "ExampleRule", matches: ["http://example.co.uk/*"], // can be as narrow as you wish js: ["content.js"] }]); webview.src = "http://example.co.uk/test.aspx";
-
Явно, когда страница уже загружена:
// Assuming <webview id="wv" src="http://example.co.uk/test.aspx"></webview> var webview = document.getElementById("wv"); webview.executeScript({file: "content.js"});
Конечно, можно сделать content.js
гораздо более сложным (например, получать команды из приложения) и / или более точно контролировать время выполнения вашей операции, но на данный момент это общие вопросы сценария содержимого, для которых вы можете найти решения в другом месте или задать новый вопрос.
Комментарии:
1. Зачем мне нужны 2 js-файла?
2. Один файл на контекст? У вас есть 2 вложенных документа, страница вашего приложения и встроенная страница. Сценарий находится только «в» одном документе, и повторное использование одного сценария для обеих ситуаций в целом является плохой идеей.
3. Нет, я знаю, я думал, что вы говорили, что я должен сделать content.js и еще app.js . Должен ли я просто вставить весь этот JavaScript в мой текущий JS-файл?
4. Вот аналогия. Предположим, у вас есть алгоритм для покупок в магазине и для стрижки. Должны ли вы склеить их вместе и попытаться выполнить все шаги независимо от того, заходите ли вы в магазин или парикмахерскую? Лучше держать их (логически) отдельно. И в приложении есть даже третий сценарий, фоновый, для еще одного контекста. Опять же, разделите. Итак, да, я говорю, что вам нужны (как минимум) 3 отдельных файла, если вы не хотите сложной логики переключения «давайте посмотрим, в магазине я или нет».
5. Примечание: вы можете использовать
executeScript
code
параметр ‘s вместо отдельного файла для такого тривиального однострочника. Но в целом это чище, если у вас есть отдельный файл, и вы должны использовать отдельный файл дляaddContentScripts