Home Web Front-end JS Tutorial The difference between attr and prop attributes in JS and an introduction to priority selection examples_Basic knowledge

The difference between attr and prop attributes in JS and an introduction to priority selection examples_Basic knowledge

May 16, 2016 pm 04:42 PM
prop

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; 
} 
}
Copy after login

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 ]; 
} 
} 
}
Copy after login

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" />
Copy after login

$(function(){ 
el = $("#test"); 
console.log(el.attr("style")); //undefined 
console.log(el.prop("style")); //CSSStyleDeclaration对象 
console.log(document.getElementById("test").style); //CSSStyleDeclaration对象 
});
Copy after login

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
Copy after login


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
Copy after login

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" />
Copy after login
console.log(el.attr("checked")); //checked 
console.log(el.prop("checked")); //true 
console.log(el.attr("disabled")); //undefined 
console.log(el.prop("disabled")); //false
Copy after login


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():

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

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

Hot Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1664
14
PHP Tutorial
1268
29
C# Tutorial
1248
24
How to solve '[Vue warn]: Missing required prop' error How to solve '[Vue warn]: Missing required prop' error Aug 26, 2023 pm 06:57 PM

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 How to solve the '[Vue warn]: Invalid prop: invalid value' error Aug 25, 2023 pm 02:51 PM

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 How to solve '[Vue warn]: Invalid prop: type check' error Aug 26, 2023 pm 10:40 PM

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 How to solve the '[Vue warn]: Avoid mutating a prop directly' error Aug 17, 2023 pm 05:21 PM

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 How to solve the '[Vue warn]: Invalid prop: custom validator' error Aug 20, 2023 pm 10:53 PM

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 How to deal with '[Vue warn]: Avoid mutating a prop directly' error Aug 17, 2023 am 11:12 AM

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 Comparison of multi-level delivery schemes in Vue component communication Jul 18, 2023 pm 03:21 PM

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 How to solve the '[Vue warn]: Invalid prop: update value' error Aug 26, 2023 pm 08:19 PM

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

See all articles