Автоматический переход к определенной части WebView

#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