wil*_*oup 68 javascript ajax function
我有一个系统,我发送一个Ajax命令,它返回一个带有函数的脚本块.在DIV中正确插入此数据后,我希望能够调用此函数来执行所需的操作.
这可能吗?
Fed*_*can 73
我想在这种形式下正确地解释你的问题:"好的,我已经完成了所有Ajax的工作;我只是想知道我的Ajax回调插入到DIV中的JavaScript函数是否可以在此时随时调用,也就是说,我不想在上下文中调用它来回调".
好的,如果您的意思是这样的答案是肯定的,那么您可以在浏览器中的页面持久性期间随时调用您的新代码,条件如下:
1)Ajax回调返回的JavaScript代码必须在语法上正常;
2)即使您的函数声明被插入到<script>
现有<div>
元素中的块中,浏览器也不会知道新函数是否存在,因为声明代码从未被执行过.因此,您必须eval()
使用Ajax回调返回的声明代码,以便有效地声明您的新函数并在整个页面生命周期内使其可用.
即使非常虚拟,这段代码也解释了这个想法:
<html>
<body>
<div id="div1">
</div>
<div id="div2">
<input type="button" value="Go!" onclick="go()" />
</div>
<script type="text/javascript">
var newsc = '<script id="sc1" type="text/javascript">function go() { alert("GO!") }<\/script>';
var e = document.getElementById('div1');
e.innerHTML = newsc;
eval(document.getElementById('sc1').innerHTML);
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我没有使用Ajax,但概念是一样的(即使我选择的例子肯定不是很聪明:-)
一般来说,我不会质疑你的解决方案设计,即它是否适合外部化+在单独的.js文件中泛化函数等,但请注意这样的解决方案可能引发进一步的问题,特别是如果您的Ajax调用应该重复,即如果相同函数的上下文应该更改,或者如果应该关注声明的函数持久性,那么您可能应该认真考虑将您的设计更改为此线程中的建议示例之一.
最后,如果我误解了你的问题,并且你在谈论Ajax回调返回时函数的上下文调用,那么我的感觉是建议krosenvold描述的Prototype方法,因为它是跨浏览器,经过测试并且功能齐全,这可以为您提供更好的未来实施路线图.
小智 42
注意:eval()很容易被滥用,假设请求被第三方拦截并向您发送不受信任的代码.然后使用eval()运行这个不受信任的代码.请参阅此处了解eval()的危险性.
在返回的HTML/Ajax/JavaScript文件中,您将拥有一个JavaScript标记.给它一个ID,比如脚本.向这些标记添加id并不常见,但需要特别引用它.
<script type="text/javascript" id="runscript">
alert("running from main");
</script>
Run Code Online (Sandbox Code Playgroud)
在主窗口中,然后通过仅评估新的JavaScript代码块(在本例中,它称为runscript)来调用eval函数:
eval(document.getElementById("runscript").innerHTML);
Run Code Online (Sandbox Code Playgroud)
它起作用,至少在Internet Explorer 9和Google Chrome中是有效的.
它是完全可能的,甚至还有一些相当合理的用例.使用Prototype框架,它完成如下.
new Ajax.Updater('items', '/items.url', {
parameters: { evalJS: true}
});
Run Code Online (Sandbox Code Playgroud)
请参阅Ajax更新程序的文档.选项位于常用选项集中.像往常一样,关于"这个"指向的地方有一些警告,所以阅读细则.
JavaScript代码将在加载时进行评估.如果内容包含功能,myFunc(),
您可以在myFunc()
事后说出来.也许如下.
if (window["myFunc"])
myFunc()
Run Code Online (Sandbox Code Playgroud)
这将检查函数是否存在.也许某人有更好的跨浏览器方式,可以在Internet Explorer 6中运行.
归档时间: |
|
查看次数: |
165655 次 |
最近记录: |