बैकग्राउंड स्क्रिप्ट से कंटेंट स्क्रिप्ट में और फिर इंजेक्टेड स्क्रिप्ट में संदेश भेजना
समस्या:
पृष्ठभूमि पृष्ठ से सामग्री स्क्रिप्ट और फिर इंजेक्टेड स्क्रिप्ट पर संदेश भेजने का प्रयास करने के बावजूद, प्रक्रिया अपेक्षा के अनुरूप काम करने में विफल रही है। सामग्री स्क्रिप्ट पृष्ठभूमि स्क्रिप्ट से संदेश प्राप्त करने में असमर्थ है।
समाधान:
समस्या सामग्री स्क्रिप्ट को इंजेक्ट करने के तरीके से उत्पन्न होती है। जब कोई एक्सटेंशन लोड किया जाता है, तो यह स्वचालित रूप से सामग्री स्क्रिप्ट को मौजूदा टैब में इंजेक्ट नहीं करता है। इंजेक्शन केवल तब होता है जब एक नया टैब बनाया जाता है या एक्सटेंशन लोड होने के बाद मौजूदा टैब को नेविगेट किया जाता है।
समाधान 1: सशर्त स्क्रिप्ट इंजेक्शन
पृष्ठभूमि और सामग्री के बीच संचार सुनिश्चित करने के लिए स्क्रिप्ट, एक सशर्त स्क्रिप्ट इंजेक्शन को नियोजित किया जा सकता है। पृष्ठभूमि स्क्रिप्ट जाँच सकती है कि टैब संदेश प्राप्त करने के लिए तैयार है या नहीं और सामग्री स्क्रिप्ट को केवल तभी इंजेक्ट कर सकता है जब यह पहले से ही इंजेक्ट नहीं किया गया हो।
कोड:
// 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: दोहरा निष्पादन रोकथाम
एक अन्य समाधान में सामग्री स्क्रिप्ट को टैब में इंजेक्ट करना लेकिन इसके निष्पादन को एक से अधिक बार रोकने के उपायों को लागू करना शामिल है।
कोड:
// 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);
});
}
सामग्री स्क्रिप्ट:
var injected;
if (!injected) {
injected = true;
// Your toplevel code
}
समाधान 3: अंधाधुंध स्क्रिप्ट इंजेक्शन
अंत में, आप एक्सटेंशन आरंभीकरण पर सभी टैब में सामग्री स्क्रिप्ट को इंजेक्ट करना चुन सकते हैं। यह केवल तभी उचित है जब आपकी स्क्रिप्ट कई बार निष्पादित होने पर या पृष्ठ लोड होने के बाद स्वयं में हस्तक्षेप नहीं करती है।
कोड:
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