


The difference between attr and prop attributes in JS and an introduction to priority selection examples_Basic knowledge
Compared with attr, prop is new in 1.6.1. Both of them are understood from the Chinese meaning, and they are both methods of getting/setting attributes (attributes and properties). However, the .attr() method used in window or document cannot run properly before jQuery 1.6, because there cannot be attributes in window or document. prop came into being.
Since we want to know the difference between them, it’s best to look at their source code. Don’t be scared by the length of the code. Let’s just look at a few key sentences:
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; } }
prop method code (jQuery version 1.8.3)
prop: function( elem, name, value ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set properties on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); if ( notxml ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { return ( elem[ name ] = value ); } } else { if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { return elem[ name ]; } } }
In the attr method, the two most critical lines of code are elem.setAttribute(name, value "") and ret = elem.getAttribute(name). It is obvious that the DOM API setAttribute and getAttribute method operations are used. attribute element node.
In the prop method, the two most critical lines of code are return (elem[ name ] = value ) and return elem[ name ]. You can understand it like this: document.getElementById(el)[name] = value, which is converted into JS A property of the object.
Now that we understand the principle, let’s take a look at an example:
<input type="checkbox" id="test" abc="111" />
$(function(){ el = $("#test"); console.log(el.attr("style")); //undefined console.log(el.prop("style")); //CSSStyleDeclaration对象 console.log(document.getElementById("test").style); //CSSStyleDeclaration对象 });
el.attr("style") outputs undefined, because attr is the value of the attribute node of this object obtained. Obviously there is no such attribute node at this time, so it naturally outputs undefined
el.prop("style") outputs a CSSStyleDeclaration object. For a DOM object, it has native style object attributes, so the style object
is output
As for document.getElementById("test").style is the same as the one above
Read on:
el.attr("abc","111") console.log(el.attr("abc")); //111 console.log(el.prop("abc")); //undefined
First, use the attr method to add the abc node attribute to this object, with a value of 111. You can see that the structure of the html has also changed
The output result of el.attr("abc") is 111, which is normal
el.prop("abc") outputs undefined, because abc is in this attribute node, so it cannot be obtained through prop
el.prop("abc", "222"); console.log(el.attr("abc")); //111 console.log(el.prop("abc")); //222
We then use the prop method to set the abc attribute for this object, with a value of 222. You can see that the structure of the html has not changed. The output results are not explained.
The principle has been explained clearly above, you can decide by yourself when to use it.
Mention that when you want to get or set properties such as checked, selected, readonly and disabled, it is obviously better to use the prop method, such as the following:
<input type="checkbox" id="test" checked="checked" />
console.log(el.attr("checked")); //checked console.log(el.prop("checked")); //true console.log(el.attr("disabled")); //undefined console.log(el.prop("disabled")); //false
Obviously, boolean values make the following processing more reasonable than string values.
PS, if you are obsessed with JS performance, obviously the performance of prop is higher, because attr needs to access the DOM attribute node, and accessing the DOM is the most time-consuming. This situation applies to multi-option all-select and inverse-select situations.
Everyone knows that some browsers only need to write disabled and checked, while others need to write disabled = "disabled", checked="checked", such as when using attr("checked") to get the checked attribute of checkbox The value can be obtained when it is selected. The value is "checked" but the value obtained when it is not selected is undefined.
jq provides a new method "prop" to get these attributes to solve this problem. In the past, when we used attr to get the checked attribute, we returned "checked" and "". Now, when we use the prop method to get the attribute, we uniformly return true and false.
So, when to use attr() and when to use prop()?
1. Add the attribute name and the attribute will take effect. You should use prop();
2. There are two attributes, true and false, using prop();
3. For others, use attr();
Everyone should pay attention to this when upgrading jquery in the project!
The following are official recommendations for the use of attr() and prop():
The following are official recommendations for the use of attr() and prop():

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics










![How to solve '[Vue warn]: Missing required prop' error](https://img.php.cn/upload/article/000/887/227/169304743965914.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
How to solve the "[Vuewarn]:Missingrequiredprop" error When developing Vue applications, you sometimes encounter a common error message: "[Vuewarn]:Missingrequiredprop". This error usually refers to the lack of required property values in the component, causing the component to fail to render properly. The solution to this problem is simple. We can avoid and deal with this error through some skills and regulations. Here are some solutions
![How to solve the '[Vue warn]: Invalid prop: invalid value' error](https://img.php.cn/upload/article/000/465/014/169294628931912.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Methods to solve "[Vuewarn]:Invalidprop:invalidvalue" error When developing applications using Vue.js, we often encounter some errors and warnings. One of the common errors is "[Vuewarn]:Invalidprop:invalidvalue". This error usually occurs when we try to pass an invalid value to a property of a Vue component. In this article, we will delve into the root cause of this error
![How to solve '[Vue warn]: Invalid prop: type check' error](https://img.php.cn/upload/article/000/887/227/169306085649427.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
How to Fix “[Vuewarn]:Invalidprop:typecheck” Error Vue.js is a popular JavaScript framework for building user interfaces. When developing applications using Vue.js, we sometimes encounter some error messages, one of which is "[Vuewarn]:Invalidprop:typecheck". This error is usually caused by incorrect use of attributes in the component
![How to solve the '[Vue warn]: Avoid mutating a prop directly' error](https://img.php.cn/upload/article/000/465/014/169226406590115.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Methods to solve the "[Vuewarn]:Avoidmutatingapropdirectly" error When developing projects using Vue.js, we may encounter a common warning message: "[Vuewarn]:Avoidmutatingapropdirectly". The meaning of this warning message is that we should not directly change the value of a props attribute, but should trigger an event to let the parent component change the pro
![How to solve the '[Vue warn]: Invalid prop: custom validator' error](https://img.php.cn/upload/article/000/000/164/169254319231018.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Methods to solve the "[Vuewarn]:Invalidprop:customvalidator" error During the development process of using Vue, we often encounter some warning and error messages. One of the common error messages is "[Vuewarn]:Invalidprop:customvalidator". The reason this error message occurs is because when we use the custom validator function, we fail to correctly validate the component passed to it.
![How to deal with '[Vue warn]: Avoid mutating a prop directly' error](https://img.php.cn/upload/article/000/465/014/169224194948720.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
How to deal with "[Vuewarn]:Avoidmutatingapropdirectly" error When developing web applications using Vue.js, we often encounter some warnings or errors. One of the common warnings is "[Vuewarn]:Avoidmutatingapropdirectly", which means that we directly modify a property (prop) passed by the parent component in the component. In this article, we

Comparison of multi-level delivery schemes in Vue component communication Vue is a very popular front-end framework. It provides a component-based development method and realizes the development of complex applications through the nesting and communication of components. In actual development, communication between components is often an important issue. When there are multi-level relationships between components, how to efficiently transfer data becomes a question that developers need to think about. This article will introduce several common multi-level component communication schemes and compare them. Use props and $emitVue to provide
![How to solve the '[Vue warn]: Invalid prop: update value' error](https://img.php.cn/upload/article/000/465/014/169305238381644.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Methods to solve the "[Vuewarn]:Invalidprop:updatevalue" error In Vue development, we often encounter the "[Vuewarn]:Invalidprop:updatevalue" error. This error is usually caused by a parent component passing an invalid value to a child component. Although this error is a Vue warning rather than a fatal error, it should still be resolved in time to ensure the robustness of the program. This article will introduce
