问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JS中attr和prop属性的区别,以及优先选择

发布网友 发布时间:2022-04-23 06:12

我来回答

2个回答

懂视网 时间:2022-04-23 10:34

本文主要是attr 是从页面搜索获得元素值,所以页面必须明确定义元素才能获取值,相对来说比较慢。
如:

<input name='test' type='checkbox'> 
$('input:checkbox').attr('type'); 返回checkbox. 
$('input:checkbox').attr('checked'); 返回undefined。

因为<input name='test' type='checkbox'>中没有checked关键字。

  • prop是从属性对象中取值,属性对象中有多少属性,就能获取多少值,不需要在页面中显示定义。
    比如

  • $('input:checkbox').prop('checked'); 返回false
    。
  • 这里就会遇到个问题:如果是自定义的属性,那么属性对象中是没有这个属性的。所以prop返回undefined。但是页面中可以检索到这个属性,所以attr是可以获取的。

    其次

  • attr获取的是初始化值,除非通过attr(‘name’,’value’)改变,否则值不变。prop属性值是动态的,比如checkbox,选中后,checked变为true,prop值也会发生改变。

  • 总结

    所以有个经验就是:

  • 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法。快速,准确。

  • 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法。

  • 上面的描述也许有点模糊,举几个例子就知道了。

    <a id="first" href="#" target="_self">超链接</a>

    这个例子里<a>元素的DOM属性有id、href、target,这些属性是<a>元素本身就有的属性,W3C标准里就包含这几个属性,或者说在IDE里能够智能提示出的属性,这些就叫做固有属性。处理这些属性时,建议使用prop。

    <a id="first" href="#" target="_self" uuu="guoguo">超链接</a>

    这个例子里<a>元素的DOM属性有id、href、target、uuu,前三个是固有属性,最后一个“uuu”属性使我们自定义的,<a>元素本身是没有这个属性的,这种就是自定义的DOM属性。处理这些属性时,建议使用attr。

    读取HTML元素固有属性(已赋值)

    <a href="#" target="_self">超链接</a>
    //attr和prop都读取成功
    //attr("href")的值是:#//prop("href")的值是:http://localhost:4590/AttributeHandle/Index#alert($("a").attr("href"));alert($("a").prop("href"));

  • 读取HTML元素固有属性(未赋值)

    不同HTML标签的固有属性不完全相同,例如:checked属性是checkbox标签的固有属性,但不是a标签的固有属性。class属性虽然是a标签的固有属性,但是如果元素中没有对该属性赋值,用attr()也是读取不到的。

    <a href="#" target="_self">超链接</a>
    <input type="checkbox" id="testCheckBox" value="测试CheckBox"/>
    alert($("a").attr("id"));//
    输出:undefine alert($("a").prop("id"));//输出:默认值""alert($("a").attr("checked"));//输出:undefine alert($("a").prop("checked"));//输出:undefine alert($("#testCheckBox").attr("checked"));//输出:undefine alert($("#testCheckBox").prop("checked"));//输出:默认值falsealert($("a").attr("class"));//输出:undefine alert($("a").prop("class"));//输出:默认值""

    读取HTML元素自定义属性(已赋值)

    <a href="#" target="_self" uuu="guoguo">超链接</a>
    alert($("a").attr("uuu"));//
    输出:guoguoalert($("a").prop("uuu"));//输出:undefine

    读取HTML元素自定义属性(未赋值)

    <a href="#" target="_self" uuu="guoguo">超链接</a>
    alert($("a").attr("abc"));//
    输出:undefinealert($("a").prop("abc"));//输出:undefine

    设置HTML元素固有属性

    <a href="#" target="_self" uuu="guoguo">超链接</a>
    $("a").attr("id","link");//id属性添加成功$("a").prop("id","link");//id属性添加成功

    设置HTML元素自定义属性

    <a href="#" target="_self" uuu="guoguo">超链接</a>$("a").attr("abc", "myself");//成功添加属性abc="myself"$("a").prop("abc", "myself");//添加abc属性失败$("a").attr("action", "addAttribute");//成功添加属性action="addAttribute"$("a").prop("action", "addAttribute");//添加action属性失败

    总结

    prop读取属性值:读取已赋值的固有属性会得到属性值,读取未赋值的固有属性会得到属性默认值,读取自定义属性时无论是否赋值均得到undefine。
    prop设置属性值:prop只能设置固有属性值。
    attr读取属性值:无论是固有属性还是自定义属性,attr只能读取元素中已有的属性值,读取元素中没有的属性值会返回undefine。
    attr设置属性值:attr可以对任意属性设置属性值。

    热心网友 时间:2022-04-23 07:42

    相比attr,prop是1.6.1才新出来的,两者从中文意思理解,都是获取/设置属性的方法(attributes和properties)。只是,window或document中使用.attr()方法在jQuery1.6之前不能正常运行,因为window和document中不能有attributes。prop应运而生了。
    既然我们想知道他们两的区别,最好就看看他们的源代码,不要被代码长度所吓到,我们只看关键的几句:

    attr: function( elem, name, value, pass ) {
    var ret, hooks, notxml,
    nType = elem.nodeType;
    // don't get/set attributes on text, comment and attribute nodes
    if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
    return;
    }
    if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
    return jQuery( elem )[ name ]( value );
    }
    // Fallback to prop when attributes are not supported
    if ( typeof elem.getAttribute === "undefined" ) {
    return jQuery.prop( elem, name, value );
    }
    notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
    // All attributes are lowercase
    // Grab necessary hook if one is defined
    if ( notxml ) {
    name = name.toLowerCase();
    hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
    }
    if ( value !== undefined ) {
    if ( value === null ) {
    jQuery.removeAttr( elem, name );
    return;
    } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
    return ret;
    } else {
    elem.setAttribute( name, value + "" );
    return value;
    }
    } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
    return ret;
    } else {
    ret = elem.getAttribute( name );
    // Non-existent attributes return null, we normalize to undefined
    return ret === null ?
    undefined :
    ret;
    }
    }
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    白色T 恤如何搭配才能穿出优雅的韵味? 白色T 恤衫怎样搭配才能显得时髦又好看? 白色紧身正肩T 恤想要穿出休闲感,该如何搭配? 手机怎么连接笔记本电脑的wifi上网 电热水器为什么用着用着就没压力了 用什么拖地最干净又耐脏 爱奇艺会员的等级是怎么划分的? 爱奇艺星钻会员怎么开通 怎样才是正确的接吻呢 网页上鼠标点住右键拖动后出的蓝色线条是什么?干什么用的?为什么一松开... 泰剧被告的新娘剧情 泰国电视剧陪嫁新娘从哪里可以看啊 泰国电视剧什么的新娘是在2012年的他们一开始是假结婚的 泰国电视剧,两对结婚,一个新郎跑了,一个新娘跑了,后来这两个人在一起了 为啥不登录抖音号为啥搜别人的抖音号搜不出来,是哪一地方设置了吗? 好像泰国电视剧,心地善良的新娘嫁给了一个傻新郎,之后遇到一些困难,新郎好像是装傻的,在就记不清了 泰剧暴风新娘在哪可以看 很早有个泰国电视剧好像名字有新娘两个字叫什么电视剧? 泰国电视剧国语版逃婚新娘 忘记密码怎么登录? 记得,但密码忘记了,登录不上该怎么办呢? 笔记本电脑开机后黑屏,电源灯亮,也可以杀毒,就是屏幕漆黑 js prop和attr的区别 清洁护肤类淘宝店铺怎么取名 推荐一款打印手机照片的打印机! 水末过米多少就可以了,我要做米饭 我要蒸米饭 却变成这样 有错吗 为什么我们要多吃米饭 梦见去世的姐姐问我要糯米饭吃 为什么我们要吃米饭 华为在线铃声1元钱管用多久 武夷四大名丛的水金龟 事业单位/街道社工面试一般会问什么? 我要参加一个面试 ,城镇街道综治办(综合治理办)的结构化面试,需要准备什么 怎么准备 面试*的社保人员岗位,怎样回答:为什么来应聘这个职业,对这职业有什么了解,如何做好这个职业 为何报考这个职位-国考面试热点问题解答 我梦见掉进大海的石头上又爬上来,这代表的什么 请问有企业邮箱能实现批量添加收发件人到个人通讯录吗? 刚装的电脑无信号怎么回事 求助,新组装的电脑,屏幕无信号输入 现代笔录音笔MODEL:T70怎么使用 刚买的联想台式电脑显示“信号无输入”是怎么回事? 电脑无信号输入是什么原因 康佳kw_ye306电视没有声音了遥控器怎么调啊 卡萨帝油烟机找不岛开关 15.4支持苹果11吗 15.4苹果11支持吗 ios15.4支持11吗 卡萨帝抽油烟机和方太哪个好 苹果11也收到了15.4更新通知