从 jQuery 选择中删除没有 id 的元素?

Posted

技术标签:

【中文标题】从 jQuery 选择中删除没有 id 的元素?【英文标题】:Removing elements without id from a jQuery selection? 【发布时间】:2012-02-20 12:20:55 【问题描述】:

如何从调用插件的集合(而不是 DOM 本身)中删除没有 id 属性的元素?

<span id="id737293" class="attach"></span>
<div class="attach"></span>

jQuery 调用和插件:

$('.attach').attach();

(function($) 

    $.fn.attach = function(options) 
       // Remove elements (without id) on which the plugin was invoked
       var valid = ???;

       // Loop each valid element (with id attribute) and process
       valid.each(function() 
       );

       return this; // Maintain chainability
    ;

)(jQuery);

【问题讨论】:

【参考方案1】:
var elementsWithClassAttachAndHasId = jQuery(".attach:has([id])");
var elementsWithClassAttachAndNoId = jQuery(".attach:not([id])");

【讨论】:

我想这将从集合和 DOM 中删除,对吧? 看起来问题已被编辑,我现在将编辑我的答案以匹配。【参考方案2】:

使用.filter 删除没有 ID 的元素。

(function($) 

    $.fn.attach = function(options) 
       // Remove elements (without id) on which the plugin was invoked
       var valid = this.filter(function()  return !!this.id; );

       // Loop each valid element (with id attribute) and process
       valid.each(function()                
       );

       return this; // Maintain chainability
    ;

)(jQuery);

$('.attach').attach();

http://jsfiddle.net/5Kn9W/2/

var valid = this.not(':not([id])'); - http://jsfiddle.net/5Kn9W/1/

【讨论】:

太棒了。据我了解,这只会过滤选择而不影响 DOM 或可链接性,对吗? @Gremo 是的,只有valid 变量会包含过滤后的元素列表。 没关系,但是过滤器函数应该返回有效元素(因此返回 this.id)......因为 jsfiddle 以红色显示无效元素;) 既然可以使用选择器,为什么还要使用过滤器?在这里使用函数似乎很愚蠢。 因为在插件内部你无法控制用于调用插件的选择器。【参考方案3】:
 if(!$(elem).prop("id"))
   $(this).remove()

【讨论】:

这会破坏可链性吗?我的意思是我想循环选择的每个有效元素,但不从 DOM 本身中删除元素。 你只需要检查 if(!$("some element").prop("id")) 而不是做某事

以上是关于从 jQuery 选择中删除没有 id 的元素?的主要内容,如果未能解决你的问题,请参考以下文章

JQuery中查找父元素,子元素,追加元素,插入元素和删除元素

如何使用Jquery / JavaScript完全删除canvas元素?

jQuery遍历not的用法

JQuery学习历程2.JQuery选择器

Jquery如何选取元素及其所有子元素?

jQuery 中的 DOM 选择器,用于没有 ID 或 CLASS 名称标签的元素