javascript - क्रोम एक्सटेंशन कोड बनाम सामग्री स्क्रिप्ट बनाम इंजेक्शन स्क्रिप्ट्स



google-chrome-extension scope (1)

जब भी कोई नया पृष्ठ लोड होता है, तो मैं फ़ंक्शन init() को चलाने के लिए अपना क्रोम एक्सटेंशन प्राप्त करने का प्रयास कर रहा हूं, लेकिन मुझे यह समझने में समस्या हो रही है कि यह कैसे करें। जो मैं समझता हूं, मुझे पृष्ठभूमि.html में निम्न कार्य करने की आवश्यकता है:

  1. पृष्ठ बदलते समय जांचने के लिए chrome.tabs.onUpdated.addListener() का उपयोग करें
  2. एक स्क्रिप्ट चलाने के लिए chrome.tabs.executeScript का उपयोग करें।

यह मेरे पास कोड है:

//background.html
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    chrome.tabs.executeScript(null, {code:"init();"});
});

//script.js
function init() {
    alert("It works!");
}

मैं यह भी सोच रहा हूं कि init () फ़ंक्शन के पास अन्य जेएस फ़ाइलों में स्थित मेरे अन्य कार्यों तक पहुंच होगी?


क्रोम एक्सटेंशन में जावास्क्रिप्ट कोड को निम्न समूहों में विभाजित किया जा सकता है:

  • एक्सटेंशन कोड - सभी अनुमत chrome.* तक पूर्ण पहुंच chrome.* एपीआई।
    इसमें पृष्ठभूमि पृष्ठ , और सभी पेज जिनके पास chrome.extension.getBackgroundPage() जैसे ब्राउज़र पॉप-अप के माध्यम से सीधे पहुंच है।

  • सामग्री स्क्रिप्ट (मैनिफेस्ट फ़ाइल या chrome.tabs.executeScript माध्यम से) - कुछ chrome एपीआई के लिए Partial पहुंच , पृष्ठ के डोम तक पूर्ण पहुंच (फ्रेम window सहित किसी भी window ऑब्जेक्ट में नहीं)।
    सामग्री स्क्रिप्ट एक्सटेंशन और पृष्ठ के बीच एक दायरे में चलती हैं। सामग्री स्क्रिप्ट का वैश्विक window ऑब्जेक्ट पृष्ठ / एक्सटेंशन के वैश्विक नामस्थान से अलग है।

  • इंजेक्शन स्क्रिप्ट ( इस विधि के माध्यम से सामग्री स्क्रिप्ट में) - पृष्ठ में सभी गुणों तक पूर्ण पहुंच। chrome.* से किसी भी तक पहुंच नहीं chrome.* एपीआई।
    इंजेक्शन स्क्रिप्ट इस तरह व्यवहार करते हैं जैसे कि वे पृष्ठ द्वारा स्वयं शामिल किए गए थे, और विस्तार से किसी भी तरह से जुड़े नहीं हैं। विभिन्न इंजेक्शन विधियों पर अधिक जानकारी जानने के लिए इस पोस्ट को देखें।

इंजेक्शन स्क्रिप्ट से सामग्री स्क्रिप्ट पर एक संदेश भेजने के लिए, घटनाओं का उपयोग किया जाना चाहिए। एक उदाहरण के लिए यह जवाब देखें। नोट: एक संदर्भ से दूसरे संदर्भ में एक एक्सटेंशन के भीतर भेजा गया संदेश स्वचालित रूप से (जेएसओएन) -सार्मीकृत और पार्स किया जाता है

आपके मामले में, पृष्ठभूमि पृष्ठ ( chrome.tabs.onUpdated ) में कोड संभावित रूप से सामग्री स्क्रिप्ट script.js का मूल्यांकन करने से पहले कहा जाता है। तो, आपको एक ReferenceError init मिलेगी, क्योंकि init नहीं है।

साथ ही, जब आप chrome.tabs.onUpdated उपयोग chrome.tabs.onUpdated , तो सुनिश्चित करें कि आप परीक्षण करते हैं कि पृष्ठ पूरी तरह से लोड हो गया है, क्योंकि ईवेंट दो बार आग लगता है: लोड से पहले, और खत्म होने पर:

//background.html
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if (changeInfo.status == 'complete') {
        // Execute some script when the page is fully (DOM) ready
        chrome.tabs.executeScript(null, {code:"init();"});
    }
});




content-script