【问题标题】:Exclude matched DOM & children from selection?从选择中排除匹配的 DOM 和子项?
【发布时间】:2014-09-04 22:08:13
【问题描述】:

我想从 DOM 中选择一组元素及其子元素。

然后,我想在 DOM 上运行一组排除这些元素的选择,就好像它们已被删除一样。

.not() 似乎同时匹配父元素和子元素,并且没有正确排除。

.find(':not(.myclass)') 返回一个包含大约 bajillion 元素的列表,并且没有正确排除。

我有什么问题?这看起来很简单,但我希望执行此操作的功能并没有像我预期的那样运行。

我想过克隆 DOM,删除元素,然后在克隆的 DOM 上运行我的选择匹配...但这似乎 不好。就像,性能受到重大影响。

最好的方法是什么?

这是我的代码:

jQuery('html').not(".page-node,.quote").find(selector).each(function(){
//do stuff here to returned elements

.page-node 是一个 body 类,应该在几乎所有页面上返回 body 元素,并排除选择器在这些页面上的匹配。

编辑:我创建了一个 jsFiddle 来演示我在说什么:http://jsfiddle.net/glassdimly/H4tJe/4/

【问题讨论】:

  • not() 不会匹配父母和孩子。如果无法针对实时 html 进行测试以查看您的问题所在,那么任何人都很难提供帮助。 jsfiddle.net 上的演示会有所帮助
  • 听起来你需要一个filter,一个closest('.page-node') 等等,但是用有点模糊的描述很难说出来?
  • 好的,伙计们,我添加了一个 jsFiddle。如果不清楚,请告诉我:jsfiddle.net/glassdimly/H4tJe/4

标签: javascript jquery dom jquery-selectors


【解决方案1】:

Not() 与适当的后代选择器一起工作。跟随任何选择器的* 将匹配所有后代(子代、孙代等)。通过在not 中应用它,您可以要求从匹配中排除所有后代。由于您还想排除父级,请将其包含在 not 中:

例如

$(selector).not(".page-node,.page-node *,.quote,.quote *")

相当于: “没有page-node 的班级或page-node 的孩子/后代”或“没有quote 的班级或quote 的任何孩子/后代”

更新的 JSFiddle:http://jsfiddle.net/TrueBlueAussie/H4tJe/7/

jQuery(document).find('.list').not('.exclude,.exclude *').each(function(){
    this.remove();
});

这相当于“查找所有具有类 list 的项目,但排除任何也具有类 exclude 的项目,并排除任何具有类 exclude 的元素的任何后代”

【讨论】:

  • 谢谢。但我想删除“选择器”的父级,导致“选择器”不尝试匹配被排除的父级。
  • 规则何时改变:“一组元素及其子元素”? :)
  • @Jeremy John:更新了你的小提琴,展示了如何使用后代选择器。
  • 完美,感谢您花时间向我解释。我缺少的是 * 选择器。
猜你喜欢
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2013-01-23
相关资源
最近更新 更多