问题描述
在百度首页上执行这段代码,会打开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); // =0function myload(){count+=1;}执行后
解决方案
1、跨域问题:假设你的域名是a.com 你open b.com 然后绑定onload 这是不允许的 跨域禁止2、不能简单的打开文件 直接测试 必须放到服务器上测试 3、解决方案 3.1、setTimeout 不可靠setTimeout(function(){ alert(count); }, 1000);3.2、还是setTimeout 但判断打开的总数 和 load的总数<a target="_blank" href="object.html">超链接</a><a target="_blank" href="object.html">超链接2</a><a target="_blank" href="object2.html">超链接3</a> <script type="text/javascript"> var mylinks = document.getElementsByTagName("a"); var patt1=new RegExp("object.html"); var needOpens = []; for (i=0; i<=mylinks.length; ++i) { var href = mylinks[i]? mylinks[i].getAttribute("href") : ""; if(patt1.exec(href)) { needOpens.push(href); //1、找到要打开的url } } 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 == 打开的数量</script>
解决方案二:
我只谈顺序执行的问题,解决办法就是用递归回调。让打开后的窗体,回来调用相同函数,继续下一个。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);//开始。未测试,仅供参考。