1

在我的 HTML 页面上,我有一个 AJAX Post 来获取一些数据。返回的数据包含一个字符串,这个字符串的内容是原始的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??

4

3 回答 3

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 传递参数

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

如果您想从 ajax 内部传递参数(不好。)

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

生的

alert(x);

编辑 2

如果你得到一个对象 1.脚本 2.参数

那么您需要定义一个参数名称。在本例中为“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

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

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

我会简单地创建一些已经描述过的东西。

生的

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

甚至更简单

alert('hello');
于 2013-10-31T16:28:17.537 回答
2

您可以通过以下方式运行任何字符串eval

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

确保你确切地知道你正在评估什么。

于 2013-10-31T16:17:44.500 回答
0

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

例如

$.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();除非您绝对别无选择,否则切勿使用。

评估 === 邪恶!

于 2013-10-31T16:18:52.053 回答