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

时间:2012-06-12 04:59:12

标签: javascript jquery

我正在使用jQuery过滤ajax响应,以提取返回的页面的主体并替换当前页面。我发现,如果我过滤“body”上的响应,则不会返回任何内容。

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

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

返回:

[]

但是,如果我跑:

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

我明白了:

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

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

1 个答案:

答案 0 :(得分: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()

所需时间的一半。