1

を使用してページを動的にロードし、 を使用し$.get()て戻り値を解析しvar $content = $(data)、最終的にセレクターを使用してドキュメントの特定の部分のみを見つけようとしています。$(data)から返されたjQueryコレクションが非常に基本的なセレクターを見つけられない理由を理解できないのは私だけです。

非常に小さな HTML 文字列を使用して問題を説明するために、jsFiddle をセットアップしました。

<html>
<head>
<title>See Our Events</title>
</head>
<body><div id="content">testing</div></body>
</html>

<title>ノードを見つけたい。

var content = "<html>\n"+
"<head>\n"+
"  <title>See Our Events</title>\n"+
"</head>\n"+
"<body><div id=\"content\">testing</div></body>\n"+
"</html>";
var $content = $(content);
console.log($content.find('title').length); // Logs 0. Why?
console.log($content.html());               // Logs null. Why?

<div>HTMLをラップすると、セレクターが機能します。(しかし、jsFiddle を見ると、セレクターの他のバリエーションはまだ機能していません!)

var content = "<div><html>\n"+
"<head>\n"+
"  <title>See Our Events</title>\n"+
"</head>\n"+
"<body><div id=\"content\">testing</div></body>\n"+
"</html></div>";
var $content = $(content);
console.log($content.find('title').length); // Logs 1.
console.log($content.html());               // Logs subset of the source. Why?

jsFiddle も見てください。投稿を読みやすくするために、ここのコードよりも多くの例が含まれています。

titleそれ以外の非常に基本的なセレクターがノードを返さないのはなぜですか?

4

2 に答える 2

2

jQuery のドキュメントを見ると、関数を使用して新しい要素を作成することに関する説明が表示され$()ます。ここで、この問題に光を当てる特定の段落が 1 つあります。

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

一部の基本的な要素を正しく作成できない可能性があるようです。引用された段落の上で、文字列がどのように解析され、作成されるかについて読むことができます。

次の方法でChrome 22にノードを作成できました。

var node = document.createElement('html');
node.innerHTML = "<head><title>Test me</title></head><body><div><p>Test 2</p></div></body>"

これで DOM ノード全体が作成され、これを jQuery コンストラクターに配置すると、有効な jQuery オブジェクトを作成できるようになりました。

var nodeElem = $(node);
nodeElem.find('title'); //get 1 result

これは Chrome 22 で行われましたが、ブラウザによって結果が異なる場合があります。

于 2012-09-26T22:12:47.147 に答える
0

こいつが犯人らしい

var $content = $(html);

文字列を #content に保存しています

あなたがする必要があるのに対し

var $content = $('html');
于 2012-09-26T21:35:27.227 に答える