مفتاح | قيمة
- | -
منصة النظام | AMD64 ، Windows-10-10.0.14393
المستعرض | إصدار Firefox Developer (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 (2017-03-17)
الإنشاء من 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;}');
});
يبدو غير مستقر وغير موثوق به ، ولكن هذه هي أبسط طريقة يمكنني أن أجدها حاليًا والتي تجعل الأشياء تعمل.
لا أعتقد أن هذا خطأ. يحدث document-start
مبكرًا جدًا . يسمح هذا للمستخدمين بمعالجة الصفحة قبل تنفيذ أي محتوى جافا سكريبت.
إذا كنت تريد التنفيذ لاحقًا ، فما عليك سوى استخدام document-end
أو استخدام مراقبي الطفرات لانتظار إدراج عنصر معين.
@ the8472
ربما انت على حق.
وفقًا لـ MDN:
تم إدراج عنصر المستند
يتم إرساله فورًا بعد إنشاء العنصر الجذر للمستند ، ولكن قبل تنفيذ أي نص برمجي عليه.
يتم تشغيل document-start
(على أساس document-element-inserted
) فورًا بعد إنشاء <html></html>
، في هذا الوقت ، <head>
فارغ.
لكن هذا يكسر العديد من البرامج النصية التي تحاول إضافة نمط قبل عرض الصفحة (إذا كنت تستخدم GM_addstyle
مع document-end
فستلاحظ أن الصفحة تومض) لأنها تعمل من قبل
لست متأكدًا من أن هذا عن قصد
GM_addStyle أمر سخيف على أي حال ، فهو يقوم فقط بإدراج علامة <style>
في <head>
، يمكنك القيام بذلك بنفسك ، مع مراقب الطفرات إذا لزم الأمر.
ولكن إذا كان هذا هو القلق الفعلي ، فيمكن تصحيحه للتحقق من وجود <head>
استخدم المراقبين إذا لم يكن كذلك.
@ 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 إذا كان سلوك
document-start
الحالي صحيحًا ومتعمدًا ، فنحن بحاجة إلى استخدام مراقب في كل مرة تحتاج فيها إلى إضافة نمطشيء مثل
مطلوب لكل برنامج نصي يضيف نمطًا قبل
document-end
. هذا ممل.آمل أن يتمكن
GM_addstyle
من فعل ذلك من أجلي ، أو كتابة بعض التحذيرات المفيدة في الويكي ("GM_addstyle غير متاح للنصوص التي تحتوي على @ run-at document-start ، لا تستخدمها ، اعثر على حل بنفسك "، إلخ)