2013-03-30 28 views
13

İçerik komut dosyasına ve arka plan komut dosyasına sahip bir Chrome eklentisi yazıyorum ve iki iletişim kurmaya çalışıyorum. Benim İçerik komut olarak chrome.runtime.sendMessage beklendiği gibi çalışmaz

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

ve benim arka plan komut

yapıyorum, böyle
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"}); 
    } 
); 

Benim apaçık görünüyor

yapıyorum:

{ 
    "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"] 
} 

zaman I Eklentimi çalıştır, aşağıdaki hatayı alıyorum:

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

chrome.runtime günlüğünü kaydetmeyi denedim ve sendMessage yönteminin hiçbir yöntemi yoktu. Ubuntu'daki 25.0 sürümünde Chromium kullanıyorum. Ben de sendRequest kullanmayı denedim, ancak amortismana tabi tutuldu ve sendMessage kullanılmalıdır dedi.

Burada neyim eksik olduğumu işaret edebilir mi? Bunun çalışması için gerekli izinler var mı? 25 chrome.extension.sendMessage kullanmak - Chrome'a ​​20 ile uyumlu olan bir uzantı yazmak istiyorsanız

cevap

34

chrome.runtime.sendMessage/onMessage (örneğin connect olarak ve diğer ilgili olaylar/yöntemleri)

Chrome 26'da tanıtıldı.

En uygun uyumluluğu elde etmenin bir yolu, chrome.runtime yöntemlerini kendiniz tanımlamaktır. Eğer değiştirerek hoşnut değilseniz

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

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

:

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; 
} 

Sonra sadece son API biçimini kullanabilirsiniz: Örneğin, kod (arka plan/içerik script) geri kalanından önce aşağıdaki kodu çalıştırın bir lot.It chrome.extension.I ince kullanarak çalıştı

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

Teşekkür: chrome.runtime nesne üzerinde yöntemleri, aşağıdaki yaklaşımı yerine kullanabilirsiniz k bu bilgi google chrome dev sayfalarında eksik. –

+0

bu harika görünüyor, ancak bu metodoloji 31'e kadar krom versiyonları için hala geçerli mi? ya da adapte edilmeli mi? ve eski kullanımdan kaldırılan iletme yöntemlerinin tümüyle son sürüm chrome – user280109

+0

@ user280109'dan kaldırılıp kaldırılmadığını herkes bilmiyor mu? Ayrıca, herhangi bir uyumluluk katmanı olmadan da chrome.runtime.' işlevini kullanabilmenize rağmen, Google'ın otomatik güncellemesi sayesinde hiç kimse Chrome 25'i kullanmıyor. –

İlgili konular