jQuery 層次選擇器
十載的宣威網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整宣威建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“宣威網(wǎng)站設(shè)計”,“宣威網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
$("div span") 選取div里的所有span元素
$("div span") 選取div元素下元素名是span的子元素
$("#one +div") 選取id為one的元素的下一個div同輩元素 等同于$(#one).next("div")
$("#one~div") 選取id為one的元素的元素后面的所有div同輩元素 等同于$(#one).nextAll("div")
$(#one).siblings("div") 獲取id為one的元素的所有div同輩元素(不管前后)
$(#one).prev("div") 獲取id為one的元素的前面緊鄰的同輩div元素
所以 獲取元素范圍大小順序依次為:
$(#one).siblings("div")$("#one~div")$("#one +div") 或是
$(#one).siblings("div")$(#one).nextAll("div")$(#one).next("div")
不積跬步,無以至千里!
jQuery 庫是專為加快 JavaScript 開發(fā)速度而設(shè)計的。通過簡化編寫 JavaScript 的方式,減少代碼量。使用 jQuery 庫時,您可能會發(fā)現(xiàn)您經(jīng)常為一些常用函數(shù)重寫相同的代碼。如果這樣的話,這可能就是您需要編寫自定義 jQuery 插件的一個原因。
jQuery 插件允許您使用自定義代碼擴展 jQuery 庫;您可以對一些重復(fù)性函數(shù)使用插件。例如,很多插件可供幻燈片、下拉菜單和折疊菜單所用。如果您搜索 jQuery 插件,就會發(fā)現(xiàn)有大量可用于自己項目的示例(看看它們是如何構(gòu)建的)。
常用縮略詞
CSS:層疊樣式表
HTML:超文本標記語言
在本文中,您將學(xué)習(xí)如何快速創(chuàng)建一個自定義 jQuery 插件。示例代碼和逐步操作將為您演示如何創(chuàng)建一個 jQuery accordion 插件。如果您了解 jQuery,而且準備讓您的技能再上一個臺階,這篇文章非常適合您。
您可以在此 下載 本文所用的示例源代碼。
先決條件
本文假設(shè)您對 JavaScript、jQuery 和層疊樣式表有一個基本了解。請參閱 參考資料 了解更多有關(guān)先決條件的信息。
回頁首
準備開始
jQuery 是一個可擴展 JavaScript 語言的庫。當(dāng)您創(chuàng)建一個 jQuery 插件時,本質(zhì)上是在擴展這個 jQuery 庫。要真正了解插件如何擴展 jQuery 庫需要對 JavaScript prototype 屬性有一個基本了解。盡管不直接使用,但是 JavaScript prototype 屬性可通過 jQuery 屬性 fn 在后臺使用,這是原生 JavaScript prototype 屬性的一個 jQuery 別名。
要使用 fn 屬性創(chuàng)建一個新 jQuery 插件,只需要為 fn 屬性分配一個插件名,并將其指向一個充當(dāng)構(gòu)造函數(shù)的新函數(shù),類似于純 JavaScript。清單 1 中的代碼顯示了如何定義一個名為 accordion 的新 jQuery 插件,其方法是通過使用 jQuery 對象和 fn 屬性,并將其分配給一個新的構(gòu)造函數(shù)。
清單 1. 定義一個名為 accordion 的新 jQuery 插件
jQuery.fn.accordion = function() {
// Add plugin code here
};
清單 1 展示了創(chuàng)建 jQuery 插件的一種方法;該示例沒有什么功能性錯誤。但是,創(chuàng)建一個 jQuery 插件所推薦的方法是,先創(chuàng)建一個允許使用美元符號 ($) 的包裝器函數(shù)。在默認情況下,美元符號可能與其他 JavaScript 框架發(fā)生沖突,如果將插件包裝在一個函數(shù)中,就不會出現(xiàn)沖突。清單 2 中的示例代碼顯示如何將一個包裝器函數(shù)應(yīng)用到一個 jQuery 插件定義中。
清單 2. 在一個包裝器函數(shù)中包裝一個名為 accordion 的新 jQuery 插件
(function($) {
$.fn.accordion = function() {
// Add plugin code here
};
})(jQuery);
在清單 2 中,jQuery 關(guān)鍵字被應(yīng)用到包裝器函數(shù)中,這允許您在插件中使用美元符號,就像使用 fn 屬性時那樣。包裝器函數(shù)就緒后,就可以在整個插件的任何地方使用美元符號代替 jQuery 關(guān)鍵字,不會干擾其他第三方插件。該選項提供了一種方法使我們可以在開發(fā)整個插件中編寫較少的代碼,并且有助于您的插件代碼保持整潔,易于維護。
回頁首
維護鏈接性
jQuery 的一個優(yōu)勢是允許您使用任何類型的選擇器。但是,必須記住,您的插件可以處理幾種不同的元素類型。使用 this 關(guān)鍵字允許您的插件應(yīng)用于相關(guān)函數(shù),通過循環(huán)實現(xiàn)每個元素的訪問,而不考慮元素類型。如果在 each 循環(huán)前使用 return 關(guān)鍵字,就可以使用您的插件維護鏈接性。清單 3 顯示了分配給一個函數(shù)處理程序且與 return 關(guān)鍵字相結(jié)合的 each 循環(huán)。
清單 3. 在 each 循環(huán)之前使用 return 關(guān)鍵字
(function($) {
$.fn.accordion = function() {
return this.each(function() {
// Using return allows for chainability
});
};
})(jQuery);
有了清單 3 的代碼后,示例 accordion 插件可用在一個方法調(diào)用鏈中。有了鏈接性(另一個強大的 jQuery 特性),您的插件就可用在一個方法調(diào)用鏈中。例如,下面的代碼顯示了如何淡出 HTML 元素,并在單一的方法調(diào)用鏈中將其從文檔對象模型 (DOM) 中刪除。
$("#my-div").fadeOut().remove();
回頁首
構(gòu)造一個 accordion
一個典型的層疊設(shè)計包括標題欄和相關(guān)內(nèi)容區(qū)域。定義列表是一個可供 accordions 使用的很好的 HTML 結(jié)構(gòu);dt 元素供標題所用,而dd 元素供內(nèi)容區(qū)域所用。清單 4 中的 HTML 結(jié)構(gòu)是一個定義列表,含有四個標題以及相應(yīng)的內(nèi)容區(qū)域。
清單 4. 單一方法調(diào)用鏈
dl class="accordion" id="my-accordion"
dtSection 1/dt
ddMauris mauris ante, blandit et, ultrices a, suscipit eget, quam./dd
dtSection 2/dt
ddVestibulum a velit eu ante scelerisque vulputate./dd
dtSection 3/dt
ddNam mi. Proin viverra leo ut odio. Curabitur malesuada./dd
dtSection 4/dt
ddVivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc./dd
/dl
清單 4 中定義的列表也有一個分配給它的名為 accordion 的 CSS 類。沒有應(yīng)用任何 CSS,這個 accordion
1. 沒有應(yīng)用任何 CSS 的 accordion 結(jié)構(gòu)
accordion 類用于將類型應(yīng)用到整個定義列表、標題和內(nèi)容區(qū)域。在清單 5 的示例中,accordion 類本身應(yīng)用于寬度、邊框、字體集和字體大小。清單 5 的示例中。您可以修改任何一個正在運行的 CSS 示例以包含您自定義的風(fēng)格,比如顏色、字體、大小和間距。
清單 5. 用于定義整個定義列表樣式的 accordion CSS 類
.accordion {
width: 500px;
border: 1px solid #ccc;
border-bottom: none;
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
}
然后,您可以使用 accordion CSS 類定義標題 (dt) 和內(nèi)容 (dd) 樣式。標題和內(nèi)容都包含一個設(shè)置底邊框為 0 的共享樣式,這允許標題欄和內(nèi)容區(qū)域相互適宜地放置,如清單 6 所示。
清單 6. 與 accordion 標題和內(nèi)容區(qū)域相關(guān)聯(lián)的共享樣式
.accordion dt,
.accordion dd {
border-bottom: 1px solid #ccc;
margin: 0px;
}
為了使 dt 元素看起來更像一個標題欄,設(shè)置一個背景色并添加一個指針光標,明顯地呈現(xiàn)給用戶該標題欄是可點擊的。各種其他樣式也都包括在這些類中,比如填充、字體大小和字體粗細。dd 元素添加了填充,將描述與標題隔開一點。清單 7 顯示了一個示例。
清單 7. 與 accordion 標題和內(nèi)容區(qū)域相關(guān)的 CSS 類
.accordion dt {
background: #eaeaea;
cursor: pointer;
padding: 8px 4px;
font-size: 13px;
font-weight: bold;
}
.accordion dd {
padding: 12px 8px;
}
有了這些增加的 CSS,視覺效果將會更完美、更像 accordion
self是方法的一個參數(shù);
window.mapViewJs 的意思是window(代表整個瀏覽器的全局變量)的一個屬性(或者方法),可以動態(tài)給window等對象添加屬性(或者方法)的一種寫法;
function(window,document)是作為執(zhí)行帶self參數(shù)的匿名函數(shù)執(zhí)行時的一個參數(shù)(參數(shù)可以是固常量、變量、對象、方法、表達式等);
您不知道如何稱呼,我想說的是:沒學(xué)會站穩(wěn),就開始學(xué)著人家跑了,首先方式就偏了。
建議你先站起來,走兩步,走穩(wěn)了再慢跑,慢慢的提高速度,然后就奔跑吧,兄弟~
該博客基于阮一峰前輩在2011年所做的分享(原鏈接: )
jQuery的核心就是:可以選擇某個網(wǎng)頁元素,然后對其進行某種操作
我們可知jQuery是一個構(gòu)造函數(shù),那么我們就可以通過選擇表達式,把選中的元素,放進jQuery構(gòu)造函數(shù)($)當(dāng)中,從而得到選中的元素。
而選擇表達式可以是CSS選擇器:
也可以是jQuery特有的表達式:
在jQuery當(dāng)中最終選中網(wǎng)頁元素以后,可以對它進行一系列操作,并且所有操作可以連接在一起,以鏈條的形式寫出來,比如:
拆解開來,就是:
這是jQuery最令人稱道、最方便的特點。它的原理在于每一步的jQuery操作所返回的都是一個jQuery對象,所以不同操作可以連在一起。
jQuery還提供了.end()方法,使得結(jié)果集可以后退一步:
創(chuàng)建新元素的方法非常簡單,只要把新元素直接傳入jQuery的構(gòu)造函數(shù)就行了:
操作元素在網(wǎng)頁中的位置移動有兩種方法:
(1)直接移動該元素;
(2)移動其他元素,使得目標元素達到我們想要的位置。
(1)方法是使用.insertAfter(),把div元素移動p元素后面:
(2)方法是使用.after(),把p元素加到div元素前面:
表面上看,這兩種方法的效果是一樣的,唯一的不同似乎只是操作視角的不同。但是實際上,它們有一個重大差別,那就是返回的元素不一樣。第一種方法返回div元素,第二種方法返回p元素。你可以根據(jù)需要,選擇到底使用哪一種方法。
使用這種模式的操作方法,一共有四對:
text(?) //讀寫文本內(nèi)容
用于返回內(nèi)容時,則返回所有匹配元素的文本內(nèi)容(會刪除 HTML 標記)。
用于設(shè)置內(nèi)容時,則重寫所有匹配元素的內(nèi)容。
html(?) //讀寫HTML內(nèi)容
設(shè)置或返回被選元素的 innerHTML(文本 + HTML 標記)
attr('title',?) // 讀寫屬性
設(shè)置或返回被選元素的屬性值。
css({color:'red'}) //讀寫style
設(shè)置或返回被選元素的一個或多個樣式屬性。
addClass('blue')
向被選元素添加一個或多個類。
該方法不會移除已存在的 class 屬性,僅僅添加一個或多個 class 屬性。
on('click',fn)
支持動態(tài)綁定元素,即頁面上元素有添加或變化后仍可綁定,前提是selector須是目標綁定元素的父元素
off('click',fn)
用于移除通過 on()方法添加的事件處理程序
用html字符串創(chuàng)建jquery對象的方法是通過js預(yù)發(fā)構(gòu)造出來的。
以下通過div的構(gòu)造后,追加字符串為例來說明
1、創(chuàng)建一個js變量,存放構(gòu)造div的表達式:
var string = 'divinput type="text" value="val" //div';
2、通過1創(chuàng)建的div,在其標簽之間追加html內(nèi)容:
$('div/').html(string).contents();
以上1和2主要執(zhí)行過程如下:
$('div/')是一個并不存在的dom對象是通過執(zhí)行js表達式動態(tài)構(gòu)建出來的
$('div/').html(string) 追加string內(nèi)容到div之間作為子節(jié)點
.contents()把上面創(chuàng)建的div作為jquery對象來檢索內(nèi)容,創(chuàng)建一個真正的div
jQuery對象是由其prototype的init構(gòu)造器進行構(gòu)造實例,與prototype無關(guān),可以抽離出來。
// 最新版本2.1.4
// 73行定義了jQuery構(gòu)造函數(shù)
// Define a local copy of jQuery
jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
// Need init if jQuery is called (just allow error to be thrown if not included)
// 76行 jQuery對象通過prototype下的init方法進行構(gòu)造并返回實例
return new jQuery.fn.init( selector, context );
},
// 92行 代碼告訴我們 jQuery.fn 和 jQuery.prototype 是指向同一對象,也就是說fn是prototype的簡寫
jQuery.fn = jQuery.prototype = {
// The current version of jQuery being used
jquery: version,
// 96行修正constructor屬性指回jQuery。同時jQuery對象雖然是用jQuery.fn.init方法構(gòu)造,但constructor依然修正指向了jQuery,非為jQuery.fn.init,看下方代碼
constructor: jQuery,
// 2735行 定義了jQuery.fn.init構(gòu)造函數(shù)
init = jQuery.fn.init = function( selector, context ) {
// 2835行 使得jQuery.fn.init構(gòu)造函數(shù)的原型和jQuery原型同時指向了同一個對象
// Give the init function the jQuery prototype for later instantiation
init.prototype = jQuery.fn;
// 9202行 而$僅僅只是jQuery對象的一個別名,跟無new構(gòu)造無關(guān)
window.jQuery = window.$ = jQuery;
大概的代碼結(jié)構(gòu)就是這樣子。
jQuery僅僅為了實現(xiàn)無new構(gòu)造,在其原型下創(chuàng)建了init方法(僅充當(dāng)構(gòu)造器)為其構(gòu)造實例對象,init方法的原型和jQuery原型指向了同一個對象(當(dāng)然就成了循環(huán)引用),為后續(xù)的實例方法和實例插件機制打下基礎(chǔ)(如果不指向同一對象寫實例插件將會出現(xiàn)$.fn.init.fn.xxxxx這一幕),并修正constructor的指向,使得看起來像是由jQuery構(gòu)造器構(gòu)造。
$只是jQuery對象的別名, $ === jQuery 是成立的,并且因為使用new操作符的時候 ( new jQuery() ) 和 jQuery() 的 reutrn 值會覆蓋new操作符生成的實例,所以 jQuery() 和 new jQuery () 的結(jié)果也是一樣的。
而題主示例是
1、 $是實現(xiàn)jQuery無new構(gòu)造的方法
2、 $ !== jQuery
3、 jQuery() 和 new jQuery的結(jié)果是不同的