Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用Ajax动态加载Javascript函数?_Php_Javascript_Ajax_Function_Scope - Fatal编程技术网

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

Php 如何使用Ajax动态加载Javascript函数?,php,javascript,ajax,function,scope,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"> func

(反问句)

今天我遇到了一个奇怪的场景,我想让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>
/*
*ajax-php-javascript-function-loader.php
*
*它被AJAX调用并定义或重新定义
*dynamicDoStuff()的定义
*/
函数dynamicDoStuff(a,b){
}
这不起作用,因为加载新javascript时,新函数定义的范围仅限于新脚本标记。页面上其他地方的脚本无法读取它

这就是你要做的

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

/*
*axax-php-javascript-function-loader.php
*/
dynamicDoStuff=函数(a,b){
}
通过在标题中定义函数的名称,它将变得全局可访问,因此您可以使用ajax和(php或其他)动态地重新使用它,而不仅仅是

function newFunctionViaAjax() { ... }
你可以用

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

更好的方法可能是让AJAX方法返回数据,在本例中,一个标志指示所讨论的方法应该采用的行为

var ajaxResponseHandler = function(jsonResponse) {
    dynamicDoStuff = jsonResponse.someFlagFromTheServer == someExpectedValue 
         ? staticDoStuffA
         : staticDoStuffB;
};
理想情况下,至少在大多数情况下,AJAX方法应该只返回数据


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

您描述的行为取决于ajax响应中
标记的内容如何
eval()
'd。例如,jQuery不会有这个问题,因为它接受您的脚本并在全局上下文中评估它。这是一个问题还是一个答案?我很困惑。@Roatin是的,但问题不是我不能访问全局函数,而是我不能创建它们。除非我误解了您的意思,并且这里没有列出在全局空间中局部声明函数的替代方法@wheaties这不是一个问题,而是如何解决标题中的问题。(分享知识等等,你知道吗?)很好。这避免了必须事先声明函数。显然,大多数情况下都是这样。在我的例子中,我加载了一个原型窗口,它的内容是由PHP创建的。原型窗口中元素的行为由多个因素决定,包括用户是谁、他们迄今为止做了什么以及他们选择看什么。最简单的方法是定义动态行为。我可以想象其他情况,尤其是动态或闭环的情况,在这些情况下,这也会很有用。。。这种设计模式允许大量的模块化,因为功能可能会被模糊地定义,并动态定制以适应给定模块的日程(允许动态加载和卸载)。
var ajaxResponseHandler = function(jsonResponse) {
    dynamicDoStuff = jsonResponse.someFlagFromTheServer == someExpectedValue 
         ? staticDoStuffA
         : staticDoStuffB;
};