

chromeで以下の処理を行うアドオンを作成しようとしています。

  1. popup.htmlにあるテキストエリアに文字列を入力(改行区切りで複数入力可)し、送信ボタンを押下
  2. popup.jsでボタン押下をキャッチし、フォームに入力された値を配列にしてcontent.jsに渡す
  3. content.jsでアクティブタブ内にあるテーブルの3列目を検索し、入力された文字列を一致するものを探す
  4. 検索終了後、結果をアラートで表示

各ファイルのコードは以下の通りです。

  * manifest.json
[code]      {

       "name": "test",
       "version": "0.0.2",
       "manifest_version": 2,
       "description": "test",
       "icons": {
               "16": "img/icon_16.png"
             },
       "browser_action": {
         "default_icon": "img/icon_16.png",
         "default_title": "test",
         "default_popup" : "popup.html"  
       },
       "content_scripts": [
         {
           "matches": ["https://*/*"],
           "js": ["js/jquery-2.1.1.min.js", "js/content.js"],
           "run_at": "document_end"
         }
       ],
       "permissions": [
         "tabs"
       ]
     } 
    
[/code]

  * popup.js
[code]      $(document).ready(function() {

       chrome.tabs.query({active:true}, function(tab) {
         $('#do_action').click(function(e) {
           e.preventDefault();
    
           var list = "";
    
           list = $("[name='list']").val();
           if(list == ""){
             alert("文字をテキストエリアに入れてください。");
             return false;
           }
    
           var list_array = list.split("\n");
    
           chrome.tabs.sendMessage(tab[0].id, {list: list_array}, function(response){
             alert(response.result);
           });
         });
       });
     });
    
[/code]

  * content.js
[code]      chrome.runtime.onMessage.addListener(function(request, sender,
sendResponse) {

       var hit_datas = [];
       var send_mes = "";
       $.each(request.list, function() {
         var search_value = this;
         $('tr').each(function(){
           if($('td',this).eq(2).text() == search_value){
               hit_datas.push(search_value + "が見つかりました。");
             }
           }
         });
       });
    
       if(hit_datas.length != 0){
         send_mes = hit_datas.join("\n");
       }else{
         send_mes = "一致する情報は有りませんでした。";
       }
       sendResponse({result: send_mes});
     });
    
[/code]

popup.htmlにはdo_actionというidを振ったボタンと、listという名前を付けたテキストエリア、そしてpopup.jsを読み込む記述が書いてあります。

上記の内容で実行すると、popup.jsの『alert(response.result);』の部分で  
extensions::uncaught_exception_handler:8 Error in event handler for (unknown):
TypeError: Cannot read property 'result' of undefined  
というエラーが発生してしまいます。

色々調べてみたのですが、自力で解決できませんでした。  
どうかよろしくお願いいたします。


CC BY-SA 3.0
2016-08-15T12:01:51.887
28285
2016-09-04T07:11:33.850
18476
question
google-chrome chrome-extension
chrome.tabs.sendMessageの返り値がundefinedになる


> 上記の内容で実行すると、popup.jsの『alert(response.result);』の部分で  
>  extensions::uncaught_exception_handler:8 Error in event handler for
> (unknown): TypeError: Cannot read property 'result' of undefined  
>  というエラーが発生してしまいます。

引数なしでコールバック関数が呼び出される（つまり、 response 引数値が `undefined`
になる）ということは、何かしらのエラーが発生していることを示しています。その原因は、 `chrome.runtime.lastError`
に入っているはずなので、その lastError の内容を確認してみてください。原因がわかると思います。


CC BY-SA 3.0
2016-09-04T07:11:33.850
28677
2016-09-04T07:11:33.850
531
28285
answer