我正在为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;
}
答案 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并解析它(您需要在后台页面中执行此操作)。