jquery - 使用jquery解析html字符串

标签 jquery

我试图通过 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());

Fiddle

<小时/>

原因并不是很简单,但我认为 jQuery 通过简单地将 HTML 字符串放入一个单独的即时创建的 DOM 片段中,然后检索更复杂的 html 字符串来“解析”更复杂的 html 字符串。解析的元素,此操作很可能会使 DOM 解析器忽略 htmlbody 标记,因为在这种情况下它们是非法的。

这是一个非常小的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.parseHTMLjQuery.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/

相关文章:

javascript - 如果 jpg 不匹配,jquery/javascript 删除 div

javascript - 标题标签中的 div 自动关闭

javascript - jquery .remove() 移动索引

javascript - 如何为 JQuery $.ajax 同步请求设置超时并执行某些操作

jquery - 将 img src 设置为浏览器已加载的图像 - 导致 Safari 中重新加载图像

javascript - 包装列表项的id并将其保存在表td中

javascript - 我只能为每个网页创建一个 CKEditor

jquery - -webkit-线性渐变 jquery 和 var

jquery - 当数据传入时,WCF Rest Service 中的 POST 方法不起作用?

javascript - 获取被点击的 anchor 标签的id