2013-03-30 18 views
13

मैं सामग्री स्क्रिप्ट और पृष्ठभूमि स्क्रिप्ट के साथ क्रोम प्लगइन लिख रहा हूं, और मैं दो संवाद करने की कोशिश कर रहा हूं।chrome.runtime.sendMessage अपेक्षित काम नहीं कर रहा है

मेरी सामग्री स्क्रिप्ट में, मैं

chrome.runtime.sendMessage({greeting: "hello"}, function(response) { 
     console.log(response.farewell); 
}); 

और मेरी पृष्ठभूमि लिपि में कर रहा हूँ, मैं इस तरह

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
     console.log(sender.tab ? 
      "from a content script:" + sender.tab.url : 
      "from the extension"); 
     if (request.greeting == "hello") 
      sendResponse({farewell: "goodbye"}); 
    } 
); 

मेरे प्रकट दिखता कर रहा हूँ:

{ 
    "manifest_version": 2, 
    "name": "Tesing Phase", 
    "version": "1.0", 
    "background": { 
     "persistent": false, 
     "scripts": ["bgscript.js"] 
    }, 
    "content_scripts": [{ 
     "js": ["contentscript.js"], 
     "all_frames": true, 
     "run_at" : "document_start", 
     "matches": ["*://*/*"] 
    }], 
    "web_accessible_resources": ["script.js"] 
} 

जब मैं मेरी प्लगइन चलाएं, मुझे निम्न त्रुटि मिलती है:

Uncaught TypeError: Object #<Object> has no method 'sendMessage' 

मैंने chrome.runtime लॉगिंग करने का प्रयास किया, और sendMessage कोई विधि नहीं थी। मैं उबंटू पर क्रोमियम के संस्करण 25.0 का उपयोग कर रहा हूं। मैंने sendRequest का उपयोग करने की कोशिश की, लेकिन यह कहा गया कि यह अवमूल्यन है और sendMessage का उपयोग किया जाना चाहिए।

क्या कोई मुझे बता सकता है कि मैं यहां क्या खो रहा हूं? क्या इसके लिए काम करने के लिए कोई अनुमति की आवश्यकता है?

उत्तर

34

chrome.runtime.sendMessage/onMessage (और अन्य संबंधित घटनाओं/इस तरह के connect के रूप में विधि) क्रोम 26.

में पेश किए गए आप एक एक्सटेंशन जो संगत है क्रोम 20 के साथ लिखने के लिए चाहते हैं - 25, chrome.extension.sendMessage का उपयोग करें।

इष्टतम संगतता प्राप्त करने का एक तरीका chrome.runtime विधियों को स्वयं परिभाषित करना है।

if (!chrome.runtime) { 
    // Chrome 20-21 
    chrome.runtime = chrome.extension; 
} else if(!chrome.runtime.onMessage) { 
    // Chrome 22-25 
    chrome.runtime.onMessage = chrome.extension.onMessage; 
    chrome.runtime.sendMessage = chrome.extension.sendMessage; 
    chrome.runtime.onConnect = chrome.extension.onConnect; 
    chrome.runtime.connect = chrome.extension.connect; 
} 

तो फिर तुम सिर्फ नवीनतम एपीआई स्वरूप का उपयोग कर सकते हैं::

// Bind event: 
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { 
    // Do something 
}); 

// Send message: 
chrome.runtime.sendMessage({greeting: 'hello'}); 

आप को संशोधित करने के साथ असहज महसूस करते हैं उदाहरण के लिए, अपने कोड (पृष्ठभूमि/सामग्री स्क्रिप्ट) के आराम करने से पहले निम्न कोड को चलाने

var runtimeOrExtension = chrome.runtime && chrome.runtime.sendMessage ? 
         'runtime' : 'extension'; 

// Bind event: 
chrome[runtimeOrExtension].onMessage.addListener(
    function(message, sender, sendResponse) { 
    // Do something 
}); 

// Send message: 
chrome[runtimeOrExtension].sendMessage({greeting: 'hello'}); 
+2

धन्यवाद एक lot.It chrome.extension.I पतली का उपयोग कर काम किया: chrome.runtime वस्तु पर तरीकों, आप निम्नलिखित दृष्टिकोण बजाय उपयोग कर सकते हैं k यह जानकारी Google क्रोम देव पृष्ठों में अनुपलब्ध है। –

+0

यह बहुत अच्छा लग रहा है, लेकिन क्या यह पद्धति अभी भी 31 तक क्रोम संस्करणों के लिए मान्य है? या इसे अनुकूलित करने की आवश्यकता होगी? और क्या किसी को पता है कि पुराने बहिष्कृत संदेश पास करने के तरीकों को क्रोम – user280109

+0

@ user280109 के नवीनतम संस्करण से पूरी तरह से हटा दिया गया है, यह अभी भी मान्य है। यद्यपि आप किसी भी संगतता परतों के बिना 'chrome.runtime.' का उपयोग भी कर सकते हैं, क्योंकि शायद ही कोई भी क्रोम 25 का उपयोग करता है- Google के ऑटो-अपडेटर के लिए और भी धन्यवाद। –

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