Php 如何使用Ajax动态加载Javascript函数?
(反问句) 今天我遇到了一个奇怪的场景,我想让PHP动态更新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
/*
* 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;
};