execscript将指定字符串作为脚本执行

转文请标明 --- 出处:穆乙 http://www.cnblogs.com/pigtail/

execScript将指定的字符串当做脚本来执行,ie和早期的chrome支持,新版本的chrome已经不支持这个方法,下面我们模拟一个:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="gb2312">
<title>execscript将指定字符串作为脚本执行</title>
</head>

<body>
<script>
    // 将指定字符串作为脚本执行
    if (!window.execScript){
        window.execScript = function(text){
            if (!text){
                return;
            }
            // 构建script元素
            var script = document.createElement("SCRIPT");
            script.setAttribute("type","text/javascript");
            script.text = text;

            var head = document.head||document.getElementsByTagName("head")[0]
            // 开始执行
            head.appendChild(script);
            // 执行完清除
            head.removeChild(script);
        }
    }
    // 测试
    execScript("alert(123)");
</script>
</body>
</html>

下面是jquery的方式

// Evalulates a script in a global context
globalEval: 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);

所以我们还可以有另外一种模拟execScript的方法:

// 将指定字符串作为脚本执行
    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

<!DOCTYPE HTML>
<html>
<head>
<meta charset="gb2312">
<title>无标题文档</title>
</head>

<body>
<script>
    // 将指定字符串作为脚本执行
    if (!window.execScript){
        window.execScript = function execscript(text){
            if (!typeof text ==="string")
            return;
            //window.eval(text)
            new Function(text)()
        }
    }

    var win ="全局";
    function test(){
        execScript("var win=‘局部‘");
    }

    test()
    alert(win);// 全局,ie局部</script>
</body>
</html>

原文地址:https://www.cnblogs.com/Bearxy/p/8323877.html

时间: 2024-07-30 10:19:23

execscript将指定字符串作为脚本执行的相关文章

涛哥的Python脚本工具箱之批量替换目录所有指定扩展名的文件中的指定字符串

今天发布刚完成的涛哥的Python脚本工具箱之批量替换目录所有指定扩展名的文件中的指定字符串,命令行参数处理改用目前比较好用的argparse库,Python代码如下: #!/usr/bin/python2.7 # -*- encoding: UTF-8 -*- # Copyright 2014 [email protected] """replace old string with new string from all files in path 批量替换目录所有指定扩展

设置开机启动时指定非ROOT用户执行相应的脚本

1 [[email protected] sm01]# vim /etc/rc.d/rc.local 2 3 #!/bin/sh 4 # 5 # This script will be executed *after* all the other init scripts. 6 # You can put your own initialization stuff in here if you don't 7 # want to do the full Sys V style init stuf

[shell]实现脚本执行结果匹配某个字符串

今天接到一个这个要求,就是脚本执行结果中包含某个字符串,要求查出来. 我给的思路是 按照脚本名和结果 以 追加 的方式写入文本,然后从这个文本中查找相应的内容. 对方给的思路是以执行结果来判断,就自己实现了这种方式 首先是按照目录写入脚本,这里是在脚本中写入了echo $i的内容.也就是脚本有执行结果. #!/bin/bash SH_DIR=sh_dir cd $SH_DIR for i in $(seq 50); do echo "echo $i">$i.sh done 然后是

shell脚本编程之变量简介及脚本执行过程

脚本变量简介 变量类型:字符型.数值型.真.假:事先确定数据的存放格式和长度: 变量存放在内存空间: 编译型语言,没有额外的处理逻辑,属于强类型语言: 脚本型语言,可以有解释器控制:所以,可以是弱类型语言: 强类型:变量在使用前,必须事先声明,甚至还需要初始化(给一个初始值,如果没给一个原始值,里面是随机数): 弱类型:变量用时声明,甚至不需要区分类型(默认为字符串): 变量赋值:VAR-NAME=VALUE: bash shell变量类型: 环境变量 本地变量(局部变量),局部变量不一定都是本

linux shell脚本执行错误:bad substitution

脚本test.sh内容: #!/bin/bash read pressKey indexes=0 c=${pressKey:indexes:1} 使用调试方式执行:sh -x test.sh第3行总出现bad substitution提示信息. 百思不得其解: 于是百度,查到一条有用信息,这与linux shell使用的是/bin/sh,还是/bin/bash有关系.我的脚本中指定使用的是/bin/bash shell,但是我在调试的时候使用的是sh shell,因此调试时导致错误提示信息. 解

二、shell文件权限和脚本执行

一.认识权限和用户管理 1.查看权限 权限类型: 1.r 读 2.w 写 3.x 可执行 Linux用户 1.所有者(u) 2.所属组(g) (所有者及所有者所在组的全部用户) 3.其他用户(o)(其他组的所有用户(包括文件所有者)) 4.所有用户(a) 文件权限解读 文件类型 所有者权限  所属组权限  其他用户权限            所有者  用户所在的组  文件大小  创建时间  文件名 [[email protected] ~]# ll 总用量 100 -rw-------. 1 r

Sql Server 删除表名包含指定字符串的表

删除包含指定字符串的表 create procedure sys_DeleteTableByTableName(@bianliang varchar(100))asbegindeclare @biao varchar(100),@sql varchar(1000)set @sql='%'[email protected]+'%'declare c cursor for select name from sysobjects where type='u' and name like @sqlset

涛哥的Python工具箱之批量删除含指定字符串行

我们在软件研发中不可避免的要用到大量的反复性的繁琐的工作,比如批量改动代码中接口的字符串.批量下载文件并又一次按规则命名.这些工作人工做特别累,尤其是对我这样的懒人来说. 对于一个出色的程序猿来说,反复是最不能接受的事情之中的一个,因此我们要发明工具把反复的工作自己主动化.曾经我是用linux shell脚本来完毕这些事情的,但因为shell脚本语法能力的限制.有些复杂功能无法有效高速的实现,而且写出的代码难以维护,基本属于一次性代码,非常难复用.因此后面慢慢開始尝试用Python完毕一些自己主

JS 动态加载脚本 执行回调[transfer]

JS 动态加载脚本 执行回调 关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解怎么在js中加载其它js文件并在加载完成后执行回调函数. 我们可以动态的创建 <script> 元素,然后通过更改它的 src 属性来加载脚本,但是怎么知道这个脚本文件加载完成了呢,因为我们有些函数需要在脚本加载完成生效后才能开始执行. 经过对网络上资源的搜索,我发现