Расширение Chrome, установленное на `run_at`` document_start` работает слишком быстро?
РЕДАКТИРОВАТЬ: Что-то не так с моим браузером Chrome, и возник конфликт с моим скриптом, полная переустановка устранила источник проблемы. Если мне удастся выяснить, что вызвало это, я включу это сюда.
РЕДАКТИРОВАТЬ 2: Просто, чтобы любой, кто читает это в 2017 году, знал, что я не забыл это, и у меня никогда не было этой проблемы со времени моего предыдущего редактирования.
EDIT3: это 2019 и до сих пор у меня никогда не было этой проблемы снова.
Я изучал, как создать простое расширение Chrome, которое является портом usercript. Скрипт отлично работает с Tampermonkey с настройкойrun at
вdocument-start
все необходимые события, которые должны быть перехвачены с самого начала, фиксируются.
Однако, когда я установил те же настройки в расширении Chrome, я обнаружил, что тот же самый рабочий параметр работает быстрее, чем Tampermonkey, что приводит к сбою первой функции :(Uncaught TypeError: Cannot call method 'appendChild' of null.
) поскольку он пытается добавить элемент скрипта вhead
раздел, который не существует до 0,010 с позже.
Мое грязное решение до сих пор состояло в том, чтобы использоватьsetInterval
функция с таймером, установленным на 10, чтобы проверить,document.head
существует, а затем перейдите к коду, если условие истинно.
Есть ли способ, которым я могу сделать это правильно, не прибегая кsetInterval
или, может быть, копия Tampermonkey'sgrant none
вариант, который появляется для запуска usercript в контексте веб-страницы?
Ниже приведен мой файл manifest.json:
{
"manifest_version": 2,
"content_scripts": [ {
"js": [ "simpleuserscript.user.js" ],
"matches": [ "https://www.google.com/*"],
"run_at": "document_start"
} ],
"converted_from_user_script": true,
"description": "Chrome extension",
"name": "Testing",
"version": "1"
}
Всего этого можно избежать, если Chrome приметafterscriptexecute
событие, но пока это не произошло, я застрял сload
событие. Я заранее благодарю за любую помощь.
РЕДАКТИРОВАТЬ: я уже попробовал предложения в ответах: используя другойrun at
точка, используяDOMContentLoaded
и добавить кdocument.documentElement
, Все они оказались неудачными, потому что: 1 и 2 заставляют скрипт пропустить ранние события, а 3 возвращает ту же ошибку TypeError, что и при попытке добавить кdocument.head
.
Скрипт должен быть вставлен / запущен, когдаdocument.readyState = loading
или же он пропустит ранние необходимые события, но не настолько рано, что не сможет добавить детей кdocumentElement
или жеhead
Пример кода внутриsimpleuserscript.user.js
:
var script = document.createElement("script");
script.textContent = "console.log('success')";
if(document.head) {
document.head.appendChild(script);
} else if(document.documentElement) {
document.documentElement.appendChild(script);
}
Консоль покажетTypeError: Cannot call method 'appendChild' of null