2014-01-15 2 views
17

Я прочитал документацию о том, как это сделать. Отправить сообщение Из файла javascript (main.js) в Content Script (content.js), но я не могу получить onMessage чтобы открыть мое предупреждение.Расширение Chrome Отправить сообщение From Background.js в Content Script

manifest.json

{ 
    "name": "Example", 
    "version": "1.0.1", 
    "manifest_version" : 2, 
    "description": "Example Description", 
    "background" : { 
    "scripts" : ["main.js"] 
    }, 
    "page_action" : { 
     "default_icon": { 
     "19": "icons/19.png", 
     "38": "icons/38.png" 
     }, 
     "default_title" : "Example Title" 
    }, 
    "content_scripts": [{ 
     "matches": ["<all_urls>"], 
     "js": ["lib/jquery-1.8.3.min.js","scripts/content.js"], 
     "run_at": "document_idle", 
     "all_frames": false 
    }], 
    "permissions": [ 
     "tabs", 
     "geolocation" 
    ], 
    "icons": { 
     "16": "icons/16.png", 
     "48": "icons/48.png", 
     "128": "icons/48.png" 
    } 

} 

фона файла JavaScript (main.js)

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 
    chrome.tabs.sendMessage(tabs[0].id, {action: "SendIt"}, function(response) {}); 
}); 

Содержимое файла JavaScript (content.js)

chrome.extension.onMessage.addListener(function(msg, sender, sendResponse) { 
    if (msg.action == 'SendIt') { 
     alert("Message recieved!"); 
    } 
}); 
+0

Я думаю, вам нужно вызвать его из ваших [popup.js и не из фона] (http://stackoverflow.com/q/11752341/ 1757620) –

+4

Я предполагаю, что фон отправляет сообщение до загрузки скрипта содержимого. Не могли бы вы использовать onclick вашего действия для отправки сообщения? – Teepeemm

+1

Догадка Teepeem очень разумная. Отображен ли код выше всего в 'background.js'? Если нет, то какие триггеры отправляют сообщение на вкладку? – gkalpak

ответ

12

Благодаря проницательности @Teepeemm я включил завершение загрузки вкладки перед отправкой сообщения в сценарий содержимого.

ОЖИДАНИЕ TAB полностью загружены

chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {   
    if (changeInfo.status == 'complete') { 
     chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 
     chrome.tabs.sendMessage(tabs[0].id, {action: "SendIt"}, function(response) {}); 
     }); 
    } 
}); 
+1

Будущие программисты, которые находят это, должны знать, что вы не должны использовать действие страницы, чтобы что-то делать на каждой странице, как только она будет загружена; сценарий действия браузера или контент-скрипт будет лучше в этом отношении. Но я полагаю, что в вашем случае у вас есть сверхактивное действие страницы, потому что это то, чем закончил ваш SSCCE. – Teepeemm

+2

Спасибо @Tyler Rafferly, это сработало для меня. –

0

Sidenote: chrome.extension.onMessage устарел, вы должны использовать chrome.runtime.onMessage - хотя я не верю, что это решит вашу проблему.

Я помню, что у меня была проблема с инъекционным мини-файлом jquery с использованием скриптов контента. Попробуйте использовать неинфицированную версию (например, jquery-1.8.3.js). Как только вы это сделаете, добавьте jquery-1.8.3.js в web_accessible_resources в файл манифеста. (Читайте об этом here)

Если это все еще не работает, моим последним предложением было бы добавить "<all_urls>" в массив разрешений в манифесте.

+0

+1 для указания правильного 'chrome.runtime.onMessage'. -1 для того, чтобы сказать, что это не решит проблему (если это будет зависеть от других вещей, но это не так) -1 для предложения мини-версии вызовет проблему (может быть проблема, если исходные карты отсутствуют, но это другая история) -5 для предложения 'web_accessible_resources', который не имеет ничего общего с проблемой -10 для предложения' '!Совершенно несвязанная и большая ошибка безопасности! – gkalpak

0

Если у вас есть сценарий, сообщающий о его присутствии (я предпочитаю console.log - alert), вы увидите, что фоновый скрипт запускается один раз (при установке или запуске), в то время как скрипт содержимого работает с каждой новой страницей. Это означает, что вы хотите, чтобы какое-то внешнее событие вызывало это сообщение. Что-то вроде

chrome.pageAction.onClicked.addListener(function(tab) { 
    chrome.tabs.sendMessage(tab.id,{action:"SendIt"}); 
}); 

И не забудьте позвонить chrome.pageAction.show(tabId); в зависимости от обстоятельств.

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