Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.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 如何在加载新窗口时恢复脚本_Javascript_Google Chrome Extension - Fatal编程技术网

Javascript 如何在加载新窗口时恢复脚本

Javascript 如何在加载新窗口时恢复脚本,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我正在为Google Chrome编写一个页面操作扩展。加载后,扩展将以下脚本注入搜索页面。在脚本找到类“f_foto”(通常为10个项)的所有匹配项后,它会在每个项中找到第一个链接,将这些HREF放入数组中,然后在数组中迭代,为每个链接打开一个新窗口并检查结果。这就是它应该做的 在这段代码中,除了最后一部分外,一切都正常。新窗口将在新选项卡中打开(我拥有选项卡权限),但它仅在脚本完成后才完成加载。每个新窗口都会覆盖同一选项卡中的前一个窗口,如果我有机会先检查一下内容,那就可以了。因此,如果我在

我正在为Google Chrome编写一个页面操作扩展。加载后,扩展将以下脚本注入搜索页面。在脚本找到类“f_foto”(通常为10个项)的所有匹配项后,它会在每个项中找到第一个链接,将这些HREF放入数组中,然后在数组中迭代,为每个链接打开一个新窗口并检查结果。这就是它应该做的

在这段代码中,除了最后一部分外,一切都正常。新窗口将在新选项卡中打开(我拥有选项卡权限),但它仅在脚本完成后才完成加载。每个新窗口都会覆盖同一选项卡中的前一个窗口,如果我有机会先检查一下内容,那就可以了。因此,如果我在脚本完成时不使用调试器运行它,则新选项卡包含数组中的最后一项,并且焦点位于新选项卡上。据我所知,HandlerResponse从未被调用过

如果我在DOM检查器中运行它并在window.open停止它,我可以看到新选项卡打开时标题中带有“About Blank”,选项卡显示一个旋转的东西,显示它正在加载。单步遍历代码,即使在
detailWin=window.open(profileLinks[i],“detailwindow”)之后,detailWin仍然未定义被执行。我已尝试替换
window.onload=handleResponse带有
detailWin.onload=handleResponse但在本例中,detailWin未定义

在我看来,我需要添加一个事件监听器,在加载新窗口并执行HandlerResponse时触发。对没有

//PEEK.JS//
var req;
var detailWin;
var profileLinks = new Array();
function handleResponse() 
{
//  var contentDetail = document.getElementsByClassName("content");
    alert("Examine Detail Page Here");
};

//drag off the f_foto class
var searchResult = document.getElementsByClassName("f_foto");
alert("Found Class f_foto "+searchResult.length+" times.");

//collect profile links
for (var i = 0; i<searchResult.length; ++i) 
{
    var profileLink=searchResult[i].getElementsByTagName("a");
    profileLinks[i]=profileLink[0].href;
//  alert(i+1+" of "+searchResult.length+" "+profileLinks[i]+" length of "+profileLinks[i].length);
}
for (var i = 0; i<searchResult.length; ++i) 
{

//DYSFUNCTIONAL CODE: New window finishes loading only after script completes, how to execute handleResponse?

    detailWin=window.open(profileLinks[i], "Detail Window");
    window.onload = handleResponse;
}
//PEEK.JS//
var-req;
范德温;
var profileLinks=新数组();
函数handleResponse()
{
//var contentDetail=document.getElementsByClassName(“内容”);
警报(“检查此处的详细信息页面”);
};
//拖出f_foto类
var searchResult=document.getElementsByClassName(“f_foto”);
警报(“发现类f_foto”+搜索结果。长度+“次”);
//收集个人资料链接
对于(var i=0;i选项#1:make-一个只用于搜索页面,一个只用于配置文件页面。搜索脚本只会打开配置文件链接,配置文件脚本只会处理它(包含
HandlerResponse()
中的代码)

选项#2如果出于某些原因,您不想将配置文件脚本注入所有配置文件页面,只注入从搜索页面自己打开的页面,那么您应该向后台页面发送消息,要求其在新选项卡中打开配置文件链接并注入配置文件脚本,而不是从内容脚本打开窗口。

您仍将有两个内容脚本

search.js(仅注入搜索页面):

background.html:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    if(request.cmd == "openProfile") {
        chrome.tabs.create({url: request.url}, function(tab){
            //profile tab is created, inject profile script
            chrome.tabs.executeScript(tab.id, {file: "profile.js"});
        });
    }
});
选项#3:也许您根本不需要创建配置文件窗口?如果您只需要在页面源代码中查找某些内容,那么您可以直接对其进行分析(您需要在后台页面中进行分析)

选项#2如果出于某些原因,您不想将配置文件脚本注入所有配置文件页面,只注入从搜索页面自己打开的页面,那么您应该向后台页面发送消息,要求其在新选项卡中打开配置文件链接并注入配置文件脚本,而不是从内容脚本打开窗口。

您仍将有两个内容脚本

search.js(仅注入搜索页面):

background.html:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    if(request.cmd == "openProfile") {
        chrome.tabs.create({url: request.url}, function(tab){
            //profile tab is created, inject profile script
            chrome.tabs.executeScript(tab.id, {file: "profile.js"});
        });
    }
});

选项#3:也许您根本不需要创建配置文件窗口?如果您只需要在页面源代码中查找某些内容,那么您可以直接对其进行分析(您需要在后台页面中进行分析).

另一种选择是将其加载到IFRAME中吗?非常优雅,谢谢。我可以将数组作为profileLinks的引用传递到后台页面,还是需要通过profileLinks[i]迭代来构建json结构?正如您可能从我最近的帖子中注意到的,我已决定一次发送一个目标链接,但我再次遇到消息传递问题。但是,如果我第一次只传递整个阵列,我可以在后台处理它,而无需从内容脚本请求任何内容。该阵列名为profileLinks,包含25个项目。我是否可以这样将它传递到后台:chrome.extension.sendRequest({cmd:“openProfile”,urlList:profileLinks})???????据我所知,javascript中的数组与json中的数组不同。另一种选择是将其加载到IFRAME中吗?非常优雅,谢谢。我可以将数组作为profileLinks的引用传递到后台页,还是需要通过profileLinks[I]迭代来构建json结构?正如您可能从我最近的帖子中注意到的,我已决定一次发送一个目标链接,但我再次遇到消息传递问题。但是,如果我第一次只传递整个阵列,我可以在后台处理它,而无需从内容脚本请求任何内容。该阵列名为profileLinks,包含25项。我是否可以这样将其传递到后台:chrome.extension.sendRequest({cmd:“openProfile”,urlList:profileLinks});???????据我所知,javascript中的数组与json中的数组不同。
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    if(request.cmd == "openProfile") {
        chrome.tabs.create({url: request.url}, function(tab){
            //profile tab is created, inject profile script
            chrome.tabs.executeScript(tab.id, {file: "profile.js"});
        });
    }
});