標籤:content 變化 dcl 資料介面 back 並且 asc 理解 pre
1jQuery的屬性與樣式之.attr()與.removeAttr()
每個元素都有一個或者多個特性,這些特性的用途就是給出相應元素或者其內容的附加資訊。如:在img元素中,src就是元素的特性,用來標記圖片的地址。
操作特性的DOM方法主要有3個,getAttribute方法、setAttribute方法和removeAttribute方法,就算如此在實際操作中還是會存在很多問題,這裡先不說。而在jQuery中用一個attr()與removeAttr()就可以全部搞定了,包括相容問題
jQuery中用attr()方法來擷取和設定元素屬性,attr是attribute(屬性)的縮寫,在jQuery DOM操作中會經常用到attr()
attr()有4個運算式
- attr(傳入屬性名稱):擷取屬性的值
- attr(屬性名稱, 屬性值):設定屬性的值
- attr(屬性名稱,函數值):設定屬性的函數值
- attr(attributes):給指定元素設定多個屬性值,即:{屬性名稱一: “屬性值一” , 屬性名稱二: “屬性值二” , … … }
removeAttr()刪除方法
.removeAttr( attributeName ) : 為匹配的元素集合中的每個元素中移除一個屬性(attribute)
優點:
attr、removeAttr都是jQuery為了屬性操作封裝的,直接在一個 jQuery 對象上調用該方法,很容易對屬性進行操作,也不需要去特意的理解瀏覽器的屬性名稱不同的問題
注意的問題:
dom中有個概念的區分:Attribute和Property翻譯出來都是“屬性”,《js進階程式設計》書中翻譯為“特性”和“屬性”。簡單理解,Attribute就是dom節點內建的屬性
例如:html中常用的id、class、title、align等:
<div id="immooc" title="慕課網"></div>
而Property是這個DOM元素作為對象,其附加的內容,例如,tagName, nodeName, nodeType,, defaultChecked, 和 defaultSelected 使用.prop()方法進行取值或賦值等
擷取Attribute就需要用attr,擷取Property就需要用prop
2jQuery的屬性與樣式之html()及.text()
讀取、修改元素的html結構或者元素的常值內容是常見的DOM操作,jQuery針對這樣的處理提供了2個便捷的方法.html()與.text()
.html()方法
擷取集合中第一個匹配元素的HTML內容 或 設定每一個匹配元素的html內容,具體有3種用法:
- .html() 不傳入值,就是擷取集合中第一個匹配元素的HTML內容
- .html( htmlString ) 設定每一個匹配元素的html內容
- .html( function(index, oldhtml) ) 用來返回設定HTML內容的一個函數
注意事項:
.html()方法內部使用的是DOM的innerHTML 屬性來處理的,所以在設定與擷取上需要注意的一個最重要的問題,這個操作是針對整個HTML內容(不僅僅只是常值內容)
.text()方法
得到匹配元素集合中每個元素的常值內容結合,包括他們的後代,或設定匹配元素集合中每個元素的常值內容為指定的常值內容。,具體有3種用法:
- .text() 得到匹配元素集合中每個元素的合并文本,包括他們的後代
- .text( textString ) 用於設定匹配元素內容的文本
- .text( function(index, text) ) 用來返回設定常值內容的一個函數
注意事項:
.text()結果返回一個字串,包含所有匹配元素的合并文本
.html與.text的異同:
- .html與.text的方法操作是一樣,只是在具體針對處理對象不同
- .html處理的是元素內容,.text處理的是常值內容
- .html只能使用在HTML文檔中,.text 在XML 和 HTML 文檔中都能使用
- 如果處理的對象只有一個子文本節點,那麼html處理的結果與text是一樣的
- Firefox不支援innerText屬性,用了類似的textContent屬性,.text()方法綜合了2個屬性的支援,所以可以相容所有瀏覽器
3jQuery的屬性與樣式之.val()
jQuery中有一個.val()方法主要是用於處理表單元素的值,比如 input, select 和 textarea。
.val()方法
- .val()無參數,擷取匹配的元素集合中第一個元素的當前值
- .val( value ),設定匹配的元素集合中每個元素的值
- .val( function ) ,一個用來返回設定值的函數
注意事項:
- 通過.val()處理select元素, 當沒有選擇項被選中,它返回null
- .val()方法多用來設定表單的欄位的值
- 如果select元素有multiple(多選)屬性,並且至少一個選擇項被選中, .val()方法返回一個數組,這個數組包含每個選中選擇項的值
.html(),.text()和.val()的差異總結:
- .html(),.text(),.val()三種方法都是用來讀取選定元素的內容;只不過.html()是用來讀取元素的html內容(包括html標籤),.text()用來讀取元素的純文字內容,包括其後代元素,.val()是用來讀取表單元素的"value"值。其中.html()和.text()方法不能使用在表單元素上,而.val()只能使用在表單元素上;另外.html()方法使用在多個元素上時,唯讀取第一個元素;.val()方法和.html()相同,如果其應用在多個元素上時,只能讀取第一個表單元素的"value"值,但是.text()和他們不一樣,如果.text()應用在多個元素上時,將會讀取所有選中元素的常值內容。
- .html(htmlString),.text(textString)和.val(value)三種方法都是用來替換選中元素的內容,如果三個方法同時運用在多個元素上時,那麼將會替換所有選中元素的內容。
- .html(),.text(),.val()都可以使用回呼函數的傳回值來動態改變多個元素的內容。
4jQuery的屬性與樣式之增加樣式.addClass()
通過動態改變類名(class),可以讓其修改元素呈現出不同的效果。在HTML結構中裡,多個class以空格分隔,當一個節點(或稱為一個標籤)含有多個class時,DOM元素響應的className屬性擷取的不是class名稱的數組,而是一個含有空格的字串,這就使得多class操作變得很麻煩。同樣的jQuery開發人員也考慮到這種情況,增加了一個.addClass()方法,用於動態增加class類名
.addClass( className )方法
- .addClass( className ) : 為每個匹配元素所要增加的一個或多個樣式名
- .addClass( function(index, currentClass) ) : 這個函數返回一個或更多用空格隔開的要增加的樣式名
注意事項:
.addClass()方法不會替換一個樣式類名。它只是簡單的添加一個樣式類名到元素上
簡單的描述下:在p元素增加一個newClass的樣式
<p class="orgClass">$("p").addClass("newClass")
那麼p元素的class實際上是 class="orgClass newClass"樣式只會在原本的類上繼續增加,通過空格分隔
5jQuery的屬性與樣式之刪除樣式.removeClass()
jQuery通過.addClass()方法可以很便捷的增加樣式。如果需要樣式之間的切換,同樣jQuery提供了一個很方便的.removeClass(),它的作用是從匹配的元素中刪除全部或者指定的class
.removeClass( )方法
- .removeClass( [className ] ):每個匹配元素移除的一個或多個用空格隔開的樣式名
- .removeClass( function(index, class) ) : 一個函數,返回一個或多個將要被移除的樣式名
注意事項
如果一個樣式類名作為一個參數,只有這樣式類會被從匹配的元素集合中刪除 。 如果沒有樣式名作為參數,那麼所有的樣式類將被移除
6jQuery的屬性與樣式之轉場樣式.toggleClass()
在做某些效果的時候,可能會針對同一節點的某一個樣式不斷的切換,也就是addClass與removeClass的互斥切換,比如隔行換色效果
jQuery提供一個toggleClass方法用於簡化這種互斥的邏輯,通過toggleClass方法動態添加刪除Class,一次執行相當於addClass,再次執行相當於removeClass
.toggleClass( )方法:在匹配的元素集合中的每個元素上添加或刪除一個或多個樣式類,取決於這個樣式類是否存在或值切換屬性。即:如果存在(不存在)就刪除(添加)一個類
- .toggleClass( className ):在匹配的元素集合中的每個元素上用來切換的一個或多個(用空格隔開)樣式類名
- .toggleClass( className, switch ):一個布爾值,用於判斷樣式是否應該被添加或移除
- .toggleClass( [switch ] ):一個用來判斷樣式類添加還是移除的 布爾值
- .toggleClass( function(index, class, switch) [, switch ] ):用來返回在匹配的元素集合中的每個元素上用來切換的樣式類名的一個函數。接收元素的索引位置和元素舊的樣式類作為參數
注意事項:
- toggleClass是一個互斥的邏輯,也就是通過判斷對應的元素上是否存在指定的Class名,如果有就刪除,如果沒有就增加
- toggleClass會保留原有的Class名後新增,通過空格隔開
7jQuery的屬性與樣式之樣式操作.css()
通過JavaScript擷取dom元素上的style屬性,我們可以動態給元素賦予樣式屬性。在jQuery中我們要動態修改style屬性我們只要使用css()方法就可以實現了
.css() 方法:擷取元素樣式屬性的計算值或者設定元素的CSS屬性
擷取:
- .css( propertyName ) :擷取匹配元素集合中的第一個元素的樣式屬性的計算值
- .css( propertyNames ):傳遞一組數組,返回一個對象結果
設定:
- .css(propertyName, value ):設定CSS
- .css( propertyName, function ):可以傳入一個回呼函數,返回取到對應的值進行處理
- .css( properties ):可以傳一個對象,同時設定多個樣式
注意事項:
- 瀏覽器屬性擷取方式不同,在擷取某些值的時候都jQuery採用統一的處理,比如顏色採用RBG,尺寸採用px
- .css()方法支援駝峰寫法與大小寫混搭的寫法,內部做了容錯的處理
- 當一個數只被作為值(value)的時候, jQuery會將其轉換為一個字串,並添在字串的結尾處添加px,例如 .css("width",50}) 與 .css("width","50px"})一樣
8jQuery的屬性與樣式之.css()與.addClass()設定樣式的區別
對於樣式的設定,我們學了addClass與css方法,那麼兩者之間有什麼區別?
可維護性:
.addClass()的本質是通過定義個class類的樣式規則,給元素添加一個或多個類。css方法是通過JavaScript大量代碼進行改變元素的樣式
通過.addClass()我們可以批量的給相同的元素設定統一規則,變動起來比較方便,可以統一修改刪除。如果通過.css()方法就需要指定每一個元素是一一的修改,日後維護也要一一的修改,比較麻煩
靈活性:
通過.css()方式可以很容易動態去改變一個樣式的屬性,不需要在去繁瑣的定義個class類的規則。一般來說在不確定開始布局規則,通過動態產生的HTML代碼結構中,都是通過.css()方法處理的
樣式值:
.addClass()本質只是針對class的類的增加刪除,不能擷取到指定樣式的屬性的值,.css()可以擷取到指定的樣式值。
樣式的優先順序:
css的樣式是有優先順序的,當外部樣式、內部樣式和內聯樣式同一樣式規則同時應用於同一個元素的時候,優先順序如下
外部樣式 < 內部樣式 < 內聯樣式
- .addClass()方法是通過增加class名的方式,那麼這個樣式是在外部檔案或者內部樣式中先定義好的,等到需要的時候在附加到元素上
- 通過.css()方法處理的是內聯樣式,直接通過元素的style屬性附加到元素上的
通過.css方法設定的樣式屬性優先順序要高於.addClass方法
總結:
.addClass與.css方法各有利弊,一般是靜態結構,都確定了布局的規則,可以用addClass的方法,增加統一的類規則如果是動態HTML結構,在不確定規則,或者經常變化的情況下,一般多考慮.css()方式
9jQuery的屬性與樣式之元素的資料存放區
html5 dataset是新的HTML5標準,允許你在普通的元素標籤裡嵌入類似data-*的屬性,來實現一些簡單資料的存取。它的數量不受限制,並且也能由JavaScript動態修改,也支援CSS選取器進行樣式設定。這使得data屬性特別靈活,也非常強大。有了這樣的屬性我們能夠更加有序直觀的進行資料預設或儲存。那麼在不支援HTML5標準的瀏覽器中,我們如何?資料存取? jQuery就提供了一個.data()的方法來處理這個問題
使用jQuery初學者一般不是很關心data方式,這個方法是jquery內部預用的,可以用來做效能最佳化,比如sizzle選擇中可以用來緩衝部分結果集等等。當然這個也是非常重要的一個API了,常常用於我們存放臨時的一些資料,因為它是直接跟DOM元素對象綁定在一起的
jQuery提供的儲存介面
jQuery.data( element, key, value ) //靜態介面,存資料jQuery.data( element, key ) //靜態介面,取資料 .data( key, value ) //執行個體介面,存資料.data( key ) //執行個體介面,存資料
2個方法在使用上存取都是通一個介面,傳遞元素,索引值資料。在jQuery的官方文檔中,建議用.data()方法來代替。
我們把DOM可以看作一個對象,那麼我們往對象上是可以存在基本類型,參考型別的資料的,但是這裡會引發一個問題,可能會存在循環參考的記憶體流失風險
通過jQuery提供的資料介面,就很好的處理了這個問題了,我們不需要關心它底層是如何?,只需要按照對應的data方法使用就行了
同樣的也提供2個對應的刪除介面,使用上與data方法其實是一致的,只不過是一個是增加一個是刪除罷了
jQuery.removeData( element [, name ] ).removeData( [name ] )
參考右邊的代碼地區,2個程式碼片段分別描述了靜態與執行個體data的使用
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title></title>
<style>
.left,
.right {
width: 300px;
height: 120px;
}
.left div,
.right div {
width: 100px;
height: 90px;
padding: 5px;
margin: 5px;
float: left;
border: 1px solid #ccc;
}
.left div {
background: #bbffaa;
}
.right div {
background: yellow;
}
</style>
<script src="http://libs.baidu.com/jquery/1.9.1/jquery.js"></script>
</head>
<body>
<h2>jQuery.data()靜態方法</h2>
<div class="left">
<div class="aaron">
<p>點擊看結果</p>
<p>jQuery.data</p>
</div>
<div><span></span></div>
</div>
<h2>.data()執行個體方法</h2>
<div class="right">
<div class="aaron">
<p>點擊看結果</p>
<p>.data</p>
</div>
<div><span></span></div>
</div>
<script type="text/javascript">
$(‘.left‘).click(function() {
var ele = $(this);
//通過$.data方式設定資料
$.data(ele, "a", "data test")
$.data(ele, "b", {
name : "慕課網"
})
//通過$.data方式取出資料
var reset = $.data(ele, "a") + "</br>" + $.data(ele, "b").name
ele.find(‘span‘).append(reset)
})
</script>
<script type="text/javascript">
$(‘.right‘).click(function() {
var ele = $(this);
//通過.data方式設定資料
ele.data("a", "data test")
ele.data("b", {
name: "慕課網"
})
//通過.data方式取出資料
var reset = ele.data("a") + "</br>" + ele.data("b").name
ele.find(‘span‘).append(reset)
})
</script>
</body>
</html>
jQuery的屬性及樣式