Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检测是否已注入Chrome扩展内容脚本/内容脚本是否包含guard_Javascript_Google Chrome Extension_Include - Fatal编程技术网

Javascript 检测是否已注入Chrome扩展内容脚本/内容脚本是否包含guard

Javascript 检测是否已注入Chrome扩展内容脚本/内容脚本是否包含guard,javascript,google-chrome-extension,include,Javascript,Google Chrome Extension,Include,每当更新选项卡时,我都要执行内容脚本函数。问题是,有时选项卡更新是ajax(不需要重新加载页面),同时仍然更改页面的url。因此,页面上仍然存在注入的旧内容脚本。结果是在同一页面上注入并运行多个内容脚本实例 所以,我正在寻找一种机制来注入内容脚本,前提是以前没有注入过相同的内容脚本。有什么想法吗?实现include guard非常简单: (函数(){ if(window.hasRun)返回; window.hasRun=true; //代码的其余部分 })(); 如果要以编程方式注入A,请考虑

每当更新选项卡时,我都要执行内容脚本函数。问题是,有时选项卡更新是ajax(不需要重新加载页面),同时仍然更改页面的url。因此,页面上仍然存在注入的旧内容脚本。结果是在同一页面上注入并运行多个内容脚本实例


所以,我正在寻找一种机制来注入内容脚本,前提是以前没有注入过相同的内容脚本。有什么想法吗?

实现include guard非常简单:

(函数(){
if(window.hasRun)返回;
window.hasRun=true;
//代码的其余部分
})();

如果要以编程方式注入A,请考虑使用其中一个事件(例如)代替。与

选项卡
事件不同,webNavigation事件也会被触发用于在框架内进行导航,并提供一种提前声明URL筛选器的方法。

您可以尝试向内容脚本()发送消息。如果内容脚本成功返回响应,则表示内容脚本已经存在,否则将返回空响应,您可以检查空响应并注入内容脚本

背景:

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
    chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) {
        if (response) {
            console.log("Already there");
        }
        else {
            console.log("Not there, inject contentscript");
        }
    });
});
chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        if (request.greeting == "hello")
            sendResponse({message: "hi"});
 });
ContentScript:

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
    chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) {
        if (response) {
            console.log("Already there");
        }
        else {
            console.log("Not there, inject contentscript");
        }
    });
});
chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        if (request.greeting == "hello")
            sendResponse({message: "hi"});
 });

很高兴了解WebNavigation!有了这个include-guard,代码本身仍然被注入。在多次导航之后,可能会有大量内容脚本注入到该页面中。这会导致性能问题吗?是否有办法通过检查不存在内容脚本来进行注入?来自同一扩展的所有内容脚本都在同一上下文中运行。不要担心性能。来自同一扩展的所有内容脚本都在同一上下文中运行。。。直到重新加载扩展。如果重新加载扩展,请小心-这将导致两个扩展正在运行。@RobW:很抱歉重新启动这个旧线程,但我并不真正遵循建议的实现。什么是
window.hasRun
?这段代码应该从哪里运行?@c0000fd
hasRun
是一个任意选择的全局变量名,应该包装只执行一次的内容脚本。尝试了这个。但您只知道sendMessage回调中的错误。你无法捕捉回调函数中抛出的错误。这个答案可能适用于早期的chrome版本,而不是今天……所以我很好奇,除了尝试发送消息并等待内容脚本的响应外,你是否还能找到一个有效的解决方案?@c0000fd:再次讨论这个问题,我确实认为Rob W的解决方案更简单,从某种意义上说,它不依赖于chrome消息传递。