如何使用Ajax动态加载Javascript函数?

时间:2010-01-25 21:49:43

标签: php javascript ajax function scope

(修辞问题)

今天我遇到了一个奇怪的场景,我想让PHP更新javascript的动态行为。这很刺激,这就是我试过的......

/*
 * ajax-php-javascript-function-loader.php
 *
 * this gets called by AJAX and defines or re-defines the 
 * definition of dynamicDoStuff()
 */
 <script type="text/javascript">
     function dynamicDoStuff(a,b){
          <?php
          //dynamically defined function behavior
          ?>
     }
 </script>

这不起作用,因为当加载新的javascript时,新函数定义的范围仅限于新的脚本标记。页面上其他地方的脚本无法读取它。

所以这就是你必须做的。

/*
 * index.html
 */
 <html>
     <head>
        <script type="text/javascript">
           var dynamicDoStuff;
        </script>
        <!-- Other Head Stuff -->
     </head>
     <body>
         <!-- the body of the site -->
     </body>
 </html>

/*
 * axax-php-javascript-function-loader.php
 */
 <script type="text/javascript">
     dynamicDoStuff = function(a,b){
         <?php
         //dynamically define function behavior
         ?>
     }
 </script>

通过在标题中定义函数的名称,它变为全局可访问,因此您可以使用ajax和(php或其他)动态重新使用它

2 个答案:

答案 0 :(得分:2)

而不仅仅是

function newFunctionViaAjax() { ... }

你可以改为使用

window['newFunctionViaAjax'] = function newFunctionViaAjax() { ... };

答案 1 :(得分:0)

更好的方法可能是让你的AJAX方法返回 data ,在这种情况下,是一个标志,指示你所讨论的方法应该采用哪种行为。

var ajaxResponseHandler = function(jsonResponse) {
    dynamicDoStuff = jsonResponse.someFlagFromTheServer == someExpectedValue 
         ? staticDoStuffA
         : staticDoStuffB;
};

理想情况下,至少在大多数情况下,您的AJAX方法应该只返回数据。

此外,使用此方法,您可以在客户端已加载的普通JavaScript文件中定义所需的替代行为,而不是将JavaScript与PHP混合使用。