当前位置:  开发笔记 > 编程语言 > 正文

jQuery hasAttr检查元素是否有属性

如何解决《jQueryhasAttr检查元素是否有属性》经验,为你挑选了9个好方法。

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

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



1> strager..:
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) {
    // ...
}


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

2> Domenic..:

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

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


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

3> karim79..:

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

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

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

Test field


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

4> Tristan Warn..:

你太近了,这很疯狂.

if($(this).attr("name"))

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

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

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


Welcome!


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

5> Domenic..:

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

请参阅此


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

6> JamesM-SiteG..:

最好的方法是filter():

$("nav>ul>li>a").filter("[data-page-id]");

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



7> rlemon..:
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);      
};

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

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



8> user398341..:

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

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

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



9> bmarti44..:

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

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

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有