我试图通过 jQuery 解析这个 html 来获取 data1、data2、data3。虽然我确实获取了 data2 和 data3,但我无法用我的方法获取 data3。我对 jQuery 相当陌生,所以请原谅我的无知。
<html>
<body>
<div class="class0">
<h4>data1</h4>
<p class="class1">data2</p>
<div id="mydivid"><p>data3</p></div>
</div>
</body>
</html>
这是我在 jquery 中调用它的方式。
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>";
alert($(datahtml).find(".class0").text()); // Doesn't Work
alert($(datahtml).find(".class1").text()); // work
alert($(datahtml).find("#mydivid").text()); // work
只有 alert($(datahtml).find(".class0").text());
不起作用,其余的都按预期工作。我想知道这可能是因为 class0 里面有多个标签或者什么?在这种情况下如何获取data1?
最佳答案
当前的答案都没有解决真正的问题,所以我会尝试一下。
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)
是一个仅包含 div.class0
元素的 jQuery 对象,因此当您对其调用 .find
时,您实际上正在寻找 div.class0
的后代,而不是您期望的整个 HTML 文档。
一个快速的解决方案是将解析后的数据包装在一个元素中,以便 .find
将按预期工作:
var parsed = $('<div/>').append(datahtml);
console.log(parsed.find(".class0").text());
<小时/>
原因并不是很简单,但我认为 jQuery 通过简单地将 HTML 字符串放入一个单独的即时创建的 DOM 片段中,然后检索更复杂的 html 字符串来“解析”更复杂的 html 字符串。解析的元素,此操作很可能会使 DOM 解析器忽略 html
和 body
标记,因为在这种情况下它们是非法的。
这是一个非常小的test suite这表明这种行为从 jQuery 1.8.2 一直到 1.6.4 都是一致的。
编辑:引用此post :
Problem is that jQuery creates a DIV and sets
innerHTML
and then takes DIV children, but since BODY and HEAD elements are not valid DIV childs, then those are not created by browser.
让我更加确信我的理论是正确的。我将在这里分享,希望对您有所帮助。有 jQuery 1.8.2 的 uncompressed source与此并列。 #
表示行号。
全部document fragments通过 jQuery.buildFragment
(定义@#6122)创建的将经过 jQuery.clean
(#6151) (即使它是一个缓存片段,它也已经经过了 jQuery.clean
创建时),正如上面引用的文本所暗示的那样,jQuery.clean
(定义@#6275)创建了一个新的div
位于安全片段内,用作解析数据的容器 - 在 #6301-6303 创建的 div
元素,在 #6344 检索的 childNodes
,在 #6347 删除 div 以进行清理(加上 #6359-6361 作为错误修复),childNodes
合并到 #6351-6355 处的返回数组并在 #6406 处返回。
因此,所有调用 jQuery.buildFragment
的方法,包括 jQuery.parseHTML
和 jQuery.fn.domManip
- 其中包括 .append()
、.after()
、.before()
调用 domManip
jQuery 对象方法,以及在 jQuery.fn.init
处理的 $(html)
(定义@#97,处理复杂的[多个标签] html 字符串@#125,调用 jQuery.parseHTML
@#131)。
事实上,所有 jQuery HTML 字符串解析(除了单标签 html 字符串)都是使用 div
元素作为容器,以及 html
/body 来完成的,这是有道理的。
标签不是 div
元素的有效后代,因此它们被删除。
附录:较新版本的 jQuery (1.9+) 重构了 HTML 解析逻辑(例如,内部 jQuery.clean 方法不再存在),但整体解析逻辑保持不变。
关于jquery - 使用jquery解析html字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12808770/