jQuery.filter可以在body标签上工作吗?

Rob*_*bin 4 javascript jquery

我正在使用jQuery过滤ajax响应来提取返回的页面的主体并替换当前页面.我发现,如果我过滤"body"上的响应,它什么也不返回.

例如,要在此页面的控制台中模拟此操作,我可以运行:

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

返回:

[]
Run Code Online (Sandbox Code Playgroud)

但是,如果我跑:

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

我明白了:

[<title>?Can jQuery.filter work on the body tag? - Stack Overflow?</title>?]
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么或这是一个错误?

Tob*_*ogh 6

更详细地回答一下:这里的真正问题$()是用来包装来自的字符串$("html").html().根据jQuery文档:

从提供的原始HTML字符串动态创建DOM元素.

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

一旦你使用$一个字符串你获得一个解析的集合...但这可能会删除你想要使用的一些数据...一个文档中不允许两个body元素

但是$("html").children().filter("body")会起作用,所以一般来说我会回答你的问题,是的,它可以

我认为你已经找到了解决方案;)但是只是提到它:我强烈建议跳过$调用并简单地使用本机方法,如substring和indexOf

// try in the browser console
var myString = "<html><head></head><body>foobar</body></html>";
myString.substring(myString.indexOf("<body>"), myString.indexOf("</body>") + 7);
"<body>foobar</body>"
Run Code Online (Sandbox Code Playgroud)

对于ajax响应,它应该以完全相同的方式工作,因为它是纯字符串.如果不需要提取body标签:

// try in the browser console
var myString = "<html><head></head><body>foobar</body></html>";
myString.substring(myString.indexOf("<body>") + 6, myString.indexOf("</body>"));
"foobar"
Run Code Online (Sandbox Code Playgroud)

注意:在查看性能时,本机操作的执行时间不到重新.html()调用和调用所需的时间的一半.filter()