Greasemonkey: يعد document.head فارغًا عند @ run-at document-start

تم إنشاؤها على ١٥ يونيو ٢٠١٧  ·  9تعليقات  ·  مصدر: greasemonkey/greasemonkey

بيئة

مفتاح | قيمة
- | -
منصة النظام | 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

التعليق الأكثر فائدة

@ 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 ، لا تستخدمها ، اعثر على حل بنفسك "، إلخ)

ال 9 كومينتر

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 على الإطلاق ، ويجب تشغيلها في أسرع وقت ممكن.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات