現在の回答はどれも実際の問題に対処していないので、試してみます。
var datahtml = "<html><body><div class=\"class0\"><h4>data1</h4><p class=\"class1\">data2</p><div id=\"mydivid\"><p>data3</p></div></div></body></html>";
console.log($(datahtml));
$(datahtml)
は要素のみを含むjQueryオブジェクトであるdiv.class0
ため、このオブジェクトを呼び出すと、期待するHTMLドキュメント全体ではなく、.find
実際には子孫を探しています。div.class0
簡単な解決策は、解析されたデータを要素でラップして、.find
意図したとおりに機能するようにすることです。
var parsed = $('<div/>').append(datahtml);
console.log(parsed.find(".class0").text());
フィドル
この理由はそれほど単純ではありませんが、jQueryはHTML文字列を別のオンザフライで作成されたDOMフラグメントにドロップするだけで、より複雑なhtml文字列を「解析」し、解析された要素を取得すると思います。この操作では、DOMパーサーがタグhtml
とタグを無視する可能性がありbody
ます。この場合は違法であるためです。
これは非常に小さなテストスイートであり、この動作がjQuery1.8.2から1.6.4まで一貫していることを示しています。
編集:この投稿を引用:
問題は、jQueryがDIVを作成し、DIVのinnerHTML
子を設定してから取得することですが、BODY要素とHEAD要素は有効なDIVの子ではないため、ブラウザーによって作成されません。
私の理論が正しいことをより確信させてくれます。ここで共有します。うまくいけば、それはあなたにとって何らかの意味があります。これと一緒にjQuery1.8.2の非圧縮ソースを用意します。#
は行番号を示します。
(定義済み@#6122)を介して作成されたすべてのドキュメントフラグメントは(#6151)を通過し(キャッシュされたフラグメントであっても、作成時にすでに通過しています)、上記の引用テキストが示すように、(定義済み@# 6275)解析されたデータのコンテナとして機能する新しいフラグメントを安全なフラグメント内に作成します- #6301-6303で作成され、#6344で取得され、クリーンアップのために#6347でdivが削除されました(さらにバグ修正として#6359-6361)、#6351-6355で戻り配列にマージされ、#6406で返されました。jQuery.buildFragment
jQuery.clean
jQuery.clean
jQuery.clean
div
div
childNodes
childNodes
したがって、を呼び出すすべてのメソッドはjQuery.buildFragment
、を含み、そのjQuery.parseHTML
中jQuery.fn.domManip
には.append()
、jQueryオブジェクトメソッドを呼び出す .after()
、、およびで処理されます(定義済み@#97、複雑な[複数のタグ] html文字列の処理@#125 、 @#131を呼び出します)。.before()
domManip
$(html)
jQuery.fn.init
jQuery.parseHTML
事実上すべてのjQueryHTML文字列の解析(単一タグのhtml文字列を除く)は、div
要素をコンテナーとして使用して行われ、html
/body
タグは要素の有効な子孫ではないdiv
ため、削除されます。
補遺:新しいバージョンのjQuery(1.9以降)では、HTML解析ロジックがリファクタリングされています(たとえば、内部jQuery.clean
メソッドは存在しません)が、全体的な解析ロジックは同じままです。