2012-03-28 19 views
47

जब भी कोई नया पृष्ठ लोड होता है तो मैं init() फ़ंक्शन चलाने के लिए अपना क्रोम एक्सटेंशन प्राप्त करने का प्रयास कर रहा हूं, लेकिन मुझे यह समझने में समस्या हो रही है कि यह कैसे करें। से क्या मैं समझता हूँ, मैं background.html में निम्नलिखित कार्य करने होंगे: जब पेज उपयोग chrome.tabs.executeScript बदल क्रोम एक्सटेंशन कोड बनाम सामग्री स्क्रिप्ट बनाम इंजेक्शन स्क्रिप्ट

  • एक स्क्रिप्ट चलाने के लिए है

    1. उपयोग chrome.tabs.onUpdated.addListener() जाँच करने के लिए।

    यह है कोड मैं:

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

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

  • उत्तर

    142

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

    • एक्सटेंशन कोड - सभी के लिए पूर्ण पहुंच chrome.* एपीआई की अनुमति दी।
      इसमें background page शामिल हैं, और सभी पृष्ठ जिनके पास chrome.extension.getBackgroundPage(), browser pop-ups जैसे सीधे पहुंच है।

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

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

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


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

    इसके अलावा

    , जब आप 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();"}); 
        } 
    }); 
    
    +0

    'क्रोम के बारे में टिप के लिए धन्यवाद .tabs.on अद्यतन 'दो बार फायरिंग। तो मेरा सवाल है कि मुझे लगता है कि मैं 'init() 'इंजेक्ट कैसे करूं? क्या मुझे अपने सभी जावाScripts इंजेक्ट करना चाहिए? 'init() 'सामान्य रूप से तब कॉल किया जाता है जब उपयोगकर्ता ब्राउज़र एक्शन आइकन पर क्लिक करता है, और' init() 'अन्य कार्यों का एक समूह ट्रिगर करता है। – Jon

    +1

    @ user1277607 जब इसे किसी भी पृष्ठ के वैश्विक चर का उपयोग करना होता है, तो स्क्रिप्ट को इंजेक्ट करें। जब 'फ़ंक्शन init' को पृष्ठ और एक्सटेंशन कोड दोनों तक पहुंच प्राप्त होती है, तो सामग्री स्क्रिप्ट का उपयोग करें। ** [लिंक किए गए उत्तर] देखें (http://stackoverflow.com/a/9517879/938089?building-a-chrome-extension-inject-code-in-a-page-using-a-content-script) * * स्क्रिप्ट को इंजेक्ट करने के तरीके को देखने के लिए, और ** [यह उत्तर] (http://stackoverflow.com/a/9636008/938089?chrome-extension-retrieving-gmails-original-message) ** लागू करने पर दिशानिर्देश के लिए सामग्री स्क्रिप्ट जिसे पृष्ठ के चर का उपयोग करना है। –

    +0

    आपको बहुत बहुत धन्यवाद। यह खूबसूरती से काम किया :) – Jon

    संबंधित मुद्दे