jQuery hasAttr检查元素是否有属性

Mar*_*ark 666 jquery

可能重复:
使用JQuery检查属性是否存在

你如何检查jQuery中的元素是否有属性?类似于hasClass,但有attr

例如,

if ($(this).hasAttr("name")) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

str*_*ger 1036

var attr = $(this).attr('name');

// For some browsers, `attr` is undefined; for others,
// `attr` is false.  Check for both.
if (typeof attr !== typeof undefined && attr !== false) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • @FuzzyDunlop,是的,但是如果`attr`是````那也将返回'false`.它应该是"true",因为空属性是有效属性.此外,不需要双倍 - 不是因为`if`无论如何都把它归结为bool. (35认同)
  • 做类似的事情可能会更好:if(typeof($(this).attr('name'))!='undefined'){// ...}因为undefined实际上可以使用一个简单的方法重新定义:undefined = 1 (19认同)
  • 怎么样http://api.jquery.com/has-attribute-selector/ (11认同)
  • 此测试实际上在chrome(可能是所有webkit)中失败,因为这些浏览器中不存在的属性返回'false'而不是undefined.karim79是如此接近,但这会更好:$ .fn.hasAttr = function(attr){var attribVal = this.attr(attr); return(attribVal!== undefined)&&(attribVal!== false); }; (7认同)
  • 我认为我们使用“||”而不是“&&” (4认同)
  • 根据http://api.jquery.com/attr``attr`返回`undefined`表示从jQuery v1.6开始尚未设置的属性(跨浏览器). (3认同)
  • @dmnc请不要!! 作为捷径.它不一样!如果属性值为""或"0",则会出现错误. (2认同)

Dom*_*nic 610

怎么样$(this).is("[name]")

[attr]语法是用于与属性的元素的CSS选择attr,并.is()检查是否它被称为在元件给定的CSS选择相匹配.

  • 如果你想首先选择所有带有name属性的项目,只需要做`$('[name]')` (7认同)
  • 注意:使用这个选择器它不会工作:`[camelizedAttr]` (5认同)

kar*_*m79 143

如果您经常检查属性的存在,我建议您创建一个hasAttr函数,以便在您的问题中假设使用:

$.fn.hasAttr = function(name) {  
   return this.attr(name) !== undefined;
};

$(document).ready(function() {
    if($('.edit').hasAttr('id')) {
        alert('true');
    } else {
        alert('false');
    }
});

<div class="edit" id="div_1">Test field</div>
Run Code Online (Sandbox Code Playgroud)

  • @ karim79:@ mhenry1384是对的,我认为你应该像strager在这里做的那样返回适当的值:http://stackoverflow.com/a/1318091/517705.所以也许`return(typeof this.attr(name)!=='undefined'&& this.attr(name)!== false);`会更好. (4认同)
  • @TreeUK - 不是拼写错误,!==是我的意思. (3认同)
  • 很酷,我以前没见过:) [!==不完全等于(值和类型)] (2认同)

Tri*_*ith 90

你太近了,这很疯狂.

if($(this).attr("name"))
Run Code Online (Sandbox Code Playgroud)

没有hasAttr但按名称命中属性只会返回undefined(如果它不存在).

这就是下面的原因.如果从#heading中删除name属性,则会触发第二个警报.

更新:根据评论,如果属性存在,则以下将起作用并且如果属性存在则设置为不存在但不为空

<script type="text/javascript">
$(document).ready(function()
{
    if ($("#heading").attr("name"))
      alert('Look, this is showing because it\'s not undefined');
    else
      alert('This would be called if it were undefined or is there but empty');
});
</script>
<h1 id="heading" name="bob">Welcome!</h1>
Run Code Online (Sandbox Code Playgroud)

  • 如果名称attr存在但空字符串,则该属性将存在,​​但测试将失败. (19认同)
  • 问题是询问属性是否存在,而不是如果它是空的则该怎么做. (5认同)
  • 而lambacck指出,至少有一种情况,即使属性存在,你的测试也会说它不是.如果属性的值是空字符串或0,则在标记中存在属性时将执行else子句 (3认同)
  • `'0' == 真;// 假` (2认同)

Dom*_*nic 77

晚了,但是......为什么不this.hasAttribute("name")呢?

请参阅

  • 或者如果你不在乎它不会在很多旧的浏览器和IE中工作 (17认同)
  • @baiano IE6和7是唯一不支持它的人,现在很好提,因为IE8几乎就是它的全部功能. (8认同)
  • 如果过时的浏览器不是问题,并且从2014年开始,这就是解决方案. (4认同)
  • @Harry,请注意,使用jQuery,它变成了`jquery_obj.get().hasAttribute("name")`,这当然意味着你只测试第一个元素.使用`each()`来检查当前`jquery_obj`中的所有元素.见http://api.jquery.com/get/ (3认同)

Jam*_*Gen 17

最好的方法是filter():

$("nav>ul>li>a").filter("[data-page-id]");
Run Code Online (Sandbox Code Playgroud)

拥有.hasAttr()仍然会很好,但因为它不存在就有这种方式.


rle*_*mon 7

Object.prototype.hasAttr = function(attr) {
    if(this.attr) {
        var _attr = this.attr(attr);
    } else {
        var _attr = this.getAttribute(attr);
    }
    return (typeof _attr !== "undefined" && _attr !== false && _attr !== null);      
};
Run Code Online (Sandbox Code Playgroud)

我在编写自己的函数的同时做了同样的事情,但我会分享以防万一其他人在这里绊倒.我添加了null,因为如果该属性不存在,getAttribute()将返回null.

此方法将允许您检查jQuery对象和常规javascript对象.


use*_*341 5

您还可以在表单字段等上使用诸如disabled ="disabled"之类的属性,如下所示:

$("#change_password").click(function() {
    var target = $(this).attr("rel");
    if($("#" + target).attr("disabled")) {
        $("#" + target).attr("disabled", false);
    } else {
        $("#" + target).attr("disabled", true);
    }
});
Run Code Online (Sandbox Code Playgroud)

"rel"属性存储目标输入字段的id.


bma*_*i44 5

我为jquery编写了一个hasAttr()插件,它将完全按照OP的要求完成所有这些操作.更多信息在这里

编辑: 我的插件被删除在2010年的插件.jquery.com数据库删除灾难中.你可以在这里查看一些关于自己添加它的信息,以及为什么没有添加它.