2015-09-29 3 views
1

Я пытаюсь отправить сообщение из background.js в content.js. addListener в content.js не работает.Расширение Chrome: невозможно передать сообщение content.js

background.js

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) 
{ 
    console.log(tab.url); 
    if(changeInfo.status=="complete"){ 
     chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
      if(tabs.length!=0){ 
       chrome.tabs.sendMessage(tabs[0].id, {message: "sendurl"}, function(response) { 
        console.log(response.url); 
       }); 
      } 
     }); 
     console.log("load complete"); 
    } 
}); 

content.js

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
    if(request.message === "sendurl") { 
     var firstHref = $("a[href^='http']").eq(0).attr("href"); 

     console.log(firstHref); 
     sendResponse({url: firstHref}); 
    } 
    } 
); 

manifest.json

"background": { 
    "scripts": ["background.js"] 
    }, 
    "content_scripts": [ 
    { 
     "matches": ["https://*/","http://*/"], 
     "js": ["jquery-2.1.4.js","enc-base64-min.js","hmac-sha256.js","content.js"] 

    } 
    ], 

После некоторого TME, его дает ошибку: TypeError: Cannot read property 'url' of undefined

+0

Обычно мне проще отправлять сообщения из сценариев контента в фоновый скрипт, а не наоборот. – Teepeemm

ответ

1

Ваш "matches": ["https://*/","http://*/"], определяет только шаблон домена, который означает, что скрипты содержимого вводятся только для основной страницы. Сообщение об ошибке появляется, потому что sendMessage таймаутов через некоторое время, поскольку для получения сообщения не было сценария содержимого.

Как the match pattern documentation говорит:

http://*/* Matches any URL that uses the http scheme

Правильный код будет "matches": ["https://*/*","http://*/*"],

P.S. Используйте the debugger, очень полезно поймать такие ошибки.

Смежные вопросы