在百度首页上执行这段代码,会打开2个网页,但是跟我想的不同——
alert(count)这句执行后count=0,而且myload不是顺序执行的,好像是多线程并行的。我想问问有没有办法让循环里的myload顺序执行?
var count=0;
var patt1=new RegExp("baidu.com/[c-dz]+");
for (i=0; i<=document.links.length; ++i)
{
if(patt1.exec(document.links[i]))
{
var newwin = window.open(document.links[i]);
newwin.onload = myload;
}
}
alert(count); // =0
function myload(){
count+=1;
}
执行后
1、跨域问题:
假设你的域名是a.com 你open b.com 然后绑定onload 这是不允许的 跨域禁止
2、不能简单的打开文件 直接测试 必须放到服务器上测试
3、解决方案
3.1、setTimeout 不可靠
setTimeout(function(){ alert(count); }, 1000);
3.2、还是setTimeout 但判断打开的总数 和 load的总数
<br> var mylinks = document.getElementsByTagName("a");<br> var patt1=new RegExp("object.html"); <br> var needOpens = [];<br> for (i=0; i<=mylinks.length; ++i) <br> { <br> var href = mylinks[i]? mylinks[i].getAttribute("href") : "";<br> if(patt1.exec(href)) <br> { <br> needOpens.push(href); //1、找到要打开的url<br> } <br> }</p> <pre><code>var count=0; var loadCount = 0; function myload(){ count+=1; loadCount++; conosle.info(loadCount); conosle.info(count); } for(var index in needOpens) { var href = needOpens[index]; var newwin = window.open(href); newwin.onload = myload; //2、打开 注册函数 } var t = setInterval(function() { if(loadCount == needOpens.length) { console.info(count); clearInterval(t); } }, 100); //3、每100毫秒 检测下onload执行完成没 即loadCount == 打开的数量 </code></pre> <p>
我只谈顺序执行的问题,解决办法就是用递归回调。
让打开后的窗体,回来调用相同函数,继续下一个。
[code="js"]
var count = 0;
var patt1 = new RegExp("baidu.com/[c-dz]+");
var links = document.links;
var l = links.length;
function myload(i) {
if (i >= l) {//如果已经是最后,中断。
alert(count);
return;
}
if (patt1.exec(links[i])) {//如果需要打开。
var newwin = window.open(links[i]);
newwin.onload = new function() {
count++;
myload(++i);
};
} else {
myload(++i);
}
}
myload(0);//开始。
[/code]
未测试,仅供参考。