当document.write 遇到外联script
先来看个例子:
<!DOCTYPE html> <html> <head> <title>测试 document.write</title> <meta charset="utf-8"> <script type="text/javascript"> document.write('<script type="text/javascript" src="js/getnum.js"><\/script>'); document.write('<script type="text/javascript" src="js/jquery-1.3.2.js"><\/script>'); </script> </head> <body> test document.write </body> </html>
//getnum.js var nodes=document.getElementsByTagName('script'); alert(nodes.length); //IE 3 //Chrome Firefox 2
运行结果为什么Chrome和Firefox的结果为2而IE为3呢?
在IE中,当document.write创建了一个外联的script标签后,外联js里面的代码不会立即被执行,而是等到document.write所在的script标签中的代码全部运行完了,才开始执行。所以在这个例子中,IE要等到第二个script标签页创建好才执行getnum.js中的代码。
而在Chrome和Firefox中,它们是在document.write创建script标签立即执行该js中的内容,执行完后再继续执行下一条document.write
运用场景:参看司徒大神的javascript框架设计一书(第19页),例子稍微改了下= =。
<!DOCTYPE html> <html> <head> <title>测试 readyState</title> <meta charset="utf-8"> <script type="text/javascript"> document.write('<script type="text/javascript" src="js/geturl.js"><\/script>'); document.write('<script type="text/javascript" src="js/jquery-1.3.2.js"><\/script>'); </script> </head> <body> test readyState </body> </html>
var nodes=document.getElementsByTagName('script'); if(window.VBArray){//如果是IE浏览器 for(var i=0,node;node=nodes[i++];){//注意这里,for循环的判断条件永远为真,所以它是个死循环,好在循环体中有break语句可以跳出循环。 if(node.readyState==="interactive"){ break; } } //这样也可以 /* var i=0; while(node=nodes[i++]){ if(node.readyState==="interactive"){ break; } } */ }else{ node=nodes[nodes.length-1]; } //test alert(node.src); // file:///D:/wamp/www/test/js/geturl.js
最新的mass.js中没有找到这个getBashPath方法,大概是在13年的版本?
hi,我的新博客地址:ysha.me !!