"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية إصلاح أخطاء \"تم إبطال سياق الإضافة\" الناتجة عن البرامج النصية للمحتوى المعزول في ملحقات Chrome؟

كيفية إصلاح أخطاء \"تم إبطال سياق الإضافة\" الناتجة عن البرامج النصية للمحتوى المعزول في ملحقات Chrome؟

تم النشر بتاريخ 2024-11-08
تصفح:156

How to Fix \

كيفية إزالة البرنامج النصي المعزول بعد تحديث ملحق Chrome

المشكلة

يمكن أن تؤدي إعادة تحميل ملحق Chrome عن غير قصد، وخاصة تلك الموجودة في وضع المطور، إلى إنشاء محتوى معزول مخطوطات. تظل هذه البرامج النصية قيد التشغيل في الخلفية ولكنها تفقد الاتصال ببقية الامتداد، مما يؤدي إلى حدوث أخطاء مثل "تم إبطال سياق الامتداد" و"runtime.lastError الذي لم يتم التحقق منه".

الحل

اليتيم لا يزال بإمكان البرنامج النصي للمحتوى تلقي رسائل DOM. لإزالته:

1. إرسال رسالة من البرنامج النصي للمحتوى الجديد:

  • في البرنامج النصي الجديد للمحتوى العامل، أرسل رسالة إلى البرنامج النصي المعزول باستخدام window.dispatchEvent.
  • استخدم معرف رسالة فريد ، مثل orphanMessageId.

2. إلغاء تسجيل المستمعين في البرنامج النصي المعزول:

  • في البرنامج النصي المعزول، حدد مستمعًا لـ orphanMessageId.
  • ضمن هذا المستمع، قم بإلغاء تسجيل جميع المستمعين السابقين وقم بإبطال المتغيرات العامة.
  • هذا يجعل البرنامج النصي القديم مؤهلاً لجمع البيانات المهملة.

3. البرنامج النصي للخلفية:

  • إعادة إدخال البرنامج النصي للمحتوى عند إعادة تحميل/تثبيت الامتداد.

4. المحتوى النصي:

  • استخدم الوظائف المسماة لمستمعي الأحداث للحفاظ على مراجعهم.
  • قم بتعيين خاصية window.running للإشارة إلى مثيل نشط.
  • عند استلام معرف الرسالة اليتيم، قم بإلغاء تسجيل المستمعين ووضع علامة على البرنامج النصي على أنه يتيم.

5. البرنامج النصي المنبثق:

  • تحقق من وجود برنامج نصي لمحتوى صالح قبل إرسال الرسائل.
  • استخدم ضمان المحتوى لضمان إدخال البرنامج النصي.

مثال للكود:

background.js:

// Re-inject content script
chrome.runtime.onInstalled.addListener(() => {
  chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
    chrome.tabs.executeScript(tabs[0].id, { file: 'content.js' });
  });
});

content.js:

// Orphaned script detection and cleanup
var orphanMessageId = chrome.runtime.id   'orphanCheck';
window.dispatchEvent(new Event(orphanMessageId));
window.addEventListener(orphanMessageId, unregisterOrphan);

// Register named listeners
chrome.runtime.onMessage.addListener(onMessage);
document.addEventListener('mousemove', onMouseMove);

// Orphan flag and cleanup function
window.running = true;

function unregisterOrphan() {
  if (chrome.runtime.id) {
    // Not orphaned
    return;
  }
  window.removeEventListener(orphanMessageId, unregisterOrphan);
  document.removeEventListener('mousemove', onMouseMove);
  try {
    chrome.runtime.onMessage.removeListener(onMessage);
  } catch (e) {}
  return true;
}

popup.js:

وظيفة غير متزامنة sendMessage(data) { const [tab] = انتظار chrome.tabs.query({ active: true,currentWindow: true }); إذا (في انتظار ضمانContentScript(tab.id)) { العودة في انتظار chrome.tabs.sendMessage(tab.id, data); } } وظيفة غير متزامنة تأكدContentScript(tabId) { يحاول { const [{ result }] = انتظار chrome.scripting.executeScript({ الهدف: { معرف علامة التبويب }، func: () => window.running === صحيح، }); إذا (! النتيجة) { في انتظار chrome.scripting.executeScript({ الهدف: { معرف علامة التبويب }، الملفات: ['content.js']، }); } عودة صحيحة؛ } قبض (ه) {}
            
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3