使用jQuery搜索HTML字符串

ipr*_*101 31 javascript jquery jquery-selectors

如果我运行此代码 -

var html= '<html><head></head><body><div class="bar"></div></body></html>';
console.log($(html).find('div'));
Run Code Online (Sandbox Code Playgroud)

如果我运行此代码,我没有返回任何结果 -

var html= '<html><head></head><body><div><div class="bar"></div></div></body></html>';
console.log($(html).find('div'));
Run Code Online (Sandbox Code Playgroud)

然后我得到一个返回的结果 - 内部div(<div class="bar"></div>).我原本期望第一个代码片段返回单个结果,第二个代码片段返回两个结果.

同样,此代码不返回任何结果 -

var code = $("<div id='foo'>1</div><div id='bar'>2</div>");
console.log(code.find('div'));
Run Code Online (Sandbox Code Playgroud)

但是这段代码警告'div'两次 -

var code = $("<div id='foo'>1</div><div id='bar'>2</div>");
code.each(function() {
    alert( this.nodeName );
})
Run Code Online (Sandbox Code Playgroud)

鉴于第二个片段的结果,我原本期望第一个代码片段返回两个结果.有人可以解释为什么我得到的结果我得到了吗?

http://jsfiddle.net/ipr101/GTCuv/

Dig*_*ane 38

我们将这个问题分成两部分.

第一:

var html= '<html><head></head><body><div class="bar"></div></body></html>';
console.log($(html).find('div'));
Run Code Online (Sandbox Code Playgroud)

var html= '<html><head></head><body><div><div class="bar"></div></div></body></html>';
console.log($(html).find('div'));
Run Code Online (Sandbox Code Playgroud)

不工作,因为根据jQuery()文件:

传递复杂的HTML时,某些浏览器可能无法生成完全复制所提供的HTML源的DOM.如上所述,我们使用浏览器的.innerHTML属性来解析传递的HTML并将其插入到当前文档中.在此过程中,一些浏览器过滤掉某些内容,如<html>,<title><head> 元件.结果,插入的元素可能不代表传递的原始字符串.

  • 在第一个代码块中,您的<html>,, <head><body>标签被剥离,并且<div class="bar"></div>仍然存在.find只搜索结果<div>,并找不到任何东西.
  • 在第二个代码块中,您的<html>,, <head><body>标签被剥离,并且<div><div class="bar"></div></div>仍然存在.find在结果中搜索,并找到一个<div>.

至于你的第二部分:

var code = $("<div id='foo'>1</div><div id='bar'>2</div>");
console.log(code.find('div'));
Run Code Online (Sandbox Code Playgroud)

你首先给jQuery一个字符串,然后把它变成一个带有两个字符串的jQuery对象<div>.然后,find在每个搜索中<div>找不到任何内容并且不返回任何结果.

接下来,在

var code = $("<div id='foo'>1</div><div id='bar'>2</div>");
code.each(function() {
    alert( this.nodeName );
})
Run Code Online (Sandbox Code Playgroud)

each循环遍历jQuery对象,获取两个创建<div>的每个对象,并提醒其节点名称.因此,您会收到两个警报.


vic*_*cky 17

答案很简单.当你使用jQuery(html)创建对象时,它会创建一个节点层次结构,当你找到一个像'div'这样的节点时,它会搜索整个层次结构,除了根元素,在你的第一个例子中,你没有子节点'div'节点.在第二个例子中,您只有一个子节点"div"节点.

因此,如果在整个层次结构中保留一个额外的根节点,则可以轻松找到所有节点.喜欢

var html= '<html><head></head><body><div class="bar"></div></body></html>';
console.log($('<div></div>').append(html).find('div'));

var html= '<html><head></head><body><div><div class="bar"></div></div></body></html>';
console.log($('<div></div>').append(html).find('div'));
Run Code Online (Sandbox Code Playgroud)


小智 6

简单的方法如下:

鉴于字符串:

var html= '<html><head></head><body><div class="bar"></div></body></html>';
Run Code Online (Sandbox Code Playgroud)

使用类栏搜索 div:

$(html).filter('.bar')
Run Code Online (Sandbox Code Playgroud)

或所有 div:

$(html).filter('div')
Run Code Online (Sandbox Code Playgroud)

返回带有类的对象 bar