从完整的HTML文档创建jQuery DOM对象

时间:2018-04-02 22:42:35

标签: jquery html

我无法将包含整个HTML文档的字符串转换为可以使用jQuery find()的DOM对象。输入以DOCTYPE字符串开头,并且位于变量data中。

这样可以找到十几个tr元素:

var dummy0 = $(data).find('tr');

这不起作用,虽然肯定有h1元素:

var dummy1 = $(data).find('h1');

如果我这样做来检查data对象:

var dummy2 = $(data);
在Firefox F12调试器中,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条目。

1 个答案:

答案 0 :(得分:0)

显然,我没有在问题中提到的链接中使用这个技巧,并且输入对于小jQuery解析器来说并不太复杂,因为它对这个修改过的行很好用:

var dHtml = $('<div></div>').html(sHtml);

这会将整个头部和身体部位放在单个顶级div中。输入字符串中的DOCTYPE行没问题。 jQuery find()可以找到所有内容。