【问题标题】:Select elements by attribute按属性选择元素
【发布时间】:2009-07-08 11:39:24
【问题描述】:

我有一组带有生成 id 的复选框,其中一些具有额外的属性。是否可以使用 JQuery 来检查元素是否具有特定属性? 例如,我可以验证以下元素是否具有属性“myattr”吗?属性的值可以变化。

<input type="checkbox" id="A" myattr="val_attr">A</input>

例如,如何在不逐一检查的情况下获取具有此属性的所有复选框的集合?这可能吗?

【问题讨论】:

  • 顺便说一句, 是一个空标签,并不意味着其中包含内容。也许你不关心验证看到你有 myatttr...
  • 如果你已经有一个集合并且你想只过滤掉具有特定属性的元素 - 就这样做 - $filtered = $collection.filter('[attribute_name]');

标签: jquery attributes


【解决方案1】:
if ($('#A').attr('myattr')) {
    // attribute exists
} else {
    // attribute does not exist
}

编辑:

myattr 存在但为空字符串或“0”时,上述内容将落入else 分支。如果这是一个问题,您应该在 undefined 上明确测试:

if ($('#A').attr('myattr') !== undefined) {
    // attribute exists
} else {
    // attribute does not exist
}

【讨论】:

  • 不是一个很好的答案。 “未定义”不是 Javascript 中的关键字。见constc.blogspot.com/2008/07/…
  • 你是对的......但是重新定义undefined 被认为是一种极端情况,上面的比较适用于所有情况的 99%。
  • 如果属性为空字符串则不起作用。一个例子是 myattr=''
  • @mhenry - 那你就错了:) 如果你是为我或与我一起构建项目,我会要求你修复你的错误。如果它是一个开源包,那么我(以及许多用户)会以编码不佳为由停止使用它。如果您不更改它,那么其他人最终会派生一个没有错误的版本,而人们会使用它,并且您会丢失自己的项目,就像以前有人创建一个不错的包时发生的那样执行不力。无论哪种方式,它都会教您有关编码实践的课程:)
  • if (typeof $('#A').attr('myattr') !== 'undefined')
【解决方案2】:

你的意思是你能选择它们吗?如果是,那么是的:

$(":checkbox[myattr]")

【讨论】:

  • 请注意,如果您正在测试是否存在(例如,可能在 if 语句中),这样做可能更正确/更可靠: if($(":checkbox[myattr]").length ()>0)...
  • @rinogo:实际上你只需要 if($(":checkbox[myattr]").length) 。长度后的 () 不是必需的,> 0, 0 在不需要严格相等(值和类型)的相等测试中也不会计算为假。
  • 如果你尝试类似 :td[myattr] 的话,它会抛出 js 错误。所以我认为这个功能专门针对复选框。
  • 冒号选择伪类,由类型attr决定。要将相同的内容应用于 td,只需省略冒号即可。
  • 或者如果您想查看某些内容是否没有属性,例如查找所有没有href 属性的链接。 $("#myBox").find('a').filter(':not([href])')
【解决方案3】:

我知道这个问题已经很久没有提出来了,但我发现支票更清楚了:

if ($("#A").is('[myattr]')) {
    // attribute exists
} else {
    // attribute does not exist
}

(如在本网站上找到的 here

关于is的文档可以在here

找到

【讨论】:

  • 根据W3C,布尔属性由属性的存在或不存在来定义。 jQuery 提供方法 .attr() 来操作属性值。但是我们如何添加一个没有值的属性呢? jQuery 文档 (1.8.2) 中没有描述您提供的用于测试属性是否存在的方法。你知道如何用 jQuery 添加属性吗?
  • @chmike 要添加一个属性,我会这样做: $("#A").prop("myNewAttribute", someValue);您可以为 someValue 提供您选择的任何值:字符串、数字、空字符串、真/假。
  • 这将添加具有分配值的属性,这与没有值的属性不同。
  • 我同意,这是最好的答案(使用 jQuery)——非常简洁明了。我确实发现自己想知道为什么 jQuery 不只是有一个 hasAttribute() 函数,答案是,原生 javascript 已经有一个。任何 HTML Dom 元素都有一个方法 hasAttribute('attributeName')。所以你可以这样做: $('#A')[0].hasAttribute('myattr') @chmike - 我认为你不能使用 jQuery 函数添加一个空属性,但你可以使用 HTML Dom Element对象以类似的方式如下: $("#A")[0].setAttributeNode(document.createAttribute("myNewAttribute"));
  • 只是一个评论,我喜欢这个答案,但对 cme​​ts 询问如何添加没有值的属性感到困惑。这些与问题或答案无关。
【解决方案4】:

这将起作用:

$('#A')[0].hasAttribute('myattr');

【讨论】:

  • @RetroCoder,您对您的链接有何看法?这个测试看起来相当不错,尤其是因为你经常使用$(this).&lt;something&gt;,而在这里你可以直接使用this.hasAttribute('...')(当然不用关心旧的浏览器。)
【解决方案5】:

在 JavaScript 中,...

null == undefined

...返回true*。这是===== 之间的区别。此外,可以定义名称 undefined(它不是像 null 这样的关键字),因此您最好检查其他方式。最靠谱的方法大概就是比较typeof操作符的返回值了。

typeof o == "undefined"

不过,在这种情况下,与 null 比较应该可以工作。

* 假设 undefined 实际上是未定义的。

【讨论】:

  • Undefined 不是 JavaScript 中的保留关键字。在 jQuery 中,完全可以修改它的名称,因为它是用“var”构造函数构造的,并且没有被赋值。事实上,在魔术库代码的顶部,有一行声明“var undefined;”这样,在 jQuery 范围内使用该名称定义了一个未定义的变量......但它可以通过键入“var unnamed;”来命名为“unnamed”
  • 这不是检查属性,而是检查 javascript 对象中的属性,为什么这有 6 个赞成票?
【解决方案6】:

$("input[attr]").length 可能是更好的选择。

【讨论】:

    【解决方案7】:

    使用“typeof”、jQuery“.is”和“.filter”提出了一些想法,所以我想我会发布一个对它们的快速性能比较。 typeof 似乎是最好的选择。虽然其他方法可以工作,但在为此工作调用 jq 库时似乎存在明显的性能差异。

    【讨论】:

      【解决方案8】:
      if (!$("#element").attr('my_attr')){
        //return false
        //attribute doesn't exists
      }
      

      【讨论】:

      • 这可能行不通,因为您可以添加没有值的属性。在这种情况下,此条件将通过,尽管所需的行为可能是返回 true,但该属性已设置。类似于 PHPs isset() 或例如在 js 中 $("#element").attr('my_attr') === false,
      【解决方案9】:

      this post,使用.is和属性选择器[],你可以很容易地添加一个函数(或原型):

      function hasAttr($sel,attr) {
          return $sel.is('['+attr+']');
      }
      

      【讨论】:

        【解决方案10】:
        $("input#A").attr("myattr") == null
        

        【讨论】:

        • $().attr() 不会像我们的示例所建议的那样返回 null,而是返回 undefined。
        • 在萤火虫中为我工作,但这可能是萤火虫的事情
        • 没试过,但是文档是这么说的:docs.jquery.com/Attributes/attr#name
        【解决方案11】:

        除了选择具有$('[someAttribute]')$('input[someAttribute]') 属性的所有元素之外,您还可以使用函数对对象进行布尔检查,例如在点击处理程序中:

        if(! this.hasAttribute('myattr') ) { ...

        【讨论】:

          【解决方案12】:

          基于多个属性获取所有 checkbox 元素的集合,例如在这种情况下idmyattr

          var checkboxCollection = $(":checkbox[id][myattr]");
          

          如果您需要为集合中的每个复选框分配事件处理程序:

          $(":checkbox[id][myattr]").change(function() {
              if(this.checked) {
                  var valueOfAttribute = $(this).attr('myattr');
                  // code here
              }
              else{
                  // code here
              }
          });
          

          【讨论】:

            【解决方案13】:

            简单地说:

            $('input[name*="value"]')
            

            更多信息:official docs

            【讨论】:

            • 用双引号定义的字符串中未转义的双引号,不是有效的字符串。不幸的是,我无法为您编辑它,因为编辑必须更改 6 个或更多字符,但需要更改。
            【解决方案14】:

            我已经创建了具有上述预期行为的 npm 包。

            链接到[npm][github]

            用法很简单。例如:

            <p id="test" class="test">something</p>
            $("#test").hasAttr("class")
            

            返回真。

            也适用于驼峰式。

            【讨论】:

              【解决方案15】:

              要选择具有特定属性的元素,请参阅上面的答案。

              为了确定给定的 jQuery 元素是否具有特定属性,我使用了一个小插件,如果 jQuery 集合中的第一个元素具有此属性,则返回 true

              /** hasAttr
               ** helper plugin returning boolean if the first element of the collection has a certain attribute
               **/
              $.fn.hasAttr = function(attr) {
                 return 0 < this.length
                     && 'undefined' !== typeof attr
                     && undefined !== attr
                     && this[0].hasAttribute(attr)
              }
              

              【讨论】:

                【解决方案16】:

                如果属性存在于给定的 HTML 元素中,我们可以很容易地访问 value 属性值。

                var offORonlinePath="../img/";   //We can easy to change the path anytime
                var extension=".webp"; //we can later change any value like png,jpg,...
                
                $("img[data-src]").each(function(){
                  var imgName=$(this).data("src");
                
                  $(this).attr("src",offORonlinePath+imgName+extension);
                
                })
                

                【讨论】:

                  【解决方案17】:

                  JQuery 将属性作为字符串返回。因此,您可以检查该字符串的长度以确定是否已设置:

                  if ($("input#A").attr("myattr").length == 0)
                   return null;
                  else
                   return $("input#A").attr("myattr");
                  

                  【讨论】:

                  • 所以,我知道它已经过去一年多了,我早就应该解决它。我很好奇哪个部分没有工作?如果我知道您只是想选择它们,我就不会给出上面的代码。我以为你想单独检查它们。 JQuery 实际上确实将属性作为字符串返回,您可以像检查任何其他字符串一样检查该字符串的长度。因此,只要您的选择器和属性正确,您就应该能够测试特定输入是否具有该属性。无论如何,我只是不希望人们因为它确实有效而忽视这一原则。
                  • 它会在属性不存在的情况下失败,在这种情况下 $("input#A").attr("myattr") 返回 undefined 而不是字符串并且 undefined.length 将失败
                  • 仅检测空属性与包含内容的属性,在不存在的属性上失败。最初的问题是关于检测属性的存在,将其作为问题的答案失败。
                  猜你喜欢
                  • 2012-12-24
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-04-06
                  • 2021-08-30
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多