jQuery在Firefox上解析原始HTML和hasOwnProperty

Jam*_*rgy 2 jquery

我使用$.get或加载一些HTML $.ajax.在Chrome和Firefox的调试器中,我可以看到html已正确加载:

>数据

"<html><head><title></title></head><body>
<div id="topdiv" style="display:none;width:880px; height:600px;"></div>
</body</html>"
Run Code Online (Sandbox Code Playgroud)

所以这是一串HTML.大.接下来我尝试使用jQuery来解析它:

$doc = $(data);

> $ doc

[<TextNode textContent="\n\n">, 
title, 
<TextNode textContent="\n\n\n">, 
div#topdiv, 
<TextNode textContent="\n \n">]
Run Code Online (Sandbox Code Playgroud)

哇,什么?在哪里html,head,body去了?好吧,无论如何,我关心的只是div

$div = $data.find('div');

> $ div

[]

咦?

好.div是空的.经过进一步的实验,我意识到jQuery基本上忽略了任何顶级标签.然后它实际上不允许你选择任何第二级标签,所以如果有一个div嵌套在外部div中,那么将被选中.但是......什么?

似乎jQuery对那些"TextNode"元素有点窒息,奇怪的是,它创建了自己(而不是html,body).所以我编写了一些代码,通过遍历元素并直接提取非文本节点来解决这个问题:

function getNodes($doc) {
    var result = new Array();
    for (var i = 0; i < $doc.length; i++) {
        if ($doc[i].hasOwnProperty("tagName")) {
            result.push($doc[i]);
        }
    }
    return $(result);
}
Run Code Online (Sandbox Code Playgroud)

工作得很好!在Chrome上.

在Firefox中尝试过,没有任何效果.

事实证明,并非Firefox中的每个对象都有一个hasOwnProperty功能.什么??好.所以重写到这个:

typeof($tempHtml[i].tagName) !== 'undefined'

最后,也适用于Firefox.

哇.我只是傻了吗?为什么只需要将一串HTML转换为jQuery对象就需要进行大量的后期处理?我觉得我必须遗漏一些明显的东西.有没有办法做到这一点,不涉及这种混乱?

我要做的就是加载一些HTML并将其转换为jQuery对象.然而,这似乎是一个越来越令人困惑的折磨.我只是做了一些根本错误的事情吗?为什么这么复杂?

Šim*_*das 5

阅读jQuery文档 - 它解决了这个问题.

当你有一个包含HTML字符串<html>,<head><body>元素,你这样做:

$(str)
Run Code Online (Sandbox Code Playgroud)

那些元素将被忽略.只有可以放在DIV中的元素才有效,并且会添加到生成的jQuery实例对象中.


$div = $data.find('div');
Run Code Online (Sandbox Code Playgroud)

这将导致一个空的jQuery对象,因为find()搜索当前元素集的后代(在你的情况下是一个TITLE元素和一个DIV元素 - 而这两个元素没有后代DIV元素).


为了从jQuery对象中删除Text Node对象,我推荐这种方法:

$data.filter(function() { return this.nodeType === 1; });
Run Code Online (Sandbox Code Playgroud)

为了获得DIV元素,我推荐这种方法:

$('<div>').html(str).find('div');
Run Code Online (Sandbox Code Playgroud)

str你的HTML字符串在哪里.


替代方法:

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