jQuery的attr()、prop()剩瓶、data()的用法及區(qū)別詳解

各自性能作用

  • attr()驹溃,此方法從jq1.0開(kāi)始一直存在,作用是讀/寫(xiě)DOM的attribute值延曙;
  • .prop()豌鹤,此方法jq1.6引入,作用是讀/寫(xiě)DOM的property值枝缔;
  • .data()布疙,此方法jq2.3引入蚊惯,作用是把任意的值讀取/存儲(chǔ)到DOM元素對(duì)應(yīng)的對(duì)象上。

一灵临、attr()和prop()

在jQuery中截型,attribute和prop,分別是attribute和property的簡(jiǎn)寫(xiě)儒溉,都是屬性的意思宦焦。attr()函數(shù)和prop()函數(shù)都用于設(shè)置或獲取指定的屬性,它們的參數(shù)和用法也幾乎完全相同顿涣,但這兩個(gè)函數(shù)的用處卻有著不同波闹。

1、操作對(duì)象不同

在jQuery中涛碑,attribute和property是兩個(gè)不同的概念精堕。attribute表示HTML文檔節(jié)點(diǎn)屬性,property表示JS對(duì)象的屬性锌唾。如下:

//這里的id锄码、class、style晌涕、data-id均是該元素文檔節(jié)點(diǎn)的attribute
<div id="message" class="test" style="height:66px;" data-id="123"></div>

// 這里的name滋捶、age、sex均是obj的property
var obj = { name: "coder", age: 18, sex:"男" };

  • attr()的設(shè)計(jì)目標(biāo)是用于設(shè)置或獲取指定DOM元素所對(duì)應(yīng)的文檔節(jié)點(diǎn)上的屬性(attribute)余黎;
  • prop()的設(shè)計(jì)目標(biāo)用于設(shè)置或獲取指定DOM元素(指的是JS對(duì)象重窟,Element類(lèi)型)上的屬性(property)。

//attr()函數(shù)針對(duì)的是該文檔節(jié)點(diǎn)的attribute
<div id="message" class="test" data-id="123"></div>

<script type="text/javascript">
// prop()函數(shù)針對(duì)的是該DOM元素(msg)自身的property
var msg = document.getElementById("message");
var $msg = $(msg);
//$msg.prop("abc")與msg.abc中的abc基本是相同的惧财,比如$msg.prop("tagName")和msg.tagName
</script

在jQuery的底層實(shí)現(xiàn)中巡扇,attr()和prop的功能都是通過(guò)js原生的Element對(duì)象(如上述代碼中的msg)實(shí)現(xiàn)的。
attr()主要依賴(lài)的是Element對(duì)象的getAttribute()和setAttribute()兩個(gè)方法垮衷。prop()主要依賴(lài)的則是js中原生的對(duì)象屬性獲取和設(shè)置方式厅翔。

<div id="message" class="test" data-id="123"></div>
<script type="text/javascript">
var msg = document.getElementById("message");
var $msg = $(msg);
//attr()依賴(lài)的是Element對(duì)象的element.getAttribute( attribute ) 和 element.setAttribute( attribute, value )
// 相當(dāng)于 msg.setAttribute("data-id", 145);
$msg.attr("data-id", 145);
// 相當(dāng)于 msg.getAttribute("data_id");
var dataId = $msg.attr("data-id"); // 145
//prop()依賴(lài)的是JS原生的 element[property] 和 element[property] = value;
// 相當(dāng)于 msg["pid"] = "pid值" 或 msg.pid = "pid值"
$msg.prop("pid", "pid值");
// 相當(dāng)于 msg["pid"] 或 msg.pid
var testProp = $msg.prop("pid"); // pid值
</script>

雖然prop()針對(duì)的是DOM元素的property,而不是元素節(jié)點(diǎn)的attribute搀突。不過(guò)DOM元素某些屬性的更改也會(huì)影響到元素節(jié)點(diǎn)上對(duì)應(yīng)的屬性刀闷。例如,property的id對(duì)應(yīng)attribute的id仰迁,property的className對(duì)應(yīng)attribute的class甸昏。如:
$msg.prop("className","newTest")與$msg.attr("class","newTest")相同

2.應(yīng)用版本不同

如最開(kāi)始所說(shuō),attr()是jQuery1.0版本就有的函數(shù)徐许,prop()是jQuery1.6版本新增的函數(shù)施蜜。
即,在1.6之前只能使用attr()雌隅,在1.6及其以后版本翻默,可以根據(jù)實(shí)際需要選擇對(duì)應(yīng)的函數(shù)缸沃。

3.用于設(shè)置的屬性值類(lèi)型不同

  • 用于attr()操作的是文檔節(jié)點(diǎn)的屬性,因此設(shè)置的屬性值只能是字符串類(lèi)型冰蘑,如果不是字符串類(lèi)型和泌,也會(huì)調(diào)用其toString()方法將其轉(zhuǎn)換為字符串類(lèi)型村缸。
  • prop()操作的是js對(duì)象的屬性祠肥,設(shè)置的屬性值可以為包括數(shù)組和對(duì)象在內(nèi)的任意類(lèi)型。

4.4.其他問(wèn)題

在jQuery1.6之前梯皿,只有attr()可用仇箱,該函數(shù)同時(shí)承擔(dān)了attribute的設(shè)置/獲取工作和property的設(shè)置和獲取工作。例如:在jQuery 1.6之前东羹,attr()也可以設(shè)置或獲取tagName剂桥、className、nodeName属提、nodeType等DOM元素的property权逗。

直到j(luò)Query 1.6新增prop()函數(shù),并用來(lái)承擔(dān)property的設(shè)置或獲取工作之后冤议,attr()才只用來(lái)負(fù)責(zé)attribute的設(shè)置和獲取工作斟薇。此外,對(duì)用表單元素的"checked"恕酸、"selected"堪滨、"disabled"等屬性,在jq1.6之前蕊温,attr()獲取這些屬性返回的值為Boolean類(lèi)型袱箱,如果被選中(或禁用)就返回true,否則返回false义矛。

但從1.6開(kāi)始发笔,使用attr()獲取這些屬性的返回值為String類(lèi)型,如果被選中(或禁用)就返回"checked"凉翻、"selected"了讨、"disabeld",否則(即元素節(jié)點(diǎn)沒(méi)有該屬性)返回undefined。并且在某些版本中噪矛,這些屬性值表示文檔加載時(shí)的初始狀態(tài)值量蕊,即使之后更改了這些元素的選中(或禁用)狀態(tài),對(duì)應(yīng)的屬性值也不會(huì)發(fā)生改變艇挨。因?yàn)閖Query認(rèn)為:attribute的"checked"残炮、"selected"、"disabled"就是表示該屬性初始狀態(tài)的值缩滨,property的checked势就、selected泉瞻、disabeld才表示該屬性實(shí)時(shí)狀態(tài)的值(值為true或false)。

因此苞冯,從1.6以后袖牙,請(qǐng)使用prop()來(lái)設(shè)置或獲取checked、selected舅锄、disabled等屬性鞭达。對(duì)于其它能夠prop()實(shí)現(xiàn)的操作,也盡量使用prop()皇忿。比如:selectedIndex, tagName, nodeName, nodeType, ownerDocument應(yīng)該使用.prop()方法獲取/設(shè)置值畴蹭。

值得注意的是對(duì)于a標(biāo)簽的href屬性,prop()與attr()取得的值不同鳍烁,prop是絕對(duì)地址叨襟,attr()取的就是href中的值,如:

<a href="#" id="adom" data-name="doma"></a>
<script>
console.log($("#adom").prop("href")); //file:///C:/Users/Administrator/Desktop/testapp/1.html#
console.log($("#adom").attr("href")); //#
</script>

注:在IE9之前版本中幔荒,如果property沒(méi)有在DOM元素被移除之前刪除糊闽,使用.prop()方法設(shè)置DOM元素property(簡(jiǎn)單類(lèi)型除外:number、string爹梁、boolean)的值會(huì)導(dǎo)致內(nèi)存泄露右犹。為了安全的設(shè)置DOM對(duì)象的值,避免內(nèi)存泄露卫键,可以使用.data()方法傀履。

二、data()

在html5中DOM標(biāo)簽可以添加一些data-xxx的屬性莉炉,可以把data()看作是存取data-xxx這樣的DOM附加信息的方法钓账。data()存取的內(nèi)容可以是字符串、數(shù)組和對(duì)象絮宁。從jQuery1.4.3起梆暮,html5的data-xxx屬性會(huì)自動(dòng)被添加到j(luò)q的data對(duì)象里,比如:
<div data-role="page" data-last-value="43" data-hidden="true" data-options=‘{"name":"noahlu"}‘></div>

下面的等式都成立:

$("div").data("role") === "page";$("div").data("lastValue") === 43;
$("div").data("hidden") === true;
$("div").data("options").name === "noahlu"

雖然data()用來(lái)存數(shù)據(jù)挺方便的绍昂,它也是有過(guò)不堪回首的過(guò)去啦粹,如:

<button id="foo" data-key="1.4000">Click me</button><script>typeof $(‘#foo‘).data(‘key‘);</script>

jQuery 1.8之前的版本輸出’number’,1.8版本之后輸出為’string’窘游。1.8版之前唠椭,data會(huì)把值轉(zhuǎn)換成基本類(lèi)型,其實(shí)我們這里想要的是’1.4000′并不是1.4忍饰。
data()設(shè)置值后贪嫂,attr()不能獲取設(shè)置后的值,比如:

<a href="javascript:;" id="adom" data-name="doma"></a>
<script>
var adom = $("#adom");
adom.data("name","name1");
console.log("attr:"+adom.attr("dataname"));//doma
console.log("data:"+adom.data("name"));//name1
</script>

文章來(lái)源于:http://www.cnblogs.com/yaomeng/p/5359894.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市艾蓝,隨后出現(xiàn)的幾起案子力崇,更是在濱河造成了極大的恐慌斗塘,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亮靴,死亡現(xiàn)場(chǎng)離奇詭異馍盟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)茧吊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)贞岭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人饱狂,你說(shuō)我怎么就攤上這事曹步。” “怎么了休讳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)尿孔。 經(jīng)常有香客問(wèn)我俊柔,道長(zhǎng),這世上最難降的妖魔是什么活合? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任雏婶,我火速辦了婚禮,結(jié)果婚禮上白指,老公的妹妹穿的比我還像新娘留晚。我一直安慰自己,他們只是感情好告嘲,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布错维。 她就那樣靜靜地躺著,像睡著了一般橄唬。 火紅的嫁衣襯著肌膚如雪赋焕。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天仰楚,我揣著相機(jī)與錄音隆判,去河邊找鬼。 笑死僧界,一個(gè)胖子當(dāng)著我的面吹牛侨嘀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捂襟,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼咬腕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了笆豁?” 一聲冷哼從身側(cè)響起郎汪,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赤赊,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后煞赢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體抛计,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年照筑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吹截。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凝危,死狀恐怖波俄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛾默,我是刑警寧澤懦铺,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站支鸡,受9級(jí)特大地震影響冬念,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牧挣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一急前、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瀑构,春花似錦裆针、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至折剃,卻和暖如春另假,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怕犁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工边篮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奏甫。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓戈轿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親阵子。 傳聞我的和親對(duì)象是個(gè)殘疾皇子思杯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容