我无法将包含整个HTML文档的字符串转换为可以使用jQuery find()
的DOM对象。输入以DOCTYPE字符串开头,并且位于变量data
中。
这样可以找到十几个tr
元素:
var dummy0 = $(data).find('tr');
这不起作用,虽然肯定有h1
元素:
var dummy1 = $(data).find('h1');
如果我这样做来检查data
对象:
var dummy2 = $(data);
dummy2
是以下对象的数组:
#text
title
#text
h1
#text
table
#text
所以find('tr')
有效,因为它位于table
数组元素中,但未找到find('h1')
,因为它不在DOM内,而是{{1}的数组元素之一}。
我尝试了https://stackoverflow.com/a/11047751/1845672的技巧,但这导致完全相同的数组而不是单个DOM树。
我也尝试data
同样的结果。
任何人都可以帮我解释这一切是如何运作的吗?输入是一个只包含一个html元素的字符串,但是被解析为一堆元素的数组。 $.parseHTML(data)
和head
元素在哪里?
然后,因为我需要body
的内容,如何获得可以使用h1
搜索包含find
在内的所有元素的DOM对象?
或者我被迫忘记了DOM树,只检查h1
的数组元素?
更新
我创建了一个小型的独立测试用例:
h1
似乎<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<h1>Test</h1>
<script>
var sHtml = "<!DOCTYPE html>\n<html><head><title>test</title></head>\n<body><h1>Test</h1><table><tr><td>Abc</td></tr></table></body></html>";
var dHtml = $(sHtml);
var h1 = dHtml.find('h1');
var td = dHtml.find('td');
alert('h1: ' + (h1.length == 0 ? 'not found' : h1.text()) + //output: h1: not found
' td: ' + (td.length == 0 ? 'not found' : td.text()) + //output: td: Abc
' dHtml.length: ' + dHtml.length); //output: dHtml.length: 5
</script>
</body>
</html>
数组值中的两个#text
条目对应于两个换行符,一个在DocType之后,另一个在dHtml
标记之后。仍然想知道为什么dHtml中没有一个,但有三个DOM条目。
答案 0 :(得分:0)
显然,我没有在问题中提到的链接中使用这个技巧,并且输入对于小jQuery解析器来说并不太复杂,因为它对这个修改过的行很好用:
var dHtml = $('<div></div>').html(sHtml);
这会将整个头部和身体部位放在单个顶级div中。输入字符串中的DOCTYPE行没问题。 jQuery find()可以找到所有内容。