1

我重新设计了“Clip to DEVONthink”以在 Opera 15+ 中使用。我留下的问题是该扩展仅在浏览器重新启动后才有效。

更新 1:在 Mac OS X 10.9.2 上使用 Opera 21.0.1432.67、Opera Next 22.0.1471.40 和 Google Chrome 35.0.1916.114 进行测试。它们的行为都相同。

更新 2:Opera 自己的消息传递示例具有相同的行为。我的问题是这是否是预期的行为。

manifest.json 中定义了一个后台脚本:

"background": {
  "scripts": [ "main.js" ]
},

和内容脚本:

"content_scripts": [ {
  "js": [ "add_listener.js" ],
  "matches": [ "http://*/*", "https://*/*" ],
}],

...在 chrome.browserAction.onClicked.addListener 的 main.js 中,一条消息被发送到内容脚本以请求页面标题和内容等。

chrome.browserAction.onClicked.addListener(
    function (tab) {
        chrome.tabs.sendMessage(tab.id, {line: 'getdevonthinkurl' }); 
    }
 );

...内容脚本发回一条消息:

chrome.runtime.onMessage.addListener(
    function (request, sender){
        if (request.line=='getdevonthinkurl'){
        chrome.runtime.sendMessage({devonthinkurl:getDEVONthinkURL()});
        }
    }
);

...并且该消息由 main.js 后台脚本接收:

chrome.runtime.onMessage.addListener(
    function (request, sender) {
        if (request.devonthinkurl){
            chrome.tabs.update(sender.tab.id, {"url": request.devonthinkurl});
        }
    }
);

如上所述,它在浏览器重新启动后可以正常工作,但它不明白为什么没有它就无法工作。

有没有人有想法(我可能会补充说我不擅长编程,并且设计中可能存在根本缺陷)?

4

1 回答 1

1

我想到的唯一一件事是您重新加载扩展程序,但是在此步骤之后您并没有刷新注入内容脚本的页面。后台页面有错误吗?我尝试了几次,它对我有用。无论如何,您可以在消息中使用回调,这样更具可读性。

所以 main.js 看起来像:

chrome.browserAction.onClicked.addListener(function (tab) {
    chrome.tabs.sendMessage(tab.id, {line: 'getdevonthinkurl'},
        function(response){
            chrome.tabs.update(tab.id, {'url': request.devonthinkurl});
    }); 
});

并且 add_listener.js 像这样:

chrome.runtime.onMessage.addListener(
    function (request, sender, sendResponse){
        if (request.line=='getdevonthinkurl'){
            sendResponse({devonthinkurl:getDEVONthinkURL()});
        }
    }
 );
于 2014-05-30T08:06:17.643 回答