2016-12-20 6 views
0

Я пытаюсь проанализировать некоторый код javascript, для которого я использую функцию перезаписи, чтобы вызовы в JS-библиотеку проходили через код javascript. Мой JavaScript-код является частью расширения Chrome, и я устанавливаю/внедряю его через скрипты контента на DOM целевой страницы через расширение chrome. Это прекрасно работает для функций, вызванных после загрузки страницы, и вызовы библиотеки проходят через мою функцию. Но есть JavaScript-код, который запускается во время загрузки страницы (возможно, при визуализации DOM). Это происходит до ввода моего пользовательского скрипта. Таким образом, вызовы функций перед тем, как вводится пользовательский скрипт, потеряны для меня, или эти вызовы JS не проходят через мою функцию. Я использую Content Script, чтобы на самом деле ввести другой JavaScript, добавив DOM, как указано в приведенной ниже ссылке.остановить javascript от запуска до того, как установлен скрипт контента

Insert code into the page context using a content script

Я знаю, что могу справиться время загрузки содержимого Script, чтобы быть в начале/конце DOM, но это еще один файл сценария, который я прилагаю к DOM целевой страницы, и я не похоже, понимают, как управлять им. Любая помощь любого человека очень ценится. Спасибо.

Редактировать: Проблема, описанная в Is it possible to run a script in context of a webpage, before any of the webpage's scripts run, using a chrome extension? , является абсолютно такой же, но решение, похоже, не работает. Мое намерение состоит в том, чтобы выполнить инъецированный скрипт, прежде чем какой-либо js-код будет выполнен с веб-страницы. Указав document_start в manifest.json, выполнение сценария содержимого может быть запущено до веб-страницы, но не сценарий, который я вставляю через скрипт содержимого (сценарий впрыска, как объяснено в первой ссылке). Этот впрыскивается скрипт не работает в какой-либо определенным образом по отношению к веб-странице

EDIT 2:

manifest.json файл манифеста имеет content.js добавлен в document_start сценарий контента. Таким образом, content.js запускается до запуска целевой страницы (базовой страницы).

"content_scripts":[ 
    { 
    "matches":["<all_urls>"],    
    "js":["content.js"], 
    "run_at":"document_start", 
    "all_frames":false 
    } 
], 

content.js

content.js имеет следующий код, с которым я добавляю main.js к DOM, так что я на самом деле способен взаимодействовать с JavaScript, который находится в среде целевой страницы , Я делаю это из другого файла и присоединяю его к DOM, потому что я не могу взаимодействовать с JavaScript целевой страницы через Content Scripts, так как они оба не мешают друг другу. Чтобы объяснить далее, main.js имеет некоторый JavaScript, который перехватывает JS-вызовы во время выполнения JS на целевой странице. JS на целевой странице вызывает вызовы в библиотеку, и я намерен просто написать обертку для этих функций библиотеки.

var u = document.createElement('script'); 
u.src = chrome.extension.getURL('main.js'); 
(document.head||document.documentElement).appendChild(u); 
u.onload = function() { 
    u.parentNode.removeChild(u); 
}; 

Я ожидаю, что main.js доступен в домене целевой страницы и любой из сценариев в целевой страницы, так как я вводить его через скрипт контента, который выполняется на document_start. Предположим, что у меня есть вызов какой-либо функции JS, как это на моей целевой странице html, someJSCall() определяется доменом целевой страницы.

В этом сценарии main.js (код инжектированных через мое расширение хром) уже доступен. Поэтому вызовы в библиотеку JS из какой-либо функции функции проходят через функции оболочки main.js. Это прекрасно работает.

Проблема заключается в том, что есть IIFE (сразу вызываемые функциональные выражения), определенные в JS целевой страницы. Если эти вызовы IIFE вызывают вызовы библиотеки, это не проходит через мои перехваты main.js. Если я посмотрю файлы, загруженные в браузере с помощью инструментов Chrome Dev, я вижу, что main.js по-прежнему не загружается, когда выполняются вызовы IIFE.

Надеюсь, я подробно объяснил проблему. Пожалуйста, дайте мне знать, если это еще не ясно.

спасибо.

+0

Пожалуйста, задавайте вопрос по теме: включите ** полный ** [mcve], который * дублирует проблему *. Включая * manifest.json *, некоторые из сценариев background/content/popup/HTML. Вопросы, требующие помощи по отладке («** почему этот код не работает? **)) должны включать: ► желаемое поведение, ► конкретную проблему или ошибку * и * самый короткий код, необходимый для его воспроизведения ** в вопросе сам**. Вопросы без четкого описания проблемы не полезны другим читателям. Смотрите: «** Как создать [mcve] **», [о каких темах я могу спросить здесь?] (Http://stackoverflow.com/help/on-topic) и [ask]. – Makyen

+2

Возможный дубликат [Возможно ли запустить сценарий в контексте веб-страницы, прежде чем запускать какие-либо скрипты веб-страницы, используя расширение chrome?] (Http://stackoverflow.com/questions/13540636/is-it-possible -to-run-a-script-in-context-of-a-webpage-before-any-of-the-webpag) – rsanchez

+0

Вы предоставили некоторые, неясные объяснения, почему это не дубликат. Тем не менее, вы все еще не предоставили то, что требуется для того, чтобы сделать отладочный вопрос по теме. Посмотрите мой первый комментарий для списка. Большая часть того, чего здесь нет, это ** [mcve] **. Без [mcve] (который дублирует возникшую у вас проблему и конкретно показывает, почему решение (ы) в связанном дубликате не решает вашу проблему), мы не сможем помочь вам. Дело не в том, что мы не хотим помогать, это то, что вы не предоставили достаточной информации для нас, чтобы иметь возможность сделать это. – Makyen

ответ

0

В своем вопросе вы заявляете, что «можете обрабатывать время загрузки Content Script в начале и конце DOM», но вы не даете понять, почему вы не можете решить проблему, выполнив свою сценарий содержимого по адресу document_start.

Вы можете иметь свой сценарий впрыскиваются до страницы вы инъекционная в строятся путем указания document_start для run_at недвижимости в вашем manifest.jsoncontent_scripts записи, или для runAt опции передается chrome.tabs.executeScript(). Если вы это сделаете, ваш скрипт начнет работать, если document.head и document.body оба являются null. Затем вы можете контролировать, что добавляется на страницу.

Для chrome.tabs.executeScript() точно, когда выполняется ваш скрипт, зависит от того, когда вы выполняете chrome.tabs.executeScript() в отношении процесса загрузки страницы. Из-за асинхронного характера обработки (ваш фоновый скрипт обычно работает в другом процессе), трудно получить, что ваш скрипт последовательно вводится, когда document.head и document.body оба являются null. Лучшее, что я сделал, это заставить скрипт вводить иногда, когда это так, а иногда и после заполнения страницы, но до того, как будут извлечены другие ресурсы. Это время будет работать для большинства вещей, но если вам действительно нужно, чтобы ваш скрипт выполнялся до существующей страницы, вы должны использовать запись manifest.jsoncontent_scripts.

С вашим скриптом контента, запущенным до существования head и body, вы можете управлять тем, что вставлено первым. Таким образом, вы можете вставить свой <script> прежде чем что-либо еще на странице. Это должно сделать ваш скрипт выполненным до любого другого скрипта в контексте страницы.

+0

Спасибо за ваш вклад. Проблема, с которой я столкнулся, заключается в том, что я хочу, чтобы вызовы в js-библиотеку проходили через мой javascript (переписывание функций, как и советы по вызовам библиотеки). Поскольку скрипты содержимого не мешают регулярным вызовам JS, я делаю инъекцию в контексте веб-страницы, используя метод, описанный в ссылке, которую я ранее предоставил. Это связано с DOM. Проблема заключается в –

+0

Проблема заключается в том, что я сталкиваюсь с вызовами IIFE, которые вызывают себя при загрузке js на странице html. Если вызовы библиотеки происходят в , все работает нормально, и мой совет уже вводится. Но при использовании IIFE они запускаются до моего совета JS. Надеюсь, мой вопрос немного яснее, чем раньше, спасибо вам снова –

Смежные вопросы