首頁 > web前端 > js教程 > 主體

jquery中attr和prop的區別實例用法詳解

伊谢尔伦
發布: 2017-06-17 13:48:13
原創
1453 人瀏覽過

在高版本的jquery引入prop方法後,什麼時候該用prop?什麼時候用attr?它們兩個之間有什麼區別?這些問題就出現了。

關於它們兩個的差別,網路上的答案很多。這裡談談的很簡單的心得:

對於HTML元素本身就帶有的固有屬性,在處理時,使用prop方法。

對於HTML元素我們自己自訂的DOM屬性,在處理時,使用attr方法。

在jQuery中,attr()函數和prop()函數都用來設定或取得指定的屬性,它們的參數和用法也幾乎完全相同。

但不得不說的是,這兩個函數的用處卻不相同。下面我們來詳細介紹這兩個函數之間的差異。

1、操作對像不同

很明顯,attr和prop分別是單字attribute和property的縮寫,它們都表示"屬性"的意思。

不過,在jQuery中,attribute和property卻是兩個不同的概念。 attribute表示HTML文件節點的屬性,property表示JS物件的屬性。

<!-- 这里的id、class、data_id均是该元素文档节点的attribute -->
<p id="message" class="test" data_id="123"></p>
<script type="text/javascript">
// 这里的name、age、url均是obj的property
var obj = { name: "CodePlayer", age: 18, url: "http://www.php.cn/" };
</script>
登入後複製

在jQuery中,prop()函數的設計目標是用於設定或取得指定DOM元素(指的是JS對象,Element類型)上的屬性(property);attr()函數的設計目標是用來設定或取得指定DOM元素所對應的文件節點上的屬性(attribute)。

<!-- attr()函数针对的是该文档节点的attribute -->
<p id="message" class="test" data_id="123"></p>
<script type="text/javascript">
// prop()函数针对的是该DOM元素(msg)自身的property
var msg = document.getElementById("message");
var $msg = $(msg);
</script>
登入後複製

當然,在jQuery的底層實作中,函數attr()和prop()的功能都是透過JS原生的Element物件(如上述程式碼中的msg)實現的。 attr()函數主要依賴的是Element物件的getAttribute()和setAttribute()兩個方法。 prop()函數主要依賴的則是JS中原生的物件屬性取得和設定方式。

<p id="message" class="test" data_id="123"></p>
<script type="text/javascript">
var msg = document.getElementById("message");
var $msg = $(msg);
/* *** attr()依赖的是Element对象的element.getAttribute( attribute ) 和 element.setAttribute( attribute, value ) *** */
// 相当于 msg.setAttribute("data_id", 145);
$msg.attr("data_id", 145);
// 相当于 msg.getAttribute("data_id");
var dataId = $msg.attr("data_id"); // 145
/* *** prop()依赖的是JS原生的 element[property] 和 element[property] = value; *** */
// 相当于 msg["pid"] = "pid值";
$msg.prop("pid", "pid值");
// 相当于 msg["pid"];
var testProp = $msg.prop("pid"); // pid值
</script>
登入後複製

當然,jQuery對這些操作方式進行了封裝,使我們操作起來更加方便(例如以物件形式同時設定多個屬性),並且實作了跨瀏覽器相容。

此外,雖然prop()針對的是DOM元素的property,而不是元素節點的attribute。不過DOM元素某些屬性的變更也會影響到元素節點上對應的屬性。例如,property的id對應attribute的id,property的className對應attribute的class。

<p id="message" class="test" data_id="123"></p>
<script type="text/javascript">
var msg = document.getElementById("message");
var $msg = $(msg);
document.writeln( $msg.attr("class") ); // test
$msg.prop("className", "newTest");
// 修改className(property)导致class(attitude)也随之更改
document.writeln( $msg.attr("class") ); // newTest
</script>
登入後複製

2、應用程式版本不同

attr()是jQuery 1.0版本就有的函數,prop()是jQuery 1.6版本新增的函數。毫無疑問,在1.6之前,你只能使用attr()函數;1.6及以後版本,你可以根據實際需要選擇對應的函數。

3、用於設定的屬性值類型不同

由於attr()函數操作的是文檔節點的屬性,因此設定的屬性值只能是字串類型,如果不是字串類型,也會呼叫其toString()方法,將其轉為字串類型。

prop()函數操作的是JS物件的屬性,因此設定的屬性值可以為包括陣列和物件在內的任意型別。

4、其他細節問題

在jQuery 1.6之前,只有attr()函數可用,該函數不僅承擔了attribute的設定和獲取工作,還同時承擔了property的設定和獲取工作。例如:在jQuery 1.6之前,attr()也可以設定或取得tagName、className、nodeName、nodeType等DOM元素的property。

直到jQuery 1.6新增prop()函數,並用來承擔property的設定或取得工作之後,attr()才只用來負責attribute的設定和取得工作。

此外,對於表單元素的checked、selected、disabled等屬性,在jQuery 1.6之前,attr()取得這些屬性的回傳值為Boolean類型:如果被選取(或停用)就傳回true,否則返回false。

但是從1.6開始,使用attr()取得這些屬性的回傳值為String類型,如果被選取(或停用)就傳回checked、selected或disabled,否則(即元素節點沒有該屬性)返回undefined。並且,在某些版本中,這些屬性值表示文件載入時的初始狀態值,即使之後更改了這些元素的選取(或停用)狀態,對應的屬性值也不會改變。

因為jQuery認為:attribute的checked、selected、disabled就是表示該屬性初始狀態的值,property的checked、selected、disabled才會表示該屬性即時狀態的值(值為true或false)。

因此,在jQuery 1.6及以後版本中,請使用prop()函數來設定或取得checked、selected、disabled等屬性。對於其它能夠用prop()實現的操作,也盡量使用prop()函數。

<input id="uid" type="checkbox" checked="checked" value="1">
<script type="text/javascript">
// 当前jQuery版本为1.11.1
var uid = document.getElementById("uid");
var $uid = $(uid);
document.writeln( $uid.attr("checked") ); // checked
document.writeln( $uid.prop("checked") ); // true
// 取消复选框uid的选中(将其设为false即可)
// 相当于 uid.checked = false;
$uid.prop("checked", false);
// attr()获取的是初始状态的值,即使取消了选中,也不会改变
document.writeln( $uid.attr("checked") ); // checked
// prop()获取的值已经发生变化
document.writeln( $uid.prop("checked") ); // false
</script>
登入後複製

以上是jquery中attr和prop的區別實例用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板