2017-06-02 36 views
1

我試圖做一個簡單的擴展。如果有人能幫忙,我會很高興。sendMessage不能在擴展中使用

目標:當您單擊擴展彈出式菜單(popup.html)中的按鈕時,當前網頁的標題以div(ID爲'div1')顯示。

問題:我搜索了互聯網做這個,發現傳遞消息可以用來實現相同。所以我試了一下。但它不工作。我想知道哪裏出了問題。

狀態:

=擴展被成功導入的鉻。

=當單擊擴展圖標時,會顯示正確的彈出窗口。

=當按鈕被點擊時什麼也沒有發生。

=開發者控制檯顯示沒有錯誤。

文件:

=====================================

//manifest.json 
    { 
     "manifest_version": 2, 
     "name": "some_name_extension", 
     "version": "0.0.1", 
     "content_scripts": [ 
     { 
      "matches": [ 
      "<all_urls>" 
      ], 
      "js": ["jquery-3.2.1.js", "content_script.js"] 
     } 
     ], 
     "browser_action": { 
     "default_icon": "icon.png", 
     "default_popup": "popup.html" 
     } 
    } 

=====================================

<!-- popup.html --> 
<! doctype html> 
<html> 
<head> 
    <title> 
    </title> 
    <script type="text/javascript" src="popup.js"> 
    </script> 
    <style> 
     html 
     { 
      height: 200; 
      width: 200; 
     } 
    </style> 
</head> 
<body> 
    <button id="btn1"> 
     click me! 
    </button> 
    <div id="div1"> 
     (title will be displayed here) 
    </div> 
</body> 
</html> 

=====================================

//content_script.js 
document.addEventListener('DOMContentLoaded', function() { 
var title1=document.getElementsByTagName("title")[0].innerHTML; 

chrome.extension.onMessage.addListener(

function(msg, sender, sendResponse) { 
    if(sender=="popup") 
    { 
     chrome.extension.sendMessage(title1,"content","1"); 
    } 
    }); 
}); 

=====================================

//popup.js 
document.addEventListener('DOMContentLoaded', function() { 
    var mainBtn = document.getElementById('btn1'); 
    mainBtn.addEventListener('click', function() { 
     chrome.extension.sendMessage("button_clicked","popup","1"); 
    }); 

    chrome.extension.onMessage.addListener(

    function(msg, sender, sendResponse) { 
     if(sender=="content") 
     { 
      document.getElementById("div1").innerHTML=msg; 
     } 
    } 
    ); 
}); 

=== ==================================

鏈接到jQuery腳本文件:https://code.jquery.com/jquery-3.2.1.js

+1

它是'getElementsByTagName'(複數)而不是'getElementByTagName' – Andreas

+0

謝謝@Andreas!我做了更正。但它不能解決我的問題:( –

回答

0
  1. sender是由瀏覽器自動設置的對象,不是您可以自己傳遞的字符串。使用devtools調試器通過在回調中設置斷點來檢查代碼和變量,不要盲目地編寫代碼。
  2. 在這種情況下,不需要檢查sender,因爲內容腳本無論如何都不能互相發送消息。
  3. 從彈出將消息發送到一個內容腳本的正確的方法是chrome.tabs.sendMessagetabId作爲第一個參數:

    chrome.tabs.query({active: true, currentWindow: true}, ([tab]) => { 
        chrome.tabs.sendMessage(tab.id, { 
        action: 'setTitle', 
        title: title1, 
        }); 
    }); 
    
  4. 要一次使用一個對象發送許多值:{action: 'setTitle', title: title1}{action: 'buttonClicked', data: 1}等上。

  5. chrome.extension已經廢棄了的消息,使用chrome.runtime
  6. 您的代碼不使用jQuery,所以沒有必要在清單注入它。json
+0

非常感謝@wOxxOm!但是我不得不使用響應函數來得到另一端的答案。有沒有辦法做到這一點? 意味着如何接收chrome.tabs.query({active:true,currentWindow:true},([tab])=> { } , title:title1, }); }); –

+0

@ N_X41什麼是「響應函數」?爲什麼使用它是一個問題?在內容腳本中已經有onMessage監聽器了。網頁,因爲內容腳本在重新加載擴展時不會自動重新注入。 – wOxxOm

+0

這是如何回覆回覆。 (0).id,{action:'setTitle', title:title1,},功能(響應){ //做出響應 }); }); 。有沒有問題,只是想知道,你建議什麼方法。反正它現在工作正常!感謝您指向正確的方向;) –