摘要:先提出問(wèn)題對(duì)于這類(lèi)值是的屬性,用的或方法進(jìn)行讀取或設(shè)置值是有區(qū)別的。因此,如果你想知道文本框的當(dāng)前值,則讀取。的值并不會(huì)隨著的狀態(tài)而作出相應(yīng)改變,而會(huì)。為對(duì)象設(shè)置值的安全做法避免內(nèi)存泄漏是使用。參考翻譯地址的與的區(qū)別
先提出問(wèn)題:對(duì)于 checked 這類(lèi)值是 true/false 的屬性,用 jQuery 的 attr 或 prop 方法進(jìn)行 讀取或設(shè)置值是有區(qū)別的。
在看 jQuery 文檔前,我們先看看 attribute 與 property 是什么:
先搞懂 attribute 與 property當(dāng)編寫(xiě) HTML 源碼時(shí),你能在 HTML 元素里定義 attributes。然后,一旦瀏覽器解析你的代碼,該 HTML 元素相應(yīng)的 DOM 節(jié)點(diǎn)就會(huì)被創(chuàng)建。該節(jié)點(diǎn)是一個(gè)對(duì)象,因此它就擁有 properties。
因此,我們知道:attributes 是 HTML 元素(標(biāo)簽)的屬性,而 properties 是 DOM 對(duì)象的屬性。
例如,下面這個(gè) HTML 元素:
擁有兩個(gè) attributes。
一旦瀏覽器解析該代碼,HTMLInputElement 對(duì)象就會(huì)被創(chuàng)建,并且該對(duì)象會(huì)擁有很多 peoperties,如:accept、accessKey、align、alt、attributes、autofocus、baseURI、checked、childElementCount、ChildNodes、children、classList、className、clientHeight 等等。
對(duì)于某個(gè) DOM 節(jié)點(diǎn)對(duì)象,properties 是該對(duì)象的所有屬性,而 attributes 是該對(duì)象對(duì)應(yīng)元素(標(biāo)簽)的屬性。
當(dāng)一個(gè) DOM 節(jié)點(diǎn)為某個(gè) HTML 元素所創(chuàng)建時(shí),其大多數(shù) properties 與對(duì)應(yīng) attributes 擁有相同或相近的名字,但這并不是一對(duì)一的關(guān)系。例如,下面這個(gè) HTML 元素:
其對(duì)應(yīng) DOM 節(jié)點(diǎn)會(huì)擁有如下properties: id、type 和 value:
id property是 id attribute 的映射:獲取該 property 即等于讀取其對(duì)應(yīng)的 attribute 值,而設(shè)置該 property 即為 attribute 賦值。id 是一個(gè)純粹的映射 property,它不會(huì)修改或限制其值。
type property 是 type attribute 的映射:獲取該 property 即等于讀取其對(duì)應(yīng)的 attribute 值,而設(shè)置該 property 即為 attribute 賦值。但 type 并不是一個(gè)純粹的映射 property,因?yàn)樗闹当幌拗圃谝阎担?input 的合法類(lèi)型,如:text、password)。如果你有 ,然后 theInput.getAttribute("type") 會(huì)返回 "foo",而 theInput.type 會(huì)返回 "text"。
相比之下,value property 并不會(huì)映射 value attribute。取而代之的是 input 的當(dāng)前值。當(dāng)用戶(hù)手動(dòng)更改輸入框的值,value property 會(huì)反映該改變。所以,如果用戶(hù)在 input 輸入 John,然后:
theInput.value // 返回 "John"
然而:
theInput.getAttribute("value") // 返回 "Name:"
value property 反映了 input 的當(dāng)前文本內(nèi)容,而 value attribute 則是在 HTML 源碼 value 屬性所指定的初始文本內(nèi)容。
因此,如果你想知道文本框的當(dāng)前值,則讀取 property。而如果你想知道文本框的初始值,則讀取 attribute。或者你也可以利用 defaultValue property,它是 value attribute 的純粹映射。
theInput.value // returns "John" theInput.getAttribute("value") // returns "Name:" theInput.defaultValue // returns "Name:"
有幾個(gè) properties 是直接反映它們 attribute(rel、id),而有一些則用稍微不同的名字進(jìn)行直接映射(htmlFor 映射 for attribute,className 映射 class attribute)。很多 property 所映射的 attribute 是帶有限制/變動(dòng)的(src、href、disabled、multiple)。該 規(guī)范 涵蓋了各種各樣的映射。
再看看 attr() 與 prop() 的區(qū)別上述能讓我們理清了 attribute 與 property 之間的區(qū)別,下面根據(jù) jQuery 文檔 對(duì) attr() 與 prop() 方法進(jìn)行比較:
自 jQuery 1.6 版本起,attr() 方法對(duì)于未設(shè)置的 attributes (即標(biāo)簽中沒(méi)寫(xiě)該 attributes)都會(huì)返回 undefined。對(duì)于檢索和改變 DOM 的 properties,如表單元素的 checked、selected 或 disabled 狀態(tài),應(yīng)使用 .prop() 方法。
Attributes vs. Properties
attributes 與 properties 之間的差異在特定情況下會(huì)變得尤為重要。在 jQuery 1.6 前,.attr() 方法在檢索一些 attributes 時(shí),有時(shí)會(huì)把 property 考慮進(jìn)去,這會(huì)導(dǎo)致不一致的行為。在 jQuery 1.6 版本之后,.prop() 方法提供了一種明確檢索 property 值的方式,而 .attr 只會(huì)檢索 attributes。
例如,selectedIndex、tagName、nodeName、nodeType、ownerDocument、defaultChecked 和 defaultSelected 能被 .prop() 檢索與設(shè)置。在 jQuery 1.6 之前,這些 properties 都是通過(guò) .attr() 檢索的,但檢索這些屬性并不應(yīng)屬于 attr 方法職責(zé)內(nèi) 。這些屬性并沒(méi)有對(duì)應(yīng)的 attributes,只有 properties 本身。
對(duì)于值為布爾值的 attributes ,考慮到一個(gè) DOM 元素是通過(guò) HTML 標(biāo)簽 讀取屬性
根據(jù) W3C forms(表單) 規(guī)范,checked 是一個(gè)值為 boolean 的 attribute,這意味著當(dāng)該 attribute 存在(無(wú)論值是什么),其對(duì)應(yīng)的 property 都是 true。例如,該 attribute 沒(méi)賦值或設(shè)為空字符串,甚至設(shè)為 "false"。這同樣適用于所有值為 boolean 的 attributes。
然而,對(duì)于 checked attribute 最重要的概念是記住它并不是對(duì)應(yīng) checked property。該 attribute 實(shí)際上是對(duì)應(yīng) defaultChecked property,并僅在初次設(shè)置 checkbox 值時(shí)使用。checked attribute 的值并不會(huì)隨著 checkbox 的狀態(tài)而作出相應(yīng)改變,而 checked property 會(huì)。因此,為了兼容不同瀏覽器,當(dāng)判斷一個(gè) checkbox 是否被選擇時(shí)應(yīng)該使用 property:
if (elem.checked) if ($(elem).prop("checked")) if ($(elem).is(":checked"))
這同樣適用于其它動(dòng)態(tài) attributes,如 selected 和 value。
其他說(shuō)明:
在 IE9 之前的版本,如果使用 .prop() 為 DOM 元素的 property 設(shè)置的值不是一個(gè)簡(jiǎn)單的原始值(number、string 或 boolean),且該 property 在 DOM 元素從 document 移除前未被移除(使用 .removeProp()),則會(huì)導(dǎo)致內(nèi)存泄漏。為 DOM 對(duì)象設(shè)置值的安全做法(避免內(nèi)存泄漏)是使用 .data()。
參考(翻譯):
jQuery API Documentation:http://api.jquery.com/prop/
Properties and Attributrs in HTML:http://stackoverflow.com/questions/6003819/properties-and-attributes-in-html
Github 地址: jQuery 的 attr 與 prop 的區(qū)別
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78826.html
摘要:需求很簡(jiǎn)單的,一個(gè)非常簡(jiǎn)單的復(fù)選框的使用。與的區(qū)別復(fù)選框設(shè)置設(shè)置自定義自定義設(shè)置類(lèi)型設(shè)置類(lèi)型支持類(lèi)型在這里溫馨提示提示一下,當(dāng)我們?cè)O(shè)置這個(gè)屬性時(shí),再用獲取的時(shí)候,控制提示。 問(wèn)題引入 昨天接到了一個(gè)活,里面有一個(gè)小需求,在寫(xiě)的過(guò)程中遇到了一個(gè)小問(wèn)題。雖然這個(gè)問(wèn)題并不是很復(fù)雜的東西,但卻是一個(gè)比較細(xì)節(jié)的問(wèn)題。相信不少新手前端會(huì)遇到。下面我先描述一下我這個(gè)遇到的這個(gè)需求。 showImg(...
摘要:后來(lái)了一番不知怎么搜索的又發(fā)現(xiàn)了一個(gè)和區(qū)別的一些解釋。操作對(duì)象不同在中表示文檔節(jié)點(diǎn)屬性,而則表示對(duì)象屬性。函數(shù)主要依賴(lài)的是對(duì)象的和兩個(gè)方法。 昨天在開(kāi)發(fā)的時(shí)候同事幫忙寫(xiě)了一小段JS代碼,取數(shù)據(jù)的時(shí)候用到了以前都沒(méi)用過(guò)的$(this).data(xxx)的這種形式,后來(lái)看了手冊(cè)才知道在HTML5中可以對(duì)元素進(jìn)行自定義屬性。格式類(lèi)似于data-xxx=value,然后可以用JQ中的....
摘要:今天研究前端的給固有屬性加值是出現(xiàn)錯(cuò)誤,搜索了下,找到了原因,就是中和的區(qū)別。下面和大家分享下在高版本的引入方法后,什么時(shí)候該用什么時(shí)候用它們兩個(gè)之間有什么區(qū)別這些問(wèn)題就出現(xiàn)了。關(guān)于它們兩個(gè)的區(qū)別,網(wǎng)上的答案很多。 今天研究前端jquery的attr給固有屬性加值是出現(xiàn)錯(cuò)誤,搜索了下,找到了原因,就是:jquery中attr和prop的區(qū)別。下面和大家分享下: 在高版本的jquery引...
摘要:在中新加了一個(gè)方法,查看文檔可以看到一句話獲取在匹配的元素集中的第一個(gè)元素的屬性值。這種情況適用于多選項(xiàng)全選和反選的情況。 在jquery1.6中新加了一個(gè)方法prop(),查看jquery文檔可以看到一句話:獲取在匹配的元素集中的第一個(gè)元素的屬性值。 大家都知道有的瀏覽器只要寫(xiě)disabled,checked就可以了,而有的要寫(xiě)成disabled = disabled,checked...
閱讀 2649·2023-04-26 02:17
閱讀 1623·2021-11-24 09:39
閱讀 1083·2021-11-18 13:13
閱讀 2660·2021-09-02 15:11
閱讀 2784·2019-08-30 15:48
閱讀 3415·2019-08-30 14:00
閱讀 2446·2019-08-29 13:43
閱讀 666·2019-08-29 13:07