ページのdivのコンテンツを、ajax呼び出しの結果のhtmlで置き換える必要があります。問題は、htmlにいくつかの必要なスクリプトが含まれていて、jquery html()関数がそれらを取り除いているようで、応答をフィルタリングして特定のdivのみを取得する必要があることです。
私はajax応答からすべてのスクリプトタグを抽出し、それらにDOMを追加するという回避策を考えていますが、それがうまくいきません。
これが私のコードです。
$('a.link-vote').live('click',function(){
var idfeedback = $(this).attr('id').split('-')[1];
var href = $(this).attr('href');
$('.feedback-' + idfeedback + '-loader').show();
$.ajax({
type: "POST",
url: href,
success: function(response){
var x = $(response).find('#feedback-'+ idfeedback).html();
$('.feedback-' + idfeedback + '-loader').hide();
$('#feedback-'+ idfeedback).html(x);
}
});
return false;
});
私はこの古いトピックを見つけました: jQuery-HTMLのスクリプトタグはjQueryによって解析され、実行されません
しかし、これは結論です。そこで提案された解決策を試しましたが、どれも機能しません。
編集:私はその古いトピックに基づいて回避策を見つけたようですが、それはきれいではありません。
var dom = $(response);
// var x = $(response).find('#feedback-'+ idfeedback).html();
$('.feedback-' + idfeedback + '-loader').hide();
//$('#feedback-'+ idfeedback).html(x);
$('#feedback-'+ idfeedback).html(dom.find('#feedback-'+ idfeedback).html());
dom.filter('script').each(function(){
var obj = $(this);
$('#feedback-'+ idfeedback + ' .feedback-comments').append(obj);
});
簡単な方法があるはずです。
編集:私は疲れていて、考えていません。 .html()
の代わりに、ネイティブのinnerHTML
メソッドを使用できます。
$('#feedback-' + idfeedback)[0].innerHTML = x;
元の答え:
含まれているスクリプトは<script>
タグと</script>
タグの間のスクリプトコンテンツではなくsrc
属性を使用して呼び出されるため、リンクした回答が機能しないのが私の勘です。これはうまくいくかもしれません:
$.ajax({
url: 'example.html',
type: 'GET',
success: function(data) {
var dom = $(data);
dom.filter('script').each(function(){
if(this.src) {
var script = document.createElement('script'), i, attrName, attrValue, attrs = this.attributes;
for(i = 0; i < attrs.length; i++) {
attrName = attrs[i].name;
attrValue = attrs[i].value;
script[attrName] = attrValue;
}
document.body.appendChild(script);
} else {
$.globalEval(this.text || this.textContent || this.innerHTML || '');
}
});
$('#mydiv').html(dom.find('#something').html());
}
});
これは何もテストされておらず、赤ちゃんを食べる可能性があることに注意してください。
私は同じ問題を抱えていましたが、それを簡単に修正することができない多くの問題がありました。しかし、私は解決策を見つけました:
これは私の疑似ソース(HTML)であり、私はできませんでした何らかの方法で変更します。
_<html>
<body>
<div id="identifier1">
<script>foo(123)</script>
</div>
<div id="identifier2">
<script>bar(456)</script>
</div>
</body>
</html>
_
このHTMLページを取得するために$.get()
を使用しました。コードを文字列として取得したので、今度はjQueryでコードを検索します。私の目的は、DIV _<script>
_に属しているが_identifier2
_には属していない_identifier1
_- Tag内のJavaScriptコードを分離することでした。だから私が欲しかったのは結果文字列としてのbar(456)
です。理由により、jQueryはすべてのスクリプトタグを取り除いているため、次のようにcannotで検索できます。
_var dom = $(data); //data is the $.get() - Response as a string
var js = dom.filter('div#identifier2 script').html();
_
解決策は簡単な回避策です。最初に、すべての_<script>
_- Tagを_<sometag>
_のようなものに置き換えます。
_var code = data.replace(/(<script)(.*?)(<\/script>)/gi, '<sometag$2</sometag>');
var dom = $(code);
var result = dom.find('div#identifier2 sometag').html();
//result = bar(456)
_
簡単なハックですが、うまくいきます!
これが最も簡単な解決策です。
var keepScripts;
keepScripts = true;
$.parseHTML(yourHtmlString, keepScripts);
これにより、スクリプトタグが;)に保持されます。