2013-03-30 86 views
13

Tôi đang viết một plugin Chrome có tập lệnh nội dung và tập lệnh nền và tôi đang cố gắng làm cho hai giao tiếp trở nên phổ biến.chrome.runtime.sendMessage không hoạt động như mong đợi

Trong kịch bản nội dung của tôi, tôi đang làm

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

và trong kịch bản nền của tôi, tôi đang làm

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

vẻ biểu hiện của tôi như thế này:

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

Khi tôi chạy plugin của tôi, tôi nhận được lỗi sau:

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

Tôi đã thử đăng nhập chrome.runtime và không có phương pháp sendMessage. Tôi đang sử dụng phiên bản 25.0 của Chromium trên Ubuntu. Tôi đã thử sử dụng sendRequest là tốt, nhưng nó nói nó bị khấu hao và sendMessage nên được sử dụng.

Có ai có thể chỉ cho tôi biết những gì tôi đang thiếu ở đây không? Có bất kỳ quyền nào cần thiết cho việc này để hoạt động không?

Trả lời

34

chrome.runtime.sendMessage/onMessage (và các sự kiện liên quan/các phương pháp khác như connect) đã được giới thiệu trong Chrome 26.

Nếu bạn muốn viết một phần mở rộng đó là tương thích với Chrome 20-25, sử dụng chrome.extension.sendMessage.

Cách để đạt được khả năng tương thích tối ưu là tự xác định các phương pháp chrome.runtime. Ví dụ, chạy đoạn mã sau trước phần còn lại của mã của bạn (nền/nội dung kịch bản):

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

Sau đó, bạn chỉ có thể sử dụng định dạng API mới nhất:

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

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

Nếu bạn cảm thấy không thoải mái với điều chỉnh phương pháp trên đối tượng chrome.runtime, bạn có thể sử dụng các phương pháp sau đây thay:

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

Cảm ơn lot.It làm việc sử dụng chrome.extension.I mỏng k thông tin này bị thiếu trong trang google chrome dev. –

+0

điều này có vẻ tuyệt vời, nhưng phương pháp này vẫn còn hợp lệ cho phiên bản chrome lên đến 31? hoặc nó sẽ cần phải được điều chỉnh? và không ai biết liệu phương pháp truyền thông báo cũ không được chấp nhận đã bị xóa hoàn toàn khỏi phiên bản mới nhất của chrome – user280109

+0

@ user280109 Nó vẫn hợp lệ hay không. Mặc dù bạn cũng có thể chỉ sử dụng 'chrome.runtime.' mà không có bất kỳ lớp tương thích nào, bởi vì hầu như không ai sử dụng Chrome 25 nữa nhờ vào trình cập nhật tự động của Google. –

Các vấn đề liên quan