1

需要从 DOM 元素中获取所有直接节点,实际上并不知道它们有多少以及它们是什么类型。 .contents()? 好吧,让我们来看看..

$('<div />').html('<p>p</p>').contents()-> [<p>​p​&lt;/p>​]

好的。

$('<div />').html('textNode').contents()->[]

怎么回事?

$('<div />').html('textNode').append('another').contents()-> ["textNode", "another"]

好的,那么单个文本节点呢?

4

2 回答 2

2

我不知道这是否有帮助。不久前,我使用 JSON 样式的输入构建了一个文档片段生成器。我还为它写了一个(有点工作的)反向函数,这样你就可以把你的 nodeList 变成一个 JSON 字符串。

https://gist.github.com/2313580

var reverseFunction = function(DOM /* DOM tree or nodeList */) {
    var tree = [];[].forEach.call(DOM, function(obj) {
        if (obj instanceof Text) {
            tree.push({
                'textContent': obj.textContent
            });
        } else {
            var tmp = {};
            tmp['tagName'] = obj.nodeName;
            for( var data in obj.dataset ) {
                tmp['data-' + data] = obj.dataset[data];
            }
            for (var i = 0, l = obj.attributes.length; i < l; i++) {
                var key = obj.attributes[i].name,
                    val;
                if (key.indexOf('data-') === -1) {
                    switch (key) {
                    case ('class'):
                        key = 'className';
                        break;
                    case ('style'):
                        val = {};
                        obj.attributes[i].value.split(';').forEach(function(rule) {
                            var parts = rule.split(':');
                            val[parts[0]] = parts[1];
                        });
                        break;
                    };
                    tmp[key] = val || obj.attributes[i].value;
                }
            }
            if (obj.childNodes.length > 0) {
                tmp['childNodes'] = reverseFunction(obj.childNodes);
            }
            tree.push(tmp);
        }
    });
    return tree;
};

这确实找到了 textNodes 并将它们分开......你也许可以从中提取一些东西。

更新:回答上述问题中的评论...

var div = document.createElement('div');
div.appendChild(document.createTextNode('dsf'));
console.log( div.childNodes.length, div.childNodes, div.childNodes[0].textContent);​

我希望这对你来说更有意义。该数组在控制台中显示为空,但不是。检查长度并尝试访问它,你会看到。

于 2012-04-19T14:35:52.293 回答
-1

.contents() 与 DOM 节点有关。第二个示例中的字符串不是 DOM 元素。

于 2012-04-19T14:39:15.233 回答