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」の関数定義を入れればよいことはわかっています。しかし、2番目のスクリプトでそれを保持したいのですが、どうすればよいですか? サーバーは、クライアントへの応答としてスパンを返します。スパン「Test AJAX」をクリックすると、関数が呼び出されます。

4

1 に答える 1

7

<script>DOM に挿入されたタグは、実行しない限り実行されませんeval()。詳細はこちら:スクリプトを innerHTML で挿入できますか?

したがってtest()、スクリプトコードが実行されていないため(したがって、test関数が定義されていないため)、スパンをクリックしようとすると未定義になります。

次のようなものを使用して回避できます(DOMインジェクション後):

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

(psevalは悪ではありません)

于 2013-09-06T11:27:59.550 に答える