在我的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里面的内容?
答案 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!