2

jQuery を使用して AJAX 応答 HTML 文字列を取得しています。この応答をドキュメントに追加するときに衝突するスクリプトがいくつかあるため、それを削除し、問題のある元のスクリプトが削除された後にのみ配置したいと考えました。

これが私のコードです(ajaxの成功関数にあります):

var content = $(response).find('.content').html();
var scripts = $(content).find('script');
console.log(scripts);

このコードは 0 個のスクリプトを返します。しかし、私がするとき:

var content = $(response).find('.content').html();
var scripts = $(content).find('h3'); //PULLING H3s INSTEAD OF SCRIPT TAGS
console.log(scripts);

その文字列のすべての h3 を返します。何が起きてる?

スクリプトが応答文字列にあることを確認できます。

助けてくれてありがとう。最終的にドキュメント内の非表示の入力を使用し、それらの値に対して $.getScript() を使用しました。今、すべてが機能しています。

4

1 に答える 1

2

$(response) を実行すると、スクリプト タグが取り除かれ、実行されます。代わりに、regexp を使用してスクリプト タグを div に置き換え、それを DOM ノードに変換した後、前述の div を選択し、それらを反復して処理する必要があります。

それを行う1つの方法は次のとおりです。

function cleanInsert(html, target, htmlSelector, filter) {
    var outHTML = html, $content = $(target);
    outHTML = outHTML.replace(/<script/ig, "<div class='iscript'").replace(/<\/script/ig, '</script');
    outHTML = $("<div>").html(outHTML);
    outHTML = htmlSelector ? outHTML.find(htmlSelector) : outHTML.children();
    if (filter) {
        outHTML = filter.call(outHTML);
    }
    var scripts = outHTML.filter('div.iscript').detach();
    scripts.add(outHTML.find('div.iscript').detatch());
    $content.html(outHTML);
    scripts.each(function() {
        var $this = $(this),
            s = document.createElement("script");
        if ($this.attr('src') != "") {
            s.src = $this.attr('src');
        } else {
            s.nodeValue = $this.text();
        }
        $content[0].appendChild(s);
    });
}​
//                   insert target response filter
cleanInsert(response, "#targetel", ".content");

十分にテストされていません。

于 2013-10-09T19:32:02.303 に答える