javascript – 执行从ajax调用返回的js时避免eval
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 执行从ajax调用返回的js时避免eval,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2574字,纯文字阅读大概需要4分钟。
内容图文
![javascript – 执行从ajax调用返回的js时避免eval](/upload/InfoBanner/zyjiaocheng/751/ed698426d2fb4112ab526de0f4733dcc.jpg)
我想做一个将返回json对象的ajax调用.其中一个JSON对象的属性将是要在客户端中执行的函数的字符串.我意识到这可以通过使用eval轻松解决,但是看到eval的many disadvantages,我宁愿避免它.我的问题是:
我可以以某种方式从服务器返回一些js代码并执行它而不需要求助于eval吗?
根据要求,这里是一些示例代码:
服务器(Node.js):
var testFunc = function() {
alert('h1');
};
app.get('/testPack', function(req, res) {
var template = jade.render('h1 hi');
res.send({
template : template,
entity : testFunc.toString(),
data : {
id: "OMG I love this"
}
});
});
客户:
$(document).ready(function() {
$.ajax({
url: '/testPack',
success: function(data) {
$('body').append($(data.template))
alert(data.data.id);
var entity = eval(data.entity);
entity();
}
})
})
当然,返回的函数称为实体不会做这么愚蠢的事情,它会暴露返回的小部件的API.
为了澄清,我想避免单独调用javascript本身.我宁愿用模板和数据捆绑它来渲染.
解决方法:
最简单的方法是,不是通过ajax调用服务器,而是在页面上创建一个新的脚本标记,其中url指向一个RESTful web服务,该服务将输出纯JavaScript(而不是JSON).这样,您的输出将由浏览器直接评估,而无需使用eval.
为了扩展我的答案:
要解决在全局上下文中运行脚本的问题,您可以做一些技巧.例如,当您向头部添加脚本标记时,您可以绑定onload事件(或者更确切地说是假的onload事件,因为IE不支持脚本标记上的onload),并且如果您的服务器响应始终是包含在具有已知名称的函数中,您可以在对象中应用该函数.下面的示例代码(这只是一个例子):
function test ()
{
this.init = function ()
{
var script = document.createElement("script");
script.type = "text/javascript";
script.language = "javascript";
script.src = "test.js";
var me = this;
window.callMe = function () { me.scriptReady(me); };
var head = document.getElementsByTagName("head")[0];
head.appendChild(script);
};
this.scriptReady = function (object)
{
serverResponse.call(object);
};
this.name = "From inside the object";
this.init();
}
var t=new test();
服务器响应应如下所示:
function serverResponse()
{
alert(this.name);
}
window.callMe();
在这种情况下,serverResponse()内的所有内容都将您的对象用作“this”.现在,如果您以这种方式修改服务器响应:
function serverResponse()
{
this.serverJSONString = { "testVar1": "1", "testVar2": 2 };
function Test()
{
alert("From the server");
}
Test();
}
window.callMe();
您可以从服务器返回多个内容,只需一个响应.如果您不喜欢只设置变量,那么在主对象中创建一个函数来处理您可以通过从响应中调用此函数来提供的JSON字符串.
正如你所看到的,这一切都是可行的,它看起来并不漂亮,但话说回来,你要做的事情并不是很开始.
附:只是在标签内插入一个字符串不适用于IE,它不允许你这样做.如果您不必支持IE,那么您可以在新创建的脚本标记中插入服务器响应并完成它.
P.P.S.请不要按原样使用此代码,因为我没有花太多时间写它.这很难看,但只是作为一个例子:-)
内容总结
以上是互联网集市为您收集整理的javascript – 执行从ajax调用返回的js时避免eval全部内容,希望文章能够帮你解决javascript – 执行从ajax调用返回的js时避免eval所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。