2019独角兽企业重金招聘Python工程师标准>>>

jQuery1.6中新添加了一个prop方法,看起来和用起来都和attr方法一样,这两个方法有什么区别呢?这要从HTMl 的attribute与property区别说起,attr与prop正是这两个东西的缩写。

attribute与property

attribute和property都可以翻译为属性,为了以示区别,通常把这两个单词翻译为属性与特性。

<div id="test">Click Here</div>

上面这段HTML语句中有三个节点,分别是Element “div”、attribute “id”、Text “click here”,我们最常见的attribute正式指的attribute类型节点,在JavaScript有专门处理attribute的函数 .getAttribute(name) / setAttribute(name,value)。当然attribute不只是我们能够在HTML文档上看到的这几个,我们可以自定义attributed加到DOM节点中

<div id="test">123</div><script type="text/javascript">        var t=document.getElementById('test');t.setAttribute('class','active');t.setAttribute('customizedAttr','customized');    </script>

这样可以div被修改为

<div id="test" class="active" customizedattr="customized">123</div>

通过方法 setAttribute设置的attribute最终都会反映到元素的attribute类型的节点中

property是DOM对象的字段,跟我们平常使用的一些对象一样,包含很多字段,这些字段就是property,取值或者设置值和普通字段一样通过”对象.字段“的方式。

看起来attribute和property应该没有什么关系才 对,怎么会。。。attribute和property容易混倄是因为很多attribute节点还有一个相对应的property属性,比如上面div 的”id“ attribute 同样可以用t.id取到(实际上绝大部分人都是这样获取的),通过property更改id后,用getAttibute获取的id是更新后的id。

t.id='test1';
console.log(t.getAttribute('id'));//test1

同样我们也可以自定义property

t.customizedProp='customized prop';

区别

1. 于build-in属性,attribute和property共享数据,attribute更改了会对property造成影响,反之亦然,但是两者的 自定义属性是独立的数据,即使name一样,也互不影响,看起来是下面这张图,但是IE6、7没有作区分,依然共享自定义属性数据

2. 并不是所有的attribute与对应的property名字都一致,比如刚才使用的attribute 的class属性,使用property操作的时候应该是这样className

t.className='active2';

3. 对于值是true/false的property,类似于input的checked attribute等,attribute取得值是HTML文档字面量值,property是取得计算结果,property改变并不影响 attribute字面量,但attribute改变会一向property计算

<input id="test3" type="checkbox"/>

var t=document.getElementById('test3');console.log(t.getAttribute('checked'));//nullconsole.log(t.checked);//false;        t.setAttribute('checked','checked');console.log(t.getAttribute('checked'));//checkedconsole.log(t.checked);//true        t.checked=false;console.log(t.getAttribute('checked'));//checkedconsole.log(t.checked);//false

4. 对于一些和路径相关的属性,两者取得值也不尽相同,但是同样attribute取得是字面量,property取得是计算后的完整路径

<a id="test4" href="#">Click</a>
var t=document.getElementById('test4');console.log(t.getAttribute('href'));//#console.log(t.href);//file:///C:/Users/bsun/Desktop/ss/anonymous.html#

关于浏览器(IE)造成的兼容性问题可以看看IE 混淆了 DOM 对象属性(property)及 HTML 标签属性(attribute),造成了对 setAttribute、getAttribute 的不正确实现

attr和prop

相信看完上面内容,大家就明白为什么jQuery要添加prop方法了,在jQuery API中也有专门解释

Attributes VS. Properties

在一些特殊的情况下,attributes和properties 的区别非常大。在jQuery1.6之前,.attr()方法在获取一些attributes的时候使用了property值,这样会导致一些不一致的行 为。在jQuery1.6中,.prop()方法提供了一中明确的获取property值得方式,这样.attr()方法仅返回attributes。

比如,selectedIndextagNamenodeNamenodeTypeownerDocumentdefaultChecked, 和defaultSelected应该使用.prop()方法获取/设置值。 在jQuery1.6之前这些不属于attribute的property需要用.attr()方法获取。这几个并没有相应的attibute,只有property。

关于布尔类型 attributes,比如一个这样的HTML标签,它在JavaScript中变量名为elem

<input type="checkbox" checked="checked" />
elem.checked true (Boolean) Will change with checkbox state
$( elem ).prop( "checked" ) true (Boolean) Will change with checkbox state
elem.getAttribute( "checked" ) "checked" (String) Initial state of the checkbox; does not change
$( elem ).attr( "checked" ) (1.6) "checked" (String) Initial state of the checkbox; does not change
$( elem ).attr( "checked" ) (1.6.1+) "checked" (String) Will change with checkbox state
$( elem ).attr( "checked" ) (pre-1.6) true (Boolean) Changed with checkbox state

根据W3C forms specification,checked属性是一个布尔值,这就意味着只要checked属性在HTML中表现出来了,那么相应的property就应该是true,即使checked没有值,这点儿对其它布尔类型的属性一样适用。

然而关于checked 属性需要记住的最重要的一点是:它和checked property并不是一致的。实际上这个attribute和defaultChecked property 一致,而且只应该用来设置checkbox的初始值。checked attribute并不随着checkedbox的状态而改变,但是checked property却跟着变。因此浏览器兼容的判断checkebox是否被选中应该使用property

if ( elem.checked )if ( $( elem ).prop( "checked" ) )if ( $( elem ).is( ":checked" ) )

这对其它一些类似于selected、value这样的动态attribute也适用。

在IE9之前版本中,如果property没有在DOM元素被移除 之前删除,使用.prop()方法设置DOM元素property(简单类型除外:number、string、boolean)的值会导致内存泄露。为 了安全的设置DOM对象的值,避免内存泄露,可以使用.data()方法。

使用场景

其实明白了上面讲的内容,什么时候该使用.attr()什么时候该使用 .prop()就很清楚了,不过还是传一张坊间很流行的图

转载于:https://my.oschina.net/sunshinewyf/blog/502828

jquery中的attr()和prop()相关推荐

  1. jQuery中的attr()与prop()设置属性、获取属性的区别

    举例,比如我们要获取checkbox的属性或者设置checkbox选中或不选中. $("#editForm").find("input[type='checkbox']& ...

  2. JQuery中的.attr()与.removeAttr()

    每个元素都有一个或者多个特性,这些特性的用途就是给出相应元素或者其内容的附加信息.如:在img元素中,src就是元素的特性,用来标记图片的地址. 在JS中,我们经常使用到的DOM,操作特性方法主要有3 ...

  3. jQuery实战之 attr() 和 prop() 的区别

    是不是刚开始学jQuery的时候,看到了这两个方法:attr()和prop():感觉这不是一个意思吗?他们有什么区别呢? 下面简单的给大家区分一下: 对于HTML元素本身就带有的固有属性,在处理的时候 ...

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

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

  5. jquery中的attr函数attr(name)、attr(key,value)、attr(properties)、attr(key,fn)、removeAttr

    全栈工程师开发手册 (作者:栾鹏) jquery系列教程2-style样式操作全解 jquery通过attr函数操作元素属性 jquery的attr函数,包括attr(name).attr(key,v ...

  6. 简单了解JQuery中的attr及removeAttr

    <body><span class="span1" name="it1"></span><span class=&qu ...

  7. jQuery函数attr()和prop()的区别

    在jQuery中,attr()函数和prop()函数都用于设置或获取指定的属性,它们的参数和用法也几乎完全相同. 但不得不说的是,这两个函数的用处却并不相同.下面我们来详细介绍这两个函数之间的区别. ...

  8. JQuery中如何动态修改input的type属性

    代码如下: 1 jQuery(".member_id").focus(function() { 2 jQuery(this).val(''); 3 }).blur(function ...

  9. 三、jQuery 中的 DOM 操作(超详细)

    文章目录 前言 一. DOM 介绍 二. 查找节点 2.1查找元素节点 2.2查找属性节点 三. 创建节点 3.1.创建元素节点 3.2.创建文本节点 3.3.创建属性节点 四.插入节点 4.1 DO ...

最新文章

  1. 苹果运行内存比较_决定手机流畅度到底是看CPU还是运行内存,你知道么?
  2. C++用顶层函数重载操作符(一)
  3. Anaconda 中no module named cv2的解决办法
  4. .Net 实用技术收藏!!!
  5. Mahout的taste推荐系统里的几种Recommender分析
  6. Linux操作系统之简易实现server/client
  7. 8880 e7 v2配什么主板_MATX主板配什么机箱好?曜越Tt启航者A3装机记
  8. Javascript隐式数据类型转换(==、+、Object)
  9. 解决能上QQ不能上网页的批处理〖罗斌原创〗
  10. AI的委屈只有它知道……
  11. Magisk升级Zygisk
  12. Directshow播放框架详解
  13. 24张最新可视化大屏模板,各行业数据直接套用
  14. 当鼠标移动到上面时的应用
  15. NOIP模拟题17.9.26
  16. 从哲学的视角看待项目生命周期——构建不一样的世界
  17. pubwin会员合并
  18. 计算机更新80072f76,更新升级win10系统时出现错误代码0x80072f76怎么办
  19. [前端三剑客之CSS]display:none opacity:0 visibility:hidden三角恋的爱恨情仇
  20. 强国的语言与语言强国

热门文章

  1. svn版本库浏览器_svn:版本库xxx不存在||svn:No such revision xxx的问题
  2. python:opencv 二值化处理
  3. c++Error:c++调用python文件提示由于找不到python3.8.dll,无法继续运行。。。
  4. 视觉SLAM总结——LSD SLAM中关键知识点总结
  5. 中国江苏省动漫产业发展导向及运营前景规划咨询报告2021-2027年
  6. android 数组赋值字符串_C语言奇淫技巧,字符串的三种表示方法,不会用不是合格的程序员...
  7. Redis 之(二) Redis的基本数据结构以及一些常用的操作
  8. python 赋值、表达式
  9. ylbtech-LanguageSamples-SimpleVariance
  10. 新闻资讯APP开发流程(八)-- ContentView.js