从AJAX Success解析字符串以作为JQuery运行

时间:2013-10-31 16:14:35

标签: javascript jquery ajax

在我的HTML页面上,我有一个AJAX帖子来获取一些数据。返回的数据包含一个字符串,该字符串的内容是原始javascript。

$.ajax({
    url: '@Url.Action("GetPropertyDataForInstance", "Local_Data")',
    type: 'POST',
    dataType: 'json',
    data: instancePropertyRequest,
    contentType: 'application/json; charset=utf-8',
    success: function (response) {

        var javscriptRawString = response.javascriptToExecute;   
        var alertString = response.data;
    }
})

javscriptRawString的内容:

alert(alertString);

我得到这个javascriptRawString之后,我该怎么办才能直接执行javascript里面的内容?

3 个答案:

答案 0 :(得分:4)

这比eval略好,因为eval是邪恶的;)

(new Function(response.data))()

使用eval是邪恶的,因为可能存在许多安全漏洞。您正在全局范围内执行代码。 Function通过在自己的范围内执行来区别对待。

new Function也更快

在你的情况下

$.ajax({
    url: '@Url.Action("GetPropertyDataForInstance", "Local_Data")',
    type: 'POST',
    dataType: 'json',
    data: instancePropertyRequest,
    contentType: 'application/json; charset=utf-8',
    success: function (response) {

        (new Function(response.data))()   

    }
})

new Function从原始文本创建一个新函数。

()()立即执行该功能

如果你使用ajax获得你的功能,我还会添加一些额外的检查和标题。 检查一下。

https://stackoverflow.com/a/17468822/2450730

修改

如果你想从ajax传递params

//raw ajax response
var x='param';
alert(x)

如果你想从ajax内部传递params(不好)。

success: function (response) {
 var x='param';
 (new Function(response.data))(x)   
}

原始

alert(x);

编辑2

如果你得到一个对象 1.剧本 2. params

然后你需要定义一个参数名称。在这种情况下'x'。

JS

 (new Function('x',response.script))(response.param)

RAW response.script

 alert(x)

更多论点:

(new Function('a','b','c','alert(a+b+c)'))(1,2,3) // 123

测试IT ... http://jsfiddle.net/pLQzd/ 阅读 ... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function 滚动到底部。

但是当您从同一个ajax调用中获取包含该函数和vars的对象时

我只想创造一些已经描述过的东西。

RAW

var param='hello';
alert(param);

甚至更简单

alert('hello');

答案 1 :(得分:2)

您可以通过eval运行任何字符串:

eval('alert("hello world")');

确保您确切知道自己正在评估的内容。

答案 2 :(得分:0)

为什么不用整数格式化ajax响应?

e.g。

$.ajax({
    //Your AJAX
}).done(function(response) {
    //Let's say response from the script is 1.

    switch(response) {
        case 1:
            alert('Hello world');
            break;

        //case ... etc.
    }

});

除非你绝对别无选择,否则千万不要使用eval();

eval === evil!