转文请标明 --- 出处:穆乙
execScript将指定的字符串当做脚本来执行,ie和早期的chrome支持,新版本的chrome已经不支持这个方法,下面我们模拟一个:
execscript将指定字符串作为脚本执行
下面是jquery的方式
// Evalulates a script in a global contextglobalEval: function( data ) { if ( data && rnotwhite.test(data) ) { // Inspired by code by Andrea Giammarchi // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html var head = document.getElementsByTagName("head")[0] || document.documentElement, script = document.createElement("script"); script.type = "text/javascript"; if ( jQuery.support.scriptEval ) { script.appendChild( document.createTextNode( data ) ); } else { script.text = data; } // Use insertBefore instead of appendChild to circumvent an IE6 bug. // This arises when a base node is used (#2709). head.insertBefore( script, head.firstChild ); head.removeChild( script ); }},
其实,我们知道另一个类似的方法,eval,也即window.eval。这两个方法看起来一样,其实本来就一样!
alert(eval===window.eval);//true所有浏览器都一样
但是也有不一样的地方,可以测试一下面的函数:
var win ="全局"; function test(){ //window.eval("var win='局部'"); // 除ie外都是声明一个全局变量会覆盖掉原来全局变,ie声明一个局部变量 execScript("var win='局部'");//只有ie支持,上面我们已经模拟了一个,同样是声明了一个全局变量,会覆盖掉原来全局变量 //eval("var win='局部'");// 都是声明一个局部变量 } test() alert(win);
// 将指定字符串作为脚本执行 if (!window.execScript){ window.execScript = function execscript(text){ window.eval(text) } }
当然,可能还会想到另一个方法:Function构造函数
// 将指定字符串作为脚本执行 if (!window.execScript){ window.execScript = function execscript(text){ if (!typeof text ==="string") return; //window.eval(text) new Function("",text)() } }
同样测试一下,结果除ie外均声明一个局部变量,不会覆盖已有全局变量。其实Function构造本来就是构造一个局部变量,包括ie
无标题文档