【问题标题】:javascript strip text nodes from a NodeListsjavascript 从 NodeLists 中剥离文本节点
【发布时间】:2012-08-06 03:11:40
【问题描述】:

我发现自己的情况是,我得到了一个 NodeList,我试图将其放入 jQuery 对象中进行操作。问题是数组还包括文本节点、注释节点等,当你说$(nodeList) 时似乎会混淆 jQuery。

我使用下划线创建了一个快速的clean 函数,该函数去除了 DOM 元素并将它们作为数组返回:

_.mixin({
    clean: function(nodeList) {
        return _(nodeList).filter(function(node) {
            return node.nodeType == 1;
        });
    }
});

$(_(nodeList).clean()) 给了我一个可用的 jQuery 对象。

有没有更好的方法来解决这个问题?

谢谢。

【问题讨论】:

  • @jfriend00 它是 underscore.js (underscorejs.org) 的一部分。另外,OP,试试codereview.stackexchange.com
  • 这是下划线问题还是 jQuery 问题? OP 在问题中引用了 jQuery,但在标签中都包含了这两者。
  • @jfriend00 这是一个“如何从 NodeList 中剥离除元素节点之外的所有节点?”问题。
  • @SomekidwithHTML 我并不是真的在寻找我的解决方案的评论。我觉得我根本不需要这样做。我包含了我的 underscorejs mixin 来说明问题,而不是展示解决方案。

标签: jquery dom underscore.js textnode


【解决方案1】:

我真的不确定你在问什么问题,但这是一个有效的 jQuery 实现,它从 jQuery 对象中过滤掉非元素:

jQuery.fn.clean = function() {
    return this.filter(function() {
        return(this.nodeType == 1);
    });
}

var nodes = document.getElementById("container").childNodes;
var $elements = jQuery(nodes).clean();

还有一个工作演示:http://jsfiddle.net/jfriend00/RV6H7/

jQuery 有一个执行此类操作的内部函数,但我不知道有任何内置的公共方法可以执行此操作。

【讨论】:

  • 谢谢。把它放在 jQuery 中可能会更好,但我的问题是:jQuery 不是已经这样做了吗?我的小 2 行功能看起来非常简单。这真的是最好的方法吗?
  • @nicholas - jQuery 对象可以包含非元素,一些 jQuery 方法可以做到这一点。我不知道内置 jQuery 方法采用 nodeList 并将其过滤为 elementList,尽管许多内部函数进行自己的过滤,因为大多数 jQuery 函数只返回元素,但很多 DOM 迭代迭代所有节点,而不仅仅是元素。如果您已经有nodeList,我不知道有更好的方法来做您在 jQuery 中提出的要求。
  • @nicholas - 我应该补充一点,如果您执行正常的 jQuery 选择器操作,它将仅返回元素(在内部进行自己的过滤)。但是,您说您从nodeList 开始,而不是选择器操作,这不是 jQuery 通常使用的方式,这可能是它不自动进行过滤的原因。
【解决方案2】:

简单地说:jQuery( nodelist ).filter( '*' ) 怎么样?

这将过滤除元素节点之外的所有内容,只使用 vanilla jQuery。

【讨论】:

    猜你喜欢
    • 2022-12-27
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2011-06-04
    相关资源
    最近更新 更多