jQuery 属性操作:HTML属性、JS属性

🎉摘要:本文详细解析 jQuery 中操作属性的四大核心方法。深入对比 attr() 与 prop() 的底层逻辑与适用场景,手把手教你如何正确使用 removeAttr 和 removeProp 管理元素状态,助你高效掌握 jQuery 属性操作技巧。

在 jQuery 中,attr() / removeAttr() 和 prop() / removeProp() 是操作元素属性的核心方法,但两者的适用场景和底层逻辑有本质区别。下面将会从定义、用法、区别、示例四个维度详细讲解这四个方法。

什么是“属性”?

在 HTML 中,元素的 “属性” 分为两类:

HTML 属性(Attribute)

HTML 属性是写在 HTML 标签内部的 “附加信息”,就像给标签贴的 “标签”—— 用来定义元素的初始状态、特征或行为,是元素在 HTML 层面的 “初始值”。

通常,属性的书写规则如下:

  • 写在标签的尖括号内,标签名之后;

  • 格式通常是 属性名="属性值"(值建议用双引号包裹,单引号也可);

  • 部分“布尔属性”(如 checked、disabled)可省略值,仅写属性名即表示 “启用该状态”;

简单示例:

<input type="text" placeholder="请输入内容" />

上述 <input> 标签中,type 和 placeholder 就是改标签的 HTML 属性。

DOM 属性(Property)

DOM(文档对象模型)把 HTML 页面中的每个元素都转换成了JavaScript 对象,而 DOM 属性(Property)就是这个对象上的 “属性 / 变量”—— 它代表元素在运行时的当前值,是动态可修改的。

注意:

我们可以简单的认为:

(1)HTML 原生属性(Attribute)是元素的 “出厂设置”;

(2)DOM 属性(Property)是元素的 “当前运行状态”(比如手机出厂设置是静音,你现在把它调成响铃,“响铃” 就是当前状态)。

这也是区分 jQuery 中 attr() 和 prop() 的核心前提。

属性方法

attr (name|prop|key, val|fn)

该方法用于读取或设置元素的 HTML 原生属性(Attribute)。语法如下表:

用法说明

$(elem).attr(name)

获取第一个匹配元素的 name 对应的 HTML 属性值

$(elem).attr(name, value)

为匹配元素设置 name 对应的 HTML 属性值(value 可以是字符串 / 数字)

$(elem).attr({name1:val1, name2:val2})

批量设置多个 HTML 属性

$(elem).attr(name, function(index, oldVal))

动态设置属性值(函数返回值为新值,index 是元素索引,oldVal 是原属性值)

示例:

<div class="app">
    <h3>属性</h3>
    <p class="myClass">这是一个P标签</p>
    <p class="myClass">这是一个P标签</p>
    <input type="text" placeholder="请输入内容" />
</div>

jQuery 代码:

// 给 p 标签添加 name 属性
$('.app p').attr('name', 'myName');

// 给 p 标签添加 name 属性
$('.app p').attr({
    'name': 'myName',
    'title': 'myTitle'
});

// 给 p 标签添加 name 属性
$('.app p').attr('name', function(){
    return 'myName';
});

注意,效果可以在本文最后完整示例中在线查看。

removeAttr (name)

该方法用于删除元素的指定 HTML 属性,会同时影响 DOM 属性的初始值。语法:

$(elem).removeAttr(name)

其中,name 为属性名,多个属性用空格分隔。

示例:

<div class="app">
    <h3>属性</h3>
    <p class="myClass">这是一个P标签</p>
    <p class="myClass">这是一个P标签</p>
    <input type="text" placeholder="请输入内容" />
</div>

jQuery 代码:

// 移除 p 标签的 class 属性
$('.app p').removeAttr('class');

注意,效果可以在本文最后完整示例中在线查看。

prop (n|p|k, v|f)

该方法用于读取或设置元素的 DOM 对象属性(Property),反映元素的实时状态。语法和 attr() 完全一致,只是操作的是 DOM 属性。如下表:

用法说明

$(elem).prop(name)

获取第一个匹配元素的 name 对应的 DOM 属性值

$(elem).prop(name, value)

为匹配元素设置 name 对应的 DOM 属性值

$(elem).prop({name1:val1, name2:val2})

批量设置 DOM 属性

$(elem).prop(name, function(index, oldVal))

动态设置 DOM 属性值

示例:

<div class="app">
    <h3>属性</h3>
    <p class="myClass">这是一个P标签</p>
    <p class="myClass">这是一个P标签</p>
    <input type="text" placeholder="请输入内容" />
    <p>
        <input id="myCheckbox" type="checkbox" placeholder="已了解"/> 已了解
    </p>
</div>

jQuery 代码:

// 给 input 标签添加 myProp 属性
$('.app input').prop('myProp', '123');

// 获取添加的属性的值
log.info('myProp=' + $('.app input').prop('myProp'));

// 复选框勾选
$('#myCheckbox').prop('checked', true);

注意,效果可以在本文最后完整示例中在线查看。

removeProp (name)

该方法用于删除通过 prop() 方法设置的自定义 DOM 属性(注意:不能删除原生 DOM 属性,如 checked、value)。语法:

$(elem).removeProp(name)

注意:

  • 原生 DOM 属性(如 checked、disabled、value)用 removeProp()无效,如需重置,应设置为默认值(如 prop('checked', false))。

  • removeProp() 仅适用于删除通过 prop() 手动添加的自定义属性。

示例:先通过 pop() 方法添加一个名为 myProp 的自定义属性,然后使用 removeProp() 进行移除。

// 给 input 标签添加 myProp 属性
$('.app input').prop('myProp', '123');

// 不能移除,因为 disabled 是原生属性,不是自定义属性
$('.app input').removeProp('myProp');

// 获取移除属性的值
log.info('myProp=' + $('.app input').prop('myProp')); // 日志删除,myProp 为 undefined

到这里,关于 jQuery 操作属性的四个方法就都介绍了,是不是已经了解了。最后,给出一个最佳实践:

(1)优先用 prop () 的场景:

  • 复选框 / 单选框的 checked、selected、disabled 状态;

  • 表单元素的 value(实时输入值);

  • 元素的 className、tagName 等 DOM 原生属性;

(2)优先用 attr () 的场景:

  • 读取 / 设置 HTML 原生属性(如 id、href、title);

  • 自定义 HTML 属性(如 data-*,不过推荐用 data() 方法);

完整示例

下面示例通过“点击自己动手试一试”可以尝试各种方法的效果:

示例:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JQeury 教程</title>
    <!-- 引入 jQuery 库 -->
    <script type="text/javascript" src="https://www.hxstrive.com/cdn/libs/jquery/3.7.1/jquery.min.js"></script>
    <!-- 引入 loglevel 库,方便在 DOM 中打印日志 -->
    <script src="https://www.hxstrive.com/preview_code/libs/custom_loglevel.js"></script>
    <style>
        button { background: #EEE !important; border: 1px solid #ccc !important; 
            min-width: 40px; padding: 5px; margin: 5px; cursor: pointer; }
        sup {color: red; font-size: 12px; background: transparent !important;}

        /* 效果样式 */
        .myClass { box-shadow: inset 0 0 3px red; padding: 10px; }
        p[name="myName"] { color: blue; }
        p[title="myTitle"] { text-decoration: underline; }
        input[myProp] { padding: 5px 10px; border:solid 1px green;}
    </style>
</head>
<body>

    <div class="app">
        <h3>属性</h3>
        <p class="myClass">这是一个P标签</p>
        <p class="myClass">这是一个P标签</p>
        <input type="text" placeholder="请输入内容" />
        <p>
            <input id="myCheckbox" type="checkbox" placeholder="已了解"/> 已了解 
        </p>
    </div>

    <div>
        <!-- attr 操作 HTML 标签的自定义 / 原生特性 -->
        <!-- attr(name|pro|key,val|fn) 设置或返回被选元素的属性值 -->
        <button type="button" onclick="
                // 给 p 标签添加 name 属性
                $('.app p').attr('name', 'myName');
            ">$('.app p').attr('name', 'myName')</button>
        
        <button type="button" onclick="
                // 给 p 标签添加 name 属性
                $('.app p').attr({
                    'name': 'myName',
                    'title': 'myTitle'
                });
            ">$('.app p').attr({...})</button>
        
        <button type="button" onclick="
                // 给 p 标签添加 name 属性
                $('.app p').attr('name', function(){
                    return 'myName';
                });
            ">$('.app p').attr(key, function(){...})</button>

        <!-- removeAttr(name) 从每一个匹配的元素中删除一个属性 -->
        <button type="button" onclick="
                // 移除 p 标签的 class 属性
                $('.app p').removeAttr('class');
            ">$('.app p').removeAttr('class')</button>
        
        <!-- prop 操作 DOM 元素的内置属性(property) -->
        <!-- prop(n|p|k,v|f) 1.6+ 获取在匹配的元素集中的第一个元素的属性值 -->
        <button type="button" onclick="
                // 给 input 标签添加 myProp 属性
                $('.app input').prop('myProp', '123');

                //获取添加的属性的值
                log.info('myProp=' + $('.app input').prop('myProp'));

                // 复选框勾选
                $('#myCheckbox').prop('checked', true);
            ">$('.app input').prop('myProp', '123')</button>

        <!-- removeProp(name) 1.6+ 用来删除由.prop()方法设置的属性集 -->
        <button type="button" onclick="
                // 移除自定义 myProp 属性
                $('.app input').removeProp('myProp');

                // 获取移除属性的值,此时应为 undefined
                log.info('myProp=' + $('.app input').prop('myProp'));
            ">$('.app input').removeProp('myProp')</button>
    </div>
    
</body>
</html>

看看效果👉自己动手试一试 »

更多关于 jQuery 的知识请阅读后续教程。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号