Ключ | Ценность
-- | --
системная платформа | AMD64, Windows-10-10.0.14393
Браузер | Firefox Developer Edition (55.0 Beta 1, 64-разрядная версия)
Пользовательский агент | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0
Конфигурация сборки | https://hg.mozilla.org/releases/mozilla-beta/rev/6872377277a618b2b9e0d2b4c2b9e51765ac199e
Смазать обезьяну | 3.11
// ==UserScript==
// <strong i="15">@name</strong> HeadTest
// <strong i="16">@namespace</strong> HeadTest
// <strong i="17">@include</strong> *
// @run-at document-start
// <strong i="18">@version</strong> 1
// <strong i="19">@grant</strong> none
// ==/UserScript==
AddGlobalStyle('body{background-color:red;}');
function AddGlobalStyle(css) {
var head, style;
head = document.getElementsByTagName("head")[0];
console.log("[Test]: Head: %o", head); //DEBUG
console.log("[Test]: document.head: %o", document.head); //DEBUG
}
[Test]: Head: <head>
[Test]: document.head: <head>
[Test]: Head: undefined
[Test]: document.head: null
Эта проблема также относится к GM_addStyle
Последняя хорошая версия: Firefox 55.0a1 (17 марта 2017 г.)
Сборка с https://hg.mozilla.org/mozilla-central/rev/39607304b774591fa6e32c4b06158d869483c312
Первое плохое: Firefox 55.0a1 (2017-03-17)
Сборка с https://hg.mozilla.org/mozilla-central/rev/23a4b7430dd7e83a2809bf3dc41471f154301eda
Ошибка 1333990 является подозреваемой.
Смотрите также #1849
@janekptacijarabaci Нашел обходной путь:
setTimeout(()=>{
AddGlobalStyle('body{background-color:red;}');
});
Это выглядит нестабильным и ненадежным, но это самый простой способ, который я могу найти в настоящее время, чтобы заставить все работать.
... и документация по-прежнему неверна.
https://developer.mozilla.org/en-US/docs/Observer_Notifications#Documents
Я не думаю, что это ошибка. document-start
происходит очень рано. Это позволяет пользовательским скриптам манипулировать страницей до того, как какой-либо контент javascript будет выполнен.
Если вы хотите выполнить позже, просто используйте document-end
или используйте наблюдателей мутаций, чтобы дождаться вставки определенного элемента.
@the8472
Может быть, вы правы.
Согласно МДН:
вставленный элемент документа
Отправляется сразу после создания корневого элемента документа, но до выполнения на нем любого скрипта.
document-start
(на основе document-element-inserted
) запускается сразу после создания <html></html>
, в настоящее время <head>
равно нулю.
Но это ломает многие скрипты, которые пытаются добавить стиль до отображения страницы (если вы используете GM_addstyle
с document-end
, вы заметите, что страница мигает), как это работало раньше
Я не уверен, что это сделано намеренно
GM_addStyle в любом случае глупый, он просто вставляет тег <style>
в <head>
, вы можете сделать это самостоятельно, при необходимости с наблюдателем мутаций.
Но если это действительно проблема, ее можно исправить, чтобы проверить наличие <head>
, используйте наблюдателей, если это не так.
@the8472 the8472 Если поведение текущего document-start
правильное и преднамеренное, то нам нужно использовать наблюдателя каждый раз, когда вам нужно добавить стиль
Что-то типа
function addGlobalStyle(css){
let headHunter = new MutationObserver(
records => {
; check mutation records
; is added node's tag name 'head'?
; create a style node then throw it in
; then disconnect us
}
);
headhunter.observer(document, {childlist : true});
}
необходим для каждого сценария, который добавляет стиль перед document-end
. Это скучно.
Я надеюсь, что GM_addstyle
может сделать это для меня или написать какое-нибудь полезное предупреждение в вики ("GM_addstyle недоступен для скриптов с @run-at document-start, не используйте его, найдите решение самостоятельно ", и т.д)
Да, gm_addstyle должен быть исправлен.
Но все остальное, что может делать скрипт, также должно проходить через те же обручи при запуске документа, добавляя стили, не являющиеся особенными в этом отношении. Ничто из DOM недоступно, поэтому вам придется ждать того, что вам нужно. Т.е. вам все равно нужно использовать наблюдателей, если вы запускаете что-то при старте документа.
Спасибо за подробный отчет, но это WAI, а ветка 3.x все равно мертва. (Я, например, приветствую наших новых повелителей веб-расширений.) Такие вещи, как GM_addStyle
, будут исправлены тем, что никогда не существовали в 4.x.
Существуют такие сценарии, как https://arantius.com/misc/greasemonkey/amazon-url-cleaner.user.js , которые вообще не нуждаются в DOM и должны запускаться как можно скорее.
Самый полезный комментарий
@the8472 the8472 Если поведение текущего
document-start
правильное и преднамеренное, то нам нужно использовать наблюдателя каждый раз, когда вам нужно добавить стильЧто-то типа
необходим для каждого сценария, который добавляет стиль перед
document-end
. Это скучно.Я надеюсь, что
GM_addstyle
может сделать это для меня или написать какое-нибудь полезное предупреждение в вики ("GM_addstyle недоступен для скриптов с @run-at document-start, не используйте его, найдите решение самостоятельно ", и т.д)