作为ajax调用的一部分,我想将脚本标记之间列出的这个javascript函数添加到我的文档中。 ajax调用工作正常,但它删除了我文档的这一部分。
<script language="javascript">
window.onload = function(){
var input = document.getElementById('tid-acc');
document.getElementById('rule-type').onchange = function() {
var v
al = this.value;
if (val == 'tid and acc') {
input.style.display = 'inline';
}
else {
input.style.display = 'none';
}
};
}
</script>
我做错了什么?由于我不打算进入,我需要在Ajax调用上动态执行此函数。提前谢谢。
答案 0 :(得分:0)
以下是一篇很好的文章:Global eval. What are the options?
文章还比较了着名的js库如何做到:
图书馆的全球评估
那么一些流行的Javascript库会做什么?哪个全球化 他们选择了eval解决方案吗?
正如我们之前看到的,jQuery牺牲了更多的返回值 广泛的浏览器支持,在其中使用脚本插入技术 jQuery.globalEval方法。
Prototype.js甚至没有尝试全局评估脚本 - 它使用了一个 好老,直接eval调用。相反,Prototype.js警告说 在文档中对本地执行进行分支。
Dojo选择臭名昭着的window.eval变体,但做了些什么 真的搞砸了 - 如果eval存在于全局上,它会使用间接eval 对象(在所有符合ES3标准的浏览器中都应该如此),并且会掉线 回到常规的eval调用。显然这种退缩 导致代码在本地执行,这也应该是静默发生的。 Dojo的评估行为会因环境而异, 并且有可能发生未被捕获的错误。在一个相关的,幽默的笔记, 围绕着大卫马克的dojo.eval的评论让我感到震惊 这条消息。
Mootools使用window.execScript,返回脚本 插入(类似于jQuery)。然而,jQuery的脚本插入是 比Mootools更强大,因为它们实际测试它是否会产生 代码评估。
Fuse.js选择了一个非常精细和谨慎的策略。它测试是否 间接eval按预期工作(如果有的话捕获错误),如果使用它 它确实;如果间接评估失效,Fuse会依赖脚本 注射。与jQuery或Mootools不同,它实际上试图返回一个 通过脚本注入执行的代码的值。它是通过包装来实现的 带有eval的代码内容。执行的一个有趣的副作用 通过eval全局代码是函数和变量声明 创建可删除的绑定(这很可能是无关紧要的 细节)。
以下是Mootools 1.3.2的用法:
String.implement('stripScripts', function(exec){
var scripts = '';
var text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(all, code){
scripts += code + '\n';
return '';
});
if (exec === true) Browser.exec(scripts);
else if (typeOf(exec) == 'function') exec(scripts, text);
return text;
});
Browser.exec = function(text){
if (!text) return text;
if (window.execScript){
window.execScript(text);
} else {
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.text = text;
document.head.appendChild(script);
document.head.removeChild(script);
}
return text;
};
// on successful HTML request
success: function(text){
response.html = text.stripScripts(function(script){
response.javascript = script;
});
}