选择具有空或未指定属性的元素

Mat*_*ias 6 html javascript jquery css-selectors

采取以下原理图html代码:

<div>
  <span id='1' cust-attr='' />
  <span id='2' />
  <span id='3' cust-attr='Foo' />
</div>
Run Code Online (Sandbox Code Playgroud)

现在我正在寻找一个选择器,找到所有span没有属性"cust-attr"或其"cust-attr"值为空的s.
在这种情况下,这将是1和2.

我尝试了以下选择器,结果如下:

  1. span[cust-attr!=] 选择2和3
  2. span[cust-attr=''] 只选1
  3. span:not([cust-attr]) 选择2
  4. span(:not([cust-attr]),[cust-attr='']) 选择所有三个
  5. span([cust-attr=''],:not([cust-attr])) 选择1

但是,我没有找到只选择1和2的人
.你知道有可能吗?

请注意,我想避免:

span:not([cust-attr]),span[cust-attr='']
Run Code Online (Sandbox Code Playgroud)

因为"跨度"实际上是一种更复杂的表达.

Jef*_*ffC 7

迟到了...

...或者你可以使用CSS选择器,并且速度是jQuery答案的10倍...... :)

document.querySelectorAll("input:not([id]), input[id='']");
Run Code Online (Sandbox Code Playgroud)

证明


lon*_*day 6

基本上,不要.

将所有逻辑放入选择器并不是一种好习惯.它最终会在计算上非常昂贵(因为这些部分需要在解释之前从字符串中解析出来)并且非常混乱.使用该filter方法的美丽:

$('span')
    .filter(function(){
        return !$(this).attr('cust-attr');
    });
Run Code Online (Sandbox Code Playgroud)

cust-attr将从选择中删除所有非空字符串的元素.

  • 嗯?这可能会更慢,您在每次迭代时都在构建一个新的 jQuery 实例。在更现代的浏览器(支持 `querySelectorAll` 的浏览器)中,选择器会更快。请告诉我,`this['cust-attr']` 有什么问题? (3认同)