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

时间:2011-06-17 14:04:00

标签: javascript google-chrome-extension

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

除了最后一部分,此代码中的一切正常。新窗口将在新选项卡中打开(我有选项卡权限)但它只在脚本完成后才完成加载。每个新窗口都会覆盖同一个选项卡中的前一个窗口,如果我有机会首先检查内容,这将是正常的。因此,如果我在脚本完成时不使用调试器运行它,则新选项卡包含数组中的最后一项,焦点位于新选项卡上。据我所知,handleResponse永远不会被调用。

如果我在DOM检查器中运行它并在window.open处停止它,我可以看到标签中的“关于空白”的新选项卡打开,选项卡显示正在加载的旋转东西。通过代码步进,即使执行detailWin=window.open(profileLinks[i], "Detail Window");,detailWin仍然未定义。我已尝试将window.onload = handleResponse;替换为detailWin.onload =handleResponse;,但在这种情况下,detailWin未定义。

在我看来,我需要添加一个事件监听器,该监听器在加载新窗口时触发并执行handleResponse。是?否?

//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;
}

1 个答案:

答案 0 :(得分:1)

选项#1:制作two separated content scripts - 一个仅用于搜索页面,一个用于个人资料页面。搜索脚本只会打开配置文件链接,配置文件脚本只会处理它(包含handleResponse()内的代码)

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

您仍然会有两个内容脚本。

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

//PEEK.JS//
var req;
var detailWin;

//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) 
{
    //tell bkgd page to open link
    chrome.extension.sendRequest({cmd: "openProfile", url: profileLinks[i]});
}

profile.js (将被注入您打开的个人资料页面)

var contentDetail = document.getElementsByClassName("content");
alert("Examine Detail Page Here");

<强> 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:也许您根本不需要创建个人资料窗口?如果您只需要在页面源代码中找到某些内容,那么您只需load that page through ajax并解析它(您需要在后台页面中执行此操作)。