1

AJAXでページを取得しようとしていますが、そのページを取得し、Javascriptコードが含まれていると、実行されません。

なんで?

私のajaxページの簡単なコード:

<script type="text/javascript">
alert("Hello");
</script>

...そしてそれは実行されません。Google Maps APIを使用して、AJAXでマーカーを追加しようとしているので、マーカーを追加するたびに、新しいマーカーを取得するAJAXページを実行し、データベースに保存して、マーカーをマップに「動的に」追加する必要があります。

しかし、この方法では単一のjavascript関数を実行できないので、どうすればよいですか?

ページで事前に定義した関数は保護されていますか、それともプライベートですか?

**AJAX関数で更新**

function ajaxExecute(id, link, query)
{
    if (query != null)
    {
        query = query.replace("amp;", "");
    }

    if (window.XMLHttpRequest)
    {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {
        // code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            if (id != null)
            {
                    document.getElementById(id).innerHTML=xmlhttp.responseText;
            }
        }
    }

    if (query == null)
    {
        xmlhttp.open("GET",link,true);
    }
    else
    {
        if (query.substr(0, 1) != "?")
        {
            xmlhttp.open("GET",link+"?"+query,true);
        }
        else
        {
            xmlhttp.open("GET",link+query,true);
        }
    }
    xmlhttp.send();
}

**Deukalionによるソリューション**

var content = xmlhttp.responseText;

if (id != null)
{

    document.getElementById(id).innerHTML=content;
    var script = content.match("<script[^>]*>[^<]*</script>");

    if (script != null)
    {
        script = script.toString().replace('<script type="text/javascript">', '');
        script = script.replace('</script>', '');
        eval(script);

    }
}

また、特定のイベントでは、「select onchange ='executeFunctionNotIncludedInAjaxFile();'」を作成するのではなく、スクリプト内でaddeventリスナーを追加する必要がありました。これにはaddEventListener( "change"、functionName、false)を追加する必要がありました。評価されているスクリプト内。

4

4 に答える 4

5

コンテナinnerHTMLを更新されたコンテンツに設定するなどしてページを更新すると、ブラウザはその中のスクリプトを実行しません。タグを見つけて<script>取得しinnerHTML(IEが好む場合がありますinnerTEXT)、eval()スクリプトを自分で取得できます(これは、DOMを更新する前に正規表現を使用してスクリプトを検索しますが、jQueryが行うこととほぼ同じです)。

于 2012-06-04T21:08:32.283 に答える
3

この関数を使用します:

function parseScript(_source) {
    var source = _source;
    var scripts = new Array();

    // Strip out tags
    while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) {
        var s = source.indexOf("<script");
        var s_e = source.indexOf(">", s);
        var e = source.indexOf("</script", s);
        var e_e = source.indexOf(">", e);

        // Add to scripts array
        scripts.push(source.substring(s_e+1, e));
        // Strip from source
        source = source.substring(0, s) + source.substring(e_e+1);
    }

    // Loop through every script collected and eval it
    for(var i=0; i<scripts.length; i++) {
        try {
            eval(scripts[i]);
        }
        catch(ex) {
            // do what you want here when a script fails
        }
    }

    // Return the cleaned source
    return source;
}

次にparseScript(xmlhttp.responseText);、コンテンツを置き換え/追加するときに実行します。

于 2012-06-05T00:11:25.540 に答える
2

他の人がこの古いスレッドに遭遇した場合、Deukalionによって受け入れられた回答に1つの問題があり、見落とされている可能性がある1つの問題があります。書かれているように、スクリプトは最初のスクリプトタグのみを検索します。複数のスクリプトタグが存在する場合、他のすべてが見落とされます。

いくつかのマイナーな調整で問題が解決します。次の行を変更します。

    var script = content.match("<script[^>]*>[^<]*</script>");

に:

    var script = content.match(/<script[^>]*>[^<]*<\/script>/g);

そして別のから:

    script = script.toString().replace('<script type="text/javascript">', '');

に:

    script = script.join("").replace(/<script type="text\/javascript">/g, '');

これで、すべての<script>コードが収集され、ページにある順序で実行されます。そうでなければ、それは優れた解決策でした。

于 2013-05-30T00:48:16.540 に答える
0

AJAXリクエストの後、返されたhtmlを取得してそれを使用して何かを実行できる「成功時」関数を作成できます。その後、何かが実行されます。

コード例があれば、状況に対するコードソリューションを提供できます。しかし、標準のxmlhttprequestだけを使用すると、次のことが可能になります。

xhr = new XMLHttpRequest();
xhr.open("GET","ajax_info.txt",true);
xhr.onreadystatechange=function()
{
if (xhr.readyState==4 && xhr.status==200)
  {
  document.getElementById("myDiv").innerHTML = xhr.responseText;
  }
}
xhr.send();
​
于 2012-06-04T21:07:16.383 に答える