通过 AJAX 响应发送的页面中执行 JavaScript 函数

3
我想执行从服务器通过 AJAX 请求发送过来的函数。调用页面中没有函数体。例如:(完整代码如下)
1. 调用 PHP 脚本:
<script>
 function fun()
 {
    try{
        // Opera 8.0+, Firefox, Safari
        ajaxRequest = new XMLHttpRequest();
    } catch (e){
        // Internet Explorer Browsers
        try{
            ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try{
                ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e){
                // Something went wrong
                alert("Your browser broke!");
                return false;
            }
        }
    }  
 ajaxRequest.onreadystatechange = function(){
        if(ajaxRequest.readyState == 4){

            document.getElementById("rslt").innerHTML = ajaxRequest.responseText;


        }
    }

    ajaxRequest.open("GET", "ajax_js2.php", true);
    ajaxRequest.send(null);

 }
</script>
<input type="button" onclick="fun()">
<div id="rslt">
</div>

2.ajax_js2.php脚本:
<script>
 function test()
 {
   alert("Hello");
 }
</script>
<span onclick="test()">Test AJAX</span>

我知道把“test”的函数定义放在调用脚本中可以解决问题。但我想把它保留在第二个脚本中。我该怎么办?服务器将span作为响应返回给客户端。单击span“Test AJAX”时应调用该函数。

它是否也会在响应中返回脚本块?Ajax调用通常出于安全原因会剥离脚本。 - lshettyl
是的,我不确定脚本块(JavaScript)是否会被返回。但我想这样做是为了限制调用 PHP 脚本的页面大小,因为该页面加载了大量脚本。@LShetty - Parveez Ahmed
这只是一个例子,如果有太多的语句和其他函数调用呢?@rps - Parveez Ahmed
@rosemary,请查看我的编辑以获取解决方案。 - David Hellsing
@rosemary,将你的脚本代码复制粘贴到文本编辑器中,并将其保存为JS文件(比如myscript.js),然后将该文件移动到包含你的PHP页面的文件夹中,接着你可以使用<script type="text/javascript" src="myscript.js"></script>链接到该JS文件,详情请参考http://www.mkyong.com/javascript/how-to-link-an-external-javascript-file/。 - user2587132
显示剩余5条评论
1个回答

7

将插入到DOM中的<script>标签不会被执行,除非您运行eval()。在此处阅读更多信息:Can scripts be inserted with innerHTML?

因此,在您单击span时,如果尚未执行脚本代码(因此从未定义test函数),则test()将是未定义的。

您可以使用以下方式解决它(在DOM注入之后):

var scripts = document.getElementById("rslt").getElementsByTagName("script");
for( var i=0; i<scripts.length; i++ ) {
    eval(scripts[i].innerText);
}

(p.s. eval 不是邪恶的)


(注: eval 不是邪恶的)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接