إرسال رسالة من برنامج نصي في الخلفية إلى برنامج نصي للمحتوى، ثم إلى برنامج نصي مُدخل
المشكلة:
على الرغم من محاولة إرسال رسائل من صفحة الخلفية إلى برنامج نصي للمحتوى ثم إلى برنامج نصي تم إدخاله، إلا أن العملية فشلت في العمل على النحو المنشود. البرنامج النصي للمحتوى غير قادر على تلقي رسائل من البرنامج النصي في الخلفية.
الحل:
تنشأ المشكلة من الطريقة التي يتم بها إدخال البرامج النصية للمحتوى. عندما يتم تحميل ملحق، فإنه لا يقوم تلقائيًا بإدخال البرامج النصية للمحتوى في علامات التبويب الموجودة. يحدث الحقن فقط عند إنشاء علامة تبويب جديدة أو التنقل في علامة تبويب موجودة بعد تحميل الامتداد.
الحل 1: حقن البرنامج النصي الشرطي
لضمان التواصل بين الخلفية والمحتوى البرامج النصية، يمكن استخدام حقن البرنامج النصي المشروط. يمكن للبرنامج النصي في الخلفية التحقق مما إذا كانت علامة التبويب جاهزة لتلقي الرسائل وإدخال البرنامج النصي للمحتوى فقط إذا لم يتم إدخاله بالفعل.
Code:
// Background script
function ensureSendMessage(tabId, message, callback) {
chrome.tabs.sendMessage(tabId, { ping: true }, function (response) {
if (response && response.pong) { // Content script ready
chrome.tabs.sendMessage(tabId, message, callback);
} else { // No listener on the other end
chrome.tabs.executeScript(tabId, { file: "content_script.js" }, function () {
if (chrome.runtime.lastError) {
console.error(chrome.runtime.lastError);
throw Error("Unable to inject script into tab " tabId);
}
// OK, now it's injected and ready
chrome.tabs.sendMessage(tabId, message, callback);
});
}
});
}
النص البرمجي للمحتوى:
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
if (request.ping) {
sendResponse({ pong: true });
return;
}
// Content script action
});
الحل 2: منع التنفيذ المزدوجيتضمن الحل الآخر إدخال نص المحتوى في علامة التبويب مع تنفيذ تدابير لمنع تنفيذه أكثر من مرة.
الكود:
// نص الخلفية وظيفة التأكدSendMessage(tabId, message, callback) { chrome.tabs.executeScript(tabId, { ملف: "content_script.js" }, الوظيفة () { إذا (chrome.runtime.lastError) { console.error(chrome.runtime.lastError); throw Error("غير قادر على إدخال البرنامج النصي في علامة التبويب" tabId); } // حسنًا، لقد تم حقنه وأصبح جاهزًا chrome.tabs.sendMessage(tabId, message, callback); });// Background script
function ensureSendMessage(tabId, message, callback) {
chrome.tabs.executeScript(tabId, { file: "content_script.js" }, function () {
if (chrome.runtime.lastError) {
console.error(chrome.runtime.lastError);
throw Error("Unable to inject script into tab " tabId);
}
// OK, now it's injected and ready
chrome.tabs.sendMessage(tabId, message, callback);
});
}
النص البرمجي للمحتوى: تم حقنه ؛ إذا (! حقن) { حقن = صحيح؛ // رمز المستوى الأعلى الخاص بك
// Background script
function ensureSendMessage(tabId, message, callback) {
chrome.tabs.executeScript(tabId, { file: "content_script.js" }, function () {
if (chrome.runtime.lastError) {
console.error(chrome.runtime.lastError);
throw Error("Unable to inject script into tab " tabId);
}
// OK, now it's injected and ready
chrome.tabs.sendMessage(tabId, message, callback);
});
}
الحل 3: إدخال البرنامج النصي العشوائي أخيرًا، يمكنك اختيار إدخال البرنامج النصي للمحتوى في جميع علامات التبويب عند تهيئة الامتداد. يُنصح بهذا فقط إذا كان البرنامج النصي الخاص بك لا يتداخل مع نفسه عند تنفيذه عدة مرات أو بعد تحميل الصفحة.
chrome.tabs الاستعلام ({}، الوظيفة (علامات التبويب) { لـ (var i في علامات التبويب) { // قم بالتصفية حسب عنوان URL إذا لزم الأمر chrome.tabs.executeScript(tabs[i].id, { file: "content_script.js" }, function () { // الآن يمكنك استخدام المراسلة العادية }); } });
chrome.tabs.query({}, function (tabs) {
for (var i in tabs) {
// Filter by URL if needed
chrome.tabs.executeScript(tabs[i].id, { file: "content_script.js" }, function () {
// Now you can use normal messaging
});
}
});
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3