4

我正在使用 jQuery 过滤 ajax 响应以提取返回的页面正文并替换当前页面。我发现如果我过滤“body”上的响应,它什么也不会返回。

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

$($('html').html()).filter('body')

返回:

[]

但是,如果我运行:

$($('html').html()).filter('title') 

我得到:

[<title>​Can jQuery.filter work on the body tag? - Stack Overflow​&lt;/title>​]

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

4

1 回答 1

6

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

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

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

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

但是 $("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>"

对于 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"

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

于 2012-06-21T19:51:25.217 回答