【问题标题】:Chrome extension - sendMessage doesn't work unless directly below listen function?Chrome 扩展 - 除非直接在监听功能下方,否则 sendMessage 不起作用?
【发布时间】:2014-03-16 21:44:59
【问题描述】:

我在从 background.js 页面向 content.js 页面发送响应时遇到问题。

在我的 content.js 页面上,我有:

chrome.runtime.sendMessage({auth: 'test'}, function(response){
     console.log(response.auth);
});

在我的 background.js 页面上,我有:

chrome.runtime.onMessage.addListener(function(request,sender,sendResponse){

  if(request.addressToCopy){
        copy(request.addressToCopy);
    }

    if(request.auth == 'test'){
        chrome.storage.local.get(['access_token', 'refresh_token'], function(results){
            $.get('https://coinbase.com/api/v1/account/balance', {access_token: results['access_token']}, function(data){
                sendResponse({auth: 'pass!'});
            }).fail(function(){
                sendResponse({auth: 'fail!'});

            });
        }); 
    }
});

我的问题是:sendResponse 在上面的代码中不起作用。我不会得到任何错误,只是 content.js 不会 console.log 任何东西。如果我将 sendResponse 放在 if 语句之外(因此它直接是 onMessage.addListener 的子项)它可以工作,我的 content.js 脚本将输出“通过”或“失败”。但它不会像我一样工作。这是为什么呢?

【问题讨论】:

标签: jquery ajax google-chrome-extension


【解决方案1】:

在调用 sendResponse 之前,您必须在事件侦听器中返回 true 以保持消息通道对内容脚本开放。返回 true 表示将异步发送响应

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
     ...
     $.get(url, payload, function(data) {
          sendResponse(response)
     })
     return true;
});

【讨论】:

    猜你喜欢
    • 2014-06-01
    • 2023-03-13
    • 1970-01-01
    • 2015-06-28
    • 2013-03-12
    • 2017-08-23
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    相关资源
    最近更新 更多