gpt4 book ai didi

javascript - 消息回调很少返回值 - Chrome 扩展

转载 作者:搜寻专家 更新时间:2023-10-31 23:35:33 24 4
gpt4 key购买 nike

我正在构建一个 chrome 扩展,它通过 websockets 与 nodejs 服务器通信。它的重点是使用内容跟踪浏览历史。这一切似乎都有效,但偶尔(30% 的时间)传递给 onMessage.addListener 的函数中的回调不会正确触发。让我向您展示代码:

background.js

var socket = io('http://localhost:3000/');

var tabLoad = function (tab) {
socket.emit('page load', tab);
};

var tabUpdate = function (tabid, changeinfo, tab) {
var url = tab.url;
if (url !== undefined && changeinfo.status == "complete") {
tab.user_agent = navigator.userAgent;
tab.description = '';
tab.content = '';

socket.emit('insert', tab);
}
};

socket.on('inserted', function(page){
socket.emit('event', 'Requesting page content\n');
//page = {tab: page, id: docs._id};
chrome.tabs.sendMessage(page.tab_id, {requested: "content", page: page}, function(data) {
socket.emit('content', data);
});

});

try {
chrome.tabs.onCreated.addListener(tabLoad);
chrome.tabs.onUpdated.addListener(tabUpdate);
} catch(e) {
alert('Error in background.js: ' + e.message);
}

内容脚本 - public.js

var messageHandler = function(request, sender, sendContent) {
if (request.requested == "content") {
var html = document.getElementsByTagName('html')[0].innerHTML;
var data = {
content: html,
page: request.page
};
sendContent(data);
return true;
}
};

chrome.extension.onMessage.addListener(messageHandler);

问题是有时 sendContent 中的数据是未定义的,有时是好的。关于如何调试这个或我做错了什么有什么想法吗?

我尝试用硬编码的“测试”字符串替换 document.getElementsByTagName('html')[0].innerHTML,但这没有帮助。

youtube/wikipedia 之类的页面似乎永远无法运行,而 facebook/google 可以运行。

编辑:sendContent 回调确实在 100% 的时间触发,只是传递给它的数据未定义。

编辑:这是 list 文件

{
"manifest_version": 2,

"name": "Socket test",
"description": "sockets are cool",
"version": "1.0",

"permissions": [
"http://st-api.localhost/",
"http://localhost:3000/",
"tabs",
"background",
"history",
"idle",
"notifications"
],
"content_scripts": [{
"matches": ["*://*/"],
"js": ["public/public.js"]
//"run_at": "document_start"
}],
//"browser_action": {
// "default_icon": "logo.png",
// "default_popup": "index.html"
//},
"background": {
//"page" : "background.html",
"scripts": ["socket-io.js", "background.js"],
"persistent": true
}
}

最佳答案

首先,您了解 sendContent执行 100% 的时间是错误的。

如评论中所述,sendMessage出现错误时也会执行回调;在您的情况下,此错误是 "Receiving end does not exist"


错误在于您对内容脚本的 list 声明。 match pattern "*://*/"匹配http 上的顶级页面和 https URI。 IE。 http://example.com/将匹配,而 http://example.com/test不会的。

最简单的修复是 "*://*/*" , 但我会推荐通用匹配模式 "<all_urls>" .


在修复该问题后,您的代码仍有一些改进。

  • 替换chrome.extension.onMessage (已弃用)并使用 chrome.runtime.onMessage
  • 修改sendMessage通过检查 chrome.runtime.lastError 来提高弹性的一部分.尽管获得了广泛的许可,Chrome 仍然不会将任何内容脚本注入(inject)某些页面(例如 chrome:// 页面、Chrome 网上应用店)
  • 确保使用 "run_at" : "document_start"在你的内容脚本中,确保 onUpdated"complete"在您的脚本准备好之前不会被触发。

关于javascript - 消息回调很少返回值 - Chrome 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26242405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com