學習zepto.js(對象方法)[3]


繼續說zepto里attributes的相關操作.

attr,removeAttr,prop這三個方法.

attr():

三種用途

get:

返回值為一個string字符串

$("<span id="special"></span>").attr("id");//--> "special"

 注意:只能返回對象中第一個節點的屬性值

set:

返回值為一個zepto對象

$("<span>").attr("id", "special");//--> [<span id="special"></span>]

第二個參數也可以傳入一個function,有兩個參數可以使用

1:index,zepto對象dom元素數組的下標

2:value,該對象對應屬性的值

$("<div id='demo1'></div>").attr("id",function (index, value) {
    console.log(index, value);    // --> 0 demo1
});

上邊那段代碼如果執行了.那么該zepto對象的id屬性值就會被清除,因為該函數沒有返回字符串用來設置值.

或者也可以直接傳入一個json串來修改多個屬性.

$("<span>").attr({
    id: 'special',
    name: 'special'
});

remove:

返回值也是一個zepto對象,作用相當於調用removeAttr()

$("<span id="special"></span>").attr("id", null);//--> [<span></span>]

需注意的只能傳入null才能觸發remove效果.

傳入function與json都可以,只要是返回值或者值為null,都會觸發remove;

removeAttr:

removeAttr相當於(功能)是attr的一部分.但是代碼實現是分開的.這個函數應用場景比較單一,所以省去了很多判斷.但最終都是調用的function getAttribute(){};

只接收一個參數,就是name

返回值是一個zepto對象.

$("<span id="special"></span>").removeAttr("id");//--> [<span></span>]

 

移除多個屬性請用空格分開

prop:

prop用來設置或取出dom元素的屬性值.功能相當於 (prop = attr - removeAttr);

prop用法與attr相同.只不過沒有remove功能.兩者的區別在這里

讀取或設置dom元素的屬性值。它在讀取屬性值的情況下優先於 attr,因為這些屬性值會因為用戶的交互發生改變,如checked 和 selected

那是zepto.js中文api中所說的.本人認為,在判斷有關交互的屬性時,應優先使用prop,比如checked和selected;

之所以為出現差異,是因為兩者底層實現的區別.

prop采用的是上邊那種,而attr是兩種都用到了;

getAttribute()方法只能取出存在於標簽中的屬性"<div id name></div>" // 只能取出id與name.隱式的屬性是取不出來的,比如style

來說說實現吧.

attr

attr返回的那個三元運算符嵌套寫的有點虎...待我細細說來;

--首先判斷name參數是否為字符串,並且只有一個實參.這樣來講就是get功能.

----如果this.length不存在.則說明不是一個zepto對象(理論上),如果數組中第一個對象的nodeType值不為1,則說明不是節點對象.直接返回undefined

----否則就從調用該節點的getAttribute方法,並賦值給result變量. name in this[0] 這個表達式返回一個bool值.同時將result使用!來轉換為bool值.如果沒有通過getAttribute方法取出來值,並且該屬性存在於節點,

------通過節點直接取值.

------否則直接返回getAttribute的返回值.

--剩下來的就是set與remove功能的實現,這兩個是支持多對象的操作.返回值均為調用者本身(調用者調用了each循環,循環所有節點對象).

----如果對象不是一個節點對象,則直接跳過本次循環;

----如果name為一個object,就是說我們一次性更改多個屬性值.這時就循環object對象,來調用setAttribute方法

----剩下的條件就是給單個屬性賦值,之前說過那個funcArg方法,判斷第二個參數是否為function類型,如果是則通過當前節點為作用域執行方法,否則直接返回第二個參數.

關於是否進行set還是remove,這些是在setAttribute方法中做的處理.一個簡單的三元運算符;

removeAttr

參數只有一個,name,就是要移除的屬性的名稱,

大體執行過程為,循環調用方法的對象,並將傳入的name按空格分割為數組並執行forEach循環,forEach循環傳入第二個參數為循環內部this的指向.然后在內部調用setAttribute方法.只傳入兩個參數,則執行removeAttribute方法;

prop

參數為兩個.第一個固定為屬性的名稱,第二個可以為一個function,一個字符串.同樣,如果不傳第二個參數則認為是get,否則是set.

執行過程與attr的類似,但是attr賦值是通過setAttribute()方法,取值是getAttribute()與對象屬性取值的結合.而prop完全操作的是對象的屬性;

 

(這個本來要昨天發的,跟領導談離職,耽誤了.)

 

再來點吧.說說data方法與val方法.都是操作dom屬性的.一氣兒說完它;

data:

方法接受兩個參數,第一個是name,第二個為值,如果不填第二個則執行取值,否則為賦值

用法與attr類似,但是會將傳入的name值加上"data-"的前綴,並且會將駝峰命名轉換為全小寫連字符的格式;

取值時也不需要加"data-"前綴.

就是說,

$("").data("id");//取的是 data-id屬性的值
$("").data("userName","scott");//給data-user-name屬性賦值

 

第二個參數也可以是一個function;

actually,data方法內部調用的就是attr方法

deserializeValue是一個反序列化函數,如果有其他地方需要,不妨將該方法copy出去;

val:

方法接收一個參數,如果不填,則視為取value值,否則為設置value值.

$("").val();// getter
$("").val("");// setter

 

參數可以是一個字符串,function;function接收的參數為(index[對象的下標],value[對象之前的值]),function需返回一個字符串;

方法本身無亮點,但是返回值有三種;

一:

  返回一個字符串,作為get值時返回;

二:

  返回一個字符串數組,作為get值時返回;

三:

  返回對象本身,作為set值時返回;

之所以會存在第二種情況,那是因為select(下拉選項)是可以多選的.而開啟多選的屬性開關名字叫multiple;

當下拉選項開啟多選時,直接通過value屬性只會取到第一個值,其余的取不到.所以在代碼中就做了處理;

取出對象所有的option子節點.通過filter方法返回被選中的節點集合,並調用pluck方法

一個來自prototype.js大表哥中的方法;

傳入一個屬性名,將調用者集合中所有的該屬性的值作為一個數組返回;

其余的沒什么了.

如果有什么疑惑的地方還請留言問我.大家共同學習;

或者我的扣扣


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM