一尘不染

调用从Ajax响应返回的JavaScript函数

javascript

我有一个发送Ajax命令的系统,该命令返回一个带有功能的脚本块。将此数据正确插入DIV后,我希望能够调用此函数来执行所需的操作。

这可能吗?


阅读 225

收藏
2020-04-25

共1个答案

一尘不染

我想以这种形式正确解释您的问题:“好的,我已经用完所有的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>

我没有使用Ajax,但是概念是相同的(即使我选择确定的示例不是很聪明:-)

一般而言,我不质疑您的解决方案设计,即在单独的.js文件等中对函数进行外部化+泛化是否适当,但请注意,这样的解决方案可能会引起其他问题,尤其是在您的Ajax调用应重复执行,即,如果同一函数的上下文发生更改,或者如果要考虑已声明的函数持久性,那么也许您应该认真考虑将设计更改为该线程中建议的示例之一。

最后,如果我误解了您的问题,并且您谈论的是当您的Ajax回调返回时该函数的上下文调用,那么我的感觉是建议使用krosenvold描述的Prototype方法,因为它是跨浏览器,经过测试且功能齐全的,这可以为您提供更好的未来实施路线图。

2020-04-25