attr(),prop()二者区别和最佳实践

    最近使用到attr()来获取自定义属性值,我印象中是有一个方法可以获取到自定义属性值,进而我又想到了另一个方法prop()。  查看了手册发现并没有对二者有过多的阐述,但是prop方法里面有一段话引起我的注意:随着一些内置属性的DOM元素或window对象,如果试图将删除该属性,浏览器可能会产生错误。而手册removeAttr方法里面说1.6以下版本在IE6使用JQ中的removeAttr方法删除disabled是无效的,解决的办法是使用$("xx").prop("disabled", false);解决,1.7版本在IE6下已经支持disabled。

    这正是我要说明的,prop方法在处理固有属性特别是表单元素的disabled,selected,checked属性时有奇效。这也就是为什么网上都是建议在处理固有属性时使用prop方法,而在处理自定义属性时使用attr()方法。

  自定义属性和固有属性

    固有属性: 对于HTML元素而言,本身就带有的属性,也可以理解为W3C标准里面这个元素包含有的属性。

    自定义属性: 对于HTML元素而言,本身不具有的属性,是我们自己定义名字并给予赋值的属性。

如:

 <a href="http://www.baidu.com" target="_blank"  class="anchor" data-id="one">百度</a>

    a标签href, targer, class是固有属性,而data-id是我们自己定义的,属于自定义属性。

  代码测试

    下面我将进行代码测试,就attr(),prop()方法在获取和设置固有属性与自定义属性时的情况进行讨论。

    获取值测试

    如上a标签,使用语句在控制台输出:

 console.log( $(".anchor").attr("target") );   // _blank
console.log( $(".anchor").attr("data-id") ); // one
console.log( $(".anchor").prop("target") ); // _blank
console.log( $(".anchor").prop("data-id")); // undefined

    attr方法都获取到正确的值,而prop方法在获取自定义属性data-id时,显然没有起到作用。注意此时不管是固有属性还是自定义属性,我们都有写出来并进行了赋值,若要获取没有写出的固有属性和自定义属性值呢?有是什么情况?将a标签改为:

<!--   在固定属性target, 自定义属性tdata-id都没有在时    -->
<a href="http://www.baidu.com" class="anchor">百度</a>

    在控制台输出值:

 console.log( $(".anchor").attr("target") );   // undefined
console.log( $(".anchor").attr("data-id") ); // undefined
console.log( $(".anchor").prop("target") ); // ''空字符串
console.log( $(".anchor").prop("data-id") ); // undefined.

    attr()都输出undefined,prop()对于固有属性输出空字符串,自定义属性输出undefine。若a标签再改为:

 <!--      自定义属性data-di为空字符串时 分别使用attr(), prop()获取data-id的值    -->
<a href="http://www.baidu.com" class="anchor" data-id="">百度</a>

    在控制台输入:

 console.log( $(".anchor").attr("data-id") );   // '' 空字符串
console.log( $(".anchor").prop("data-id") ); // undefined

    此时attr()输出''空字符串,而prop()依然是undefine。最后我再将a标签改为:

 <!--   固有属性target为空字符串时,分别使用attr(),prop()获取值     -->
<a href="http://www.baidu.com" target="" class="anchor" >百度</a>

    此时我相信已经很容易猜出这两个方法输出的值是什么了。如下:

 console.log( $(".anchor").attr("target") );   // '' 空字符串
console.log( $(".anchor").prop("target") ); // '' 空字符串

    你有发现规律了吗?现在进行总结:①使用attr()方法只要没有被显示赋值,那么获取属性值不管是固定属性或自定义属性,那么返回值都是undefined。(个人感觉这个是机制和表单属性的特殊性导致attr方法在获取固定属性值时很容易出现问题)②使用prop()方法只要是自定义属性都返回undefined,而对于固定属性总是返回其原生状态的值(比如:target属性没有写出时,获取值为空字符串,表单属性checked没有写出时,获取值为false)

    设置值测试

    a标签如下:

 <a href="http://www.baidu.com" target="_blank"  class="anchor" data-id="one">百度</a>

    使用attr()设置,测试代码如下:

 $(".anchor").attr("target","_self");
$(".anchor").attr("data-id","two");
/* 设置成功,且DOM中的属性值确实已经改为_self, two */ /* 使用attr()方法获取自定义和固定属性值 */
console.log( $(".anchor").attr("target") ); // _self
console.log( $(".anchor").attr("data-id") ); // two /* 使用prop()方法获取自定义和固定属性值 */
console.log( $(".anchor").prop("target") ); // _self
console.log( $(".anchor").prop("data-id")); // undefind

    attr()方法设置值都是成功的,且可以正常获取值。prop()方法,老样子对自定义属性并不感冒。

    使用prop()设置,测试代码如下:

 $(".anchor").prop("target","_self");
$(".anchor").prop("data-id","two"); //赋值无效? /* DOM中target值已经变为_self,而data-id的值还是one */
console.log( $(".anchor").attr("target") ); // _self
console.log( $(".anchor").attr("data-id") ); // one /* 在DOM中target值已经为_self,但是data-id的值还是one */
console.log( $(".anchor").prop("target") ); // _self
console.log( $(".anchor").prop("data-id")); // two

    使用prop()方法设置值,固定属性是设置成功的,但是自定义属性赋值无效,在DOM中data-id值还是“one”。特别注意使用prop()设置后,再使用prop方法获取值,是可以获取到正确的值的,但是并没有什么用。

  总结

    前面提到表单元素属性的特殊性,例如选中复选表框,我们可以写checked="true"或checked="checked"都是可以的。

    我们就举checked属性来说,很奇怪,使用prop()获取表单属性的值总是返回布尔值,而attr()获取表单属性的值不是undefined不是就是'checked'。分析如下:

 <!--    此时复选框1是没有checked="true"    -->
<input id="chk1" type="checkbox" />复选框1
<input id="chk2" type="checkbox" checked="checked" />复选框2
// prop方法获取值
console.log( $("#chk1").prop("checked") ); // false
console.log( $("#chk2").prop("checked") ); // true
// attr方法获取值
console.log( $("#chk1").attr("checked") ); // undefined
console.log( $("#chk2").attr("checked") ); // checked
 <!--   此时复选框1是有checked="true"      -->
<input id="chk1" type="checkbox" checked="true" />复选框1
<input id="chk2" type="checkbox" checked="checked" />复选框2 console.log( $("#chk1").prop("checked") ); // true
console.log( $("#chk2").prop("checked") ); // true console.log( $("#chk1").attr("checked") ); // checked
console.log( $("#chk2").attr("checked") ); // checked

  最后最佳实践是自定义属性的设置和获取我们可以使用attr()方法来完成,而固有属性我们可以使用prop()设置和获取。特别注意在表单属性这块我们强烈推荐使用prop()方法且其返回值是布尔值,在写JS时可帮助判断。网上有很多存在说checked="checked"存在,但是却不打勾的情况。解决的办法就是使用  $(element).prop('checked', true/false);  因此在涉及表单属性和属性值时,使用prop()方法可以起到奇效。

  

attr(),prop()二者区别和最佳实践的更多相关文章

  1. JQUERY attr prop 的区别 一个已经被淘汰

    在做jquery 全选 全不选的项目中, 1..prop( propertyName ) 获取匹配集合中第一个元素的Property的值 2. .prop( propertyName, value ) ...

  2. jquery中attr() & prop() 的区别与其实现方法

    $(function(){ $('#check').attr('checked'); // undefind ???一头雾水 }) 在jquery中 attr 本来就是用来设置或者获取属性的,可是上面 ...

  3. requireJS的匿名模块和命名模块的区别和最佳实践

    requirejs是一个简单的javascript框架,支持模块化编码和模块的异步载入. 在requireJS中模块能够分为:匿名模块和命名模块这2种. requireJS定义一个匿名模块 defin ...

  4. attr 和 prop的区别和使用

    一. attr和prop的区别 要想弄清楚attr和prop的区别,就要先搞清楚js中使用DOM方法获取设置属性和使用对象方法获取设置属性的区别. 在javascript中使用DOM方法设置获取属性值 ...

  5. jquery中attr和prop的区别、 什么时候用 attr 什么时候用 prop (转自 芈老头 )

    jquery中attr和prop的区别. 什么时候用 attr 什么时候用 prop   在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这 ...

  6. 【jQuery 区别】attr()和prop()的区别

    1>>> 今天实现一个 点击更新按钮 ,可以勾选上本行的的checkbox的功能: 使用代码: /** * updateproduct.htmls 更新 产品信息 */ $(docu ...

  7. jquery中prop()方法和attr()方法的区别浅析

    官方例举的例子感觉和attr()差不多,也不知道有什么区别,既然有了prop()这个新方法,不可能没用吧,那什么时候该用attr(),什么时候该用prop()呢 jquery1.6中新加了一个方法pr ...

  8. jQuery中.attr()和.prop()的区别

    之前学习jQuery的时候,学习到了两种取得标签的属性值的方法:一种是elemJobj.attr(),另一种是elemJobj.prop().而在学习JS的时候,只有一种方法elemObj.getAt ...

  9. jquery中attr和prop的区别(转)

    在网络上看到这样一篇关于jquery中attr和prop的区别文章,觉得不错,所以转载了. 在jQuery 1.6中,.attr()方法查询那些没有设置的属性,则会返回一个undefined.如果你要 ...

随机推荐

  1. 容器云平台使用体验:数人云Crane(续)

    数人云在9月6日开通了容器管理面板Crane的试用活动,这是国内首个基于DockerSwarmKit的容器管理工具.它具有Docker原生编排功能,采用轻量化架构,帮助开发者快速搭建DevOps环境, ...

  2. AtCoder Regular Contest 090 D - People on a Line

    D - People on a Line Problem Statement There are N people standing on the x-axis. Let the coordinate ...

  3. 猜年龄v2.0

    ''' 用户登录,只有三次机会 给定年龄,用户可以猜三次年龄 年龄猜对,让用户选择两次奖励,输入无效字符,让其选择要不要礼物 用户选择两次奖励后可以退出,选择第一次后提示还有一次 ''' #基本信息定 ...

  4. 2019-5-25-win10-uwp-win2d-入门-看这一篇就够了

    title author date CreateTime categories win10 uwp win2d 入门 看这一篇就够了 lindexi 2019-5-25 20:0:52 +0800 2 ...

  5. sql函数的使用——系统函数

    n  sys_context 1)terminal:当前会话客户所对应的终端的标识符 2)lanuage:语言 3)db_name:当前数据库名称 4)nls_date_format:当前会话客户端所 ...

  6. 发布SaaS加速器:我们不做SaaS,我们只做SaaS生态的推进者和守护者

    摘要: 此次阿里云推出的SaaS加速器,涵盖商业中心.能力中心.技术中心三大板块,是阿里巴巴商业.能力和技术的一次合力输出:技术能力在这里沉淀为一个个模块,ISV和开发者只要通过简单的操作,写很少的代 ...

  7. @codeforces - 718E@ Matvey's Birthday

    目录 @description@ @solution@ @accepted code@ @detail@ @description@ 给定一个长度为 n 的字符串 s,保证只包含前 8 个小写字母 ' ...

  8. 高可用Kubernetes集群原理介绍

    ■ 文/ 天云软件 云平台开发工程师 张伟 1. 背景 Kubernetes作为容器应用的管理中心,对集群内部所有容器的生命周期进行管理,结合自身的健康检查及错误恢复机制,实现了集群内部应用层的高可用 ...

  9. iOS iOS8注册通知

    http://blog.csdn.net/apple_app/article/details/39228221 极光推送 action设置 http://docs.jpush.cn/display/d ...

  10. Android 在图片的指定位置添加标记

    这些天,项目里加了一个功能效果,场景是: 假如有一个家居图片,图片里,有各样的家居用品: 桌子,毛巾,花瓶等等,需要在指定的商品处添加标记,方便用户直接看到商品,点击该标记,可以进入到商品详情页 .实 ...