4

jQueryを使用してajax応答をフィルタリングし、返されたページの本文を抽出して、現在のページを置き換えています。'body'で応答をフィルタリングしても、何も返されないことを発見しました。

たとえば、このページのコンソールでこれをエミュレートするには、次のコマンドを実行できます。

$($('html').html()).filter('body')

これは次を返します:

[]

ただし、実行した場合:

$($('html').html()).filter('title') 

私は得る:

[<title>​Can jQuery.filter work on the body tag? - Stack Overflow​&lt;/title>​]

なぜ、またはこれがバグであるかを知っている人はいますか?

4

1 に答える 1

6

もう少し詳しく答えると、ここでの本当の問題は、$()からの文字列をラップするために使用されること$("html").html()です。jQueryのドキュメントによると:

提供された生のHTMLの文字列からその場でDOM要素を作成します。

複雑なHTMLを渡す場合、一部のブラウザは、提供されたHTMLソースを正確に複製するDOMを生成しない場合があります。前述のように、ブラウザの.innerHTMLプロパティを使用して、渡されたHTMLを解析し、現在のドキュメントに挿入します。<html>このプロセス中に、一部のブラウザは、、、<title>または要素などの特定の要素を除外し<head>ます。その結果、挿入された要素は、渡された元の文字列を表していない可能性があります。(したがって、一方のブラウザでは、もう一方のブラウザではタイトルが見つからない場合があります)

文字列を使用するとすぐに$、解析されたコレクションが取得されます...ただし、使用したいデータの一部が削除される可能性があります...1つのドキュメントで2つの本文要素を使用することはできません

しかし、$( "html")。children()。filter( "body")は機能するので、一般的に言って、私はあなたの質問に「はい」と答えます。

私はあなたがすでに解決策を見つけたと思います;)しかしそれを言及するだけです:私は$呼び出しをスキップして単にsubstringやindexOfのようなネイティブメソッドを使用することを強くお勧めします

// try in the browser console
var myString = "<html><head></head><body>foobar</body></html>";
myString.substring(myString.indexOf("<body>"), myString.indexOf("</body>") + 7);
"<body>foobar</body>"

純粋な文字列であるため、ajax応答でもまったく同じように機能するはずです。bodyタグを抽出する必要がない場合:

// try in the browser console
var myString = "<html><head></head><body>foobar</body></html>";
myString.substring(myString.indexOf("<body>") + 6, myString.indexOf("</body>"));
"foobar"

.html()注:パフォーマンスを見ると、ネイティブ操作は、の再ラップと呼び出しに必要な時間の半分未満で実行されます.filter()

于 2012-06-21T19:51:25.217 に答える