- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图通过 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/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!