我有一个发送Ajax命令的系统,该命令返回一个带有功能的脚本块。将此数据正确插入DIV后,我希望能够调用此函数来执行所需的操作。
这可能吗?
我想以这种形式正确解释您的问题:“好的,我已经用完所有的Ajax东西了;我只想知道从那时起任何时候都可以调用插入到DIV中的JavaScript函数吗? ,也就是说,我不想在上下文中将其称为“回调返回”。
好的,如果您的意思是这样,那么您可以在以下情况下,在浏览器内的页面持久性期间的任何时候调用新代码:
1)您的Ajax回调返回的JavaScript代码在语法上必须可以; 2)即使将函数声明插入到<script>现有<div>元素中的块中,浏览器也不知道新函数的存在,因为声明代码从未执行过。因此,您必须eval()由Ajax回调返回的声明代码,才能有效地声明新函数并使它在整个页面生命周期中都可用。
<script>
<div>
eval()
即使很虚构,此代码也说明了这个想法:
<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>
我没有使用Ajax,但是概念是相同的(即使我选择确定的示例不是很聪明:-)
一般而言,我不质疑您的解决方案设计,即在单独的.js文件等中对函数进行外部化+泛化是否适当,但请注意,这样的解决方案可能会引起其他问题,尤其是在您的Ajax调用应重复执行,即,如果同一函数的上下文发生更改,或者如果要考虑已声明的函数持久性,那么也许您应该认真考虑将设计更改为该线程中建议的示例之一。
最后,如果我误解了您的问题,并且您谈论的是当您的Ajax回调返回时该函数的上下文调用,那么我的感觉是建议使用krosenvold描述的Prototype方法,因为它是跨浏览器,经过测试且功能齐全的,这可以为您提供更好的未来实施路线图。