原文連接 http://blog.poetries.top/2016...javascript
首先,來了解一下jQuery
學習的總體思路php
JQuery
概念html
javascript
概念前端
基於Js
語言的API
和語法組織邏輯,經過內置window
和document
對象,來操做內存中的DOM
元素java
JQuery
概念jquery
基於javascript
的,同上,提升了代碼的效率css3
jQuery
是什麼:git
是一個javascript
代碼倉庫,咱們稱之爲javascript
框架。github
是一個快速的簡潔的javascript
框架,能夠簡化查詢DOM
對象、處理事件、製做動畫、處理Ajax
交互過程。
它能夠幫咱們作什麼(有什麼優點)
輕量級、體積小,使用靈巧(只需引入一個js
文件)
強大的選擇器
出色的DOM
操做的封裝
出色的瀏覽器兼容性
可靠的事件處理機制
完善的Ajax
鏈式操做、隱式迭代
方便的選擇頁面元素(模仿CSS
選擇器更精確、靈活)
動態更改頁面樣式/頁面內容(操做DOM
,動態添加、移除樣式)
控制響應事件(動態添加響應事件)
提供基本網頁特效(提供已封裝的網頁特效方法)
快速實現通訊(ajax
)
易擴展、插件豐富
如何引入JQuery
包
引入本地的JQuery
引入Google
在線提供的庫文件(穩定可靠高速)
使用Google
提供的API
導入 <script type=「text/javascript」 src=「jquery.js」></script>
寫第一個JQUery
案例
解釋:在JQuery
庫中,$
是JQuery
的別名,$()
等效於就jQuery()
<script type=「text/javascript」 src=「」></script> <script type=「text/javascript」> $(function(){ alert(「jQuery 你好!」); }); </script>
講解$(function(){})
;
$
是jQuery
別名。如$()
也可jQuery()
這樣寫,至關於頁面初始化函數,當頁面加載完畢,會執行jQuery()
。
但願在作全部事情以前,JQuery
操做DOM
文檔。必須確保在DOM
載入完畢後開始執行,應該用ready
事件作處理HTML
文檔的開始
$(document).ready(function(){})
;
相似於js
的window.onload
事件函數,可是ready
事件要先於onload
事件執行
window.onload = function(){}
;
爲方便開發,jQuery
簡化這樣的方法,直接用$()
表示
JQuery
的ready
事件不等於Js
的load
:
執行時機不一樣:load
須要等外部圖片和視頻等所有加載才執行。ready
是DOM
繪製完畢後執行,先與外部文件
用法不一樣:load
只可寫一次,ready
能夠屢次
window.onload
與$(document).ready()
對比
window.onload | $(document).ready() | |
---|---|---|
執行時機 | 必須等網頁中全部內容加載完後(圖片)才執行 | 網頁中的DOM 結構繪製完後就執行,可能DOM 元素相關的東西並無加載完 |
編寫個數 | 不能同時執行多個 | 能同時執行多個 |
簡化寫法 | 無 | $(document).ready(function(){ //.. }); 推薦寫法: $(function(){ }); |
jQuery
有哪些功能(API
):
選擇器
過濾器
事件
效果
ajax
簡單的JQuery
選擇器:
JQuery
基本選擇器(ID
選擇器,標籤選擇器,類選擇器,通配選擇器和組選擇器5
種)
ID
選擇器:document.getElementById(id)
與$("#id")
對比(改變文字大小)---id
惟一,返回單個元素
標籤選擇器:document.getElementsByTagName(tagName)
與$("tagname")
對比---多個標籤,返回數組
類選擇器:$(".className")
--多個classname
(改變背景圖片)
通配選擇器:document.getElementsByTagName("*")
與$("*")
對比---指範圍內的全部標籤元素
組選擇器:$("seletor1,seletor2,seletor3")
----無數量限制,用逗號分割
JQuery
JQuery
是什麼
javascript
用來幹什麼的:
操做DOM
對象
動態操做樣式css
數據訪問
控制響應事件等
jQuery
做用同樣,只是更加快速簡潔
如何引用JQuery
<script type="text/javascript"></script> 寫第一個JQUery案例 <script type=「text/javascript」 src=「」></script> <script type=「text/javascript」> $(function(){ alert(「jQuery 你好!」); }); </script>
$()講解
$
在JQuery
庫中,$
是JQuery
的別名,$()
等效於就jQuery()
.
$()
是JQuery
方法,贊可看做是JQuery
的選擇器,與css
選擇器類似(可作對比)
var jQuery==$ =function(){}
$()
本質就是一個函數也就是 jQuery
的核心函數
只要是jQuery
的對象都這樣變量加上一個符號$
方便識別:var $div = $("#")
function $(id){ return document.getElementById(id); }
$()
和document
是相等的嗎
<div id="a" class="aa"></div> <div id="b" class="aa"></div> <div id="c" class="aa"></div> alert(document.getElementById("id") == $("#aa"));//返回結果爲false alert(document.getElementById("id") == $("#aa").get(0));//返回true
代理對象$()
jQuery
中返回的是代理對象自己
jQuery
的核心原理是經過選擇器找到對應的代理對象
jQuery
全都是經過方法操做
樣式選擇器$(".className")
$(".aa").css("color","green");
id選擇器("")
$("#a").css("background-color","#ff0066");
標籤選擇器
$("p").css("color","#cc3366");
組選擇器
$("#b ul li").size();
對象轉換($(element)
)
原生dom
對象和jquery
代理對象的相互轉換
$(傳入的原生對象); //原生對象轉化成jQuery對象 var nav = document.getElementById("nav"); var $nav = $(nav); alert($nav.get(0) == nav);//true
檢索範圍的限制($('字符串',element)
)
總結:三種寫法對比:
方式一:不推薦 搜索速度最慢
$("#nav").css();
$("#nav li").css();
方式二:搜索速度最快 鏈式操做
$("#nav").css().children().css();
方式三:也經常使用 速度第二快
var $nav = $("#nav").css()
;
$("li",$nav).css()
; $nav
限制了搜索範圍 速度快
總結: $()
jquery
核心方法的做用和使用場景
若是是一個字符串參數而且沒有標籤對(選擇器) $(ul.nav")
若是是一個字符串參數而且有標籤對(建立html
標籤)$("<img>")
--最終加到DOM
樹中 $xx.append("<img>")
;
若是是傳入一個element dom
對象,直接包裝爲proxy
對象返回 $(DOM對象)
若是第一個參數是字符串,第二個是element
dom
對象的話,那麼就是在element
這個dom
對象裏面尋找選擇器對應的元素而且代理 $("li",$DOM對象)
代理模式以及代理內存結構
來回顧一下CSS
經常使用的選擇器
選擇器 | 語法 | 描述 |
---|---|---|
標籤選擇器 | E{css規則} |
以文檔元素做爲選擇符 |
ID 選擇器 |
#ID{css規則} |
ID 做爲選擇符 |
類選擇器 | E.className{css規則} |
class 做爲選擇符 |
羣組選擇器 | E1,E2,E3{css規則} |
多個選擇符應用一樣的樣式 |
後代選擇器 | E F{css規則} |
元素E 的任意後代元素F |
選擇器引擎規則($('字符串')
)
css
選擇器的規則
標籤選擇器
id
選擇器
類選擇器
混合選擇器
css3
的選擇器規則
狀態和僞類(:even
:odd
:first
:last
:eq(index)
)
屬性([attr=value]
)
層級選擇器:經過DOM
的嵌套關係匹配元素
jQuery
層級選擇器----包含選擇器、子選擇器、相鄰選擇器、兄弟選擇器4種
a.包含選擇器:$("a b")
在給定的祖先元素下匹配全部後代元素。(不受層級限制)
b.子選擇器:$("parent > child")
在給定的父元素下匹配全部子元素。
c.相鄰選擇器:$("prev + next")
匹配全部緊接在prev
元素後的next
元素。
d.兄弟選擇器:$("prev ~ siblings")
匹配prev元素以後的全部sibling
元素。
基本過濾選擇
選擇器 | 說明 | 返回 |
---|---|---|
:first |
匹配找到的第1個元素 | 單個元素 |
:last |
匹配找到的最後一個元素 | 單個元素 |
:eq |
匹配一個給定索引值的元素 | 單個元素 |
:even |
匹配全部索引值爲偶數的元素 | 集合元素 |
: odd |
匹配全部索引值爲奇數的元素 | 集合元素 |
:gt(index) |
匹配全部大於給定索引值的元素 | 集合元素 |
:lt(index) |
匹配全部小於給定索引值的元素 | 集合元素 |
:not |
去除全部與給定選擇器匹配的元素 | 集合元素 |
:animated |
選取當前正在執行動畫的全部元素 | 集合元素 |
focus |
選取當前正在獲取焦點的元素 | 集合元素 |
內容過濾選擇器
選擇器 | 描述 | 返回 |
---|---|---|
:contains(text) |
選取含有文本內容爲text的元素 | 集合元素 |
:empty |
選取不包含子元素獲取文本的空元素 | 集合元素 |
:has(selector) |
選擇含有選擇器所匹配的元素的元素 | 集合元素 |
:parent |
選取含有子元素或者文本的元素 | 集合元素 |
可見過濾選擇器
選擇器 | 描述 | 返回 |
---|---|---|
:hidden |
選擇全部不可見的元素 | 集合元素 |
:visible |
選取全部可見的元素 | 集合元素 |
屬性過濾選擇器
選擇器 | 說明 | 返回 |
---|---|---|
[attribute] |
選取擁有此屬性的元素 | 集合元素 |
[attribute=value] |
選取屬性值爲value 值的元素 |
集合元素 |
[attribue^=value] |
選取屬性的值以value 開始的元素 |
集合元素 |
[attribue$=value] |
選取屬性的值以value 結束的元素 |
集合元素 |
子元素過濾選擇器
選擇器 | 說明 | 返回 |
---|---|---|
:nth-child(index/even/odd) |
選取每一個父元素下的第index個子元素或者奇偶元素(index 從1 算起) |
集合元素 |
:first-child |
選取每一個元素的第一個子元素 | 集合元素 |
:last-child |
選取每一個元素的最後一個子元素 | 集合元素 |
:nth-child()
選擇器是很經常使用的子元素過濾選擇器,以下
:nth-child(even)
選擇每一個父元素下的索引值是偶數的元素
:nth-child(odd)
選擇每一個父元素下的索引值是奇數的元素
:nth-child(2)
選擇每一個父元素下的索引值是2
的元素
:nth-child(3n)
選擇每一個父元素下的索引值是3的倍數的元素 (n
從1
開始)
表單對象屬性過濾選擇器
選擇器 | 說明 | 返回 |
---|---|---|
:enabled |
選取全部可用元素 | 集合元素 |
:disabled |
選取全部不可用元素 | 集合元素 |
:checked |
選取全部被選中的元素(單選框、複選框) | 集合元素 |
:selected |
選取全部被選中的元素(下拉列表) | 集合元素 |
表單選擇器
選擇器 | 說明 |
---|---|
:input |
選取全部input textarea select button 元素 |
:text |
選取全部單行文本框 |
:password |
選取全部密碼框 |
:radio |
選取全部單選框 |
:checkbox |
選取全部多選框 |
:submit |
選取全部的提交按鈕 |
:image |
選取全部的圖像按鈕 |
:reset |
選取全部的重置按鈕 |
:button |
選取全部的按鈕 |
:file |
選取全部的上傳域 |
:hidden |
選取全部的不可見元素 |
特定位置選擇器
:first
:last
:eq(index)
指定範圍選擇器
:even
:odd
:gt(index)
:lt(index)
排除選擇器
:not
非
使用合適的選擇器表達式能夠提升性能、加強語義並簡化邏輯。經常使用的選擇器中,ID
選擇器速度最快,其次是類型選擇器。
多用ID
選擇器
少直接使用class
選擇器
多用父子關係,少用嵌套關係
緩存jQuery
對象
使用過濾器
jQuery
提供了2
種選擇文檔元素的方式:選擇器和過濾器
類過慮器:根據元素的類屬性來進行過濾操做。
hasClass(className)
:判斷當前jQuery
對象中的某個元素是否包含指定類名,包含返回true
,不包含返回false
下標過濾器:精確選出指定下標元素
eq(index)
:獲取第N
個元素。index
是整數值,下標從0
開始
表達式過濾器
filter(expr)/(fn)
:篩選出與指定表達式/函數匹配的元素集合。
功能最強大的表達式過濾器,可接收函數參數,也能夠是簡單的選擇器表達式
映射 map(callback)
:將一組元素轉換成其餘數組
清洗 not(expr)
:刪除與指定表達式匹配的元素
截取 slice(start,end)
:選取一個匹配的子集
查找
向下查找後代元素
children()
:取得全部元素的全部子元素集合(子元素)
find()
:搜索全部與指定表達式匹配的元素(全部後代元素中查找)
查找兄弟元素 siblings()
查找當前元素的兄弟
代理對象屬性和樣式操做
attr
prop
(通常屬性值是boolean
的值或者不用設置屬性值,通常使用)
css
(最好不用,通常我用來作測試)
addClass
/ removeClass
操做原生DOM
的時候用的方式:一次只能操做一個
操做屬性:setAttribute
/ getAttribute
操做樣式:style.xx = value
操做類樣式:className=''
獲取DOM
的子元素children
屬性
DOM
裏面添加一個子元素appendChild()
操做jQuery
代理對象的時候:批量操做DOM
對象(全都是經過方法操做)
操做屬性:attr()
、prop()
attr
和prop
區別:若是屬性的值是布爾類型的值 用prop
操做 反之attr
操做樣式:css()
操做類樣式:addClass()
removeClass()
操做DOM
子元素:children()
添加子元素:append()
DOM
是一種與瀏覽器、平臺|語言無關的接口,使用該接口能夠輕鬆的訪問 頁面中的全部的標準組件
DOM
操做的分類
DOM Core
DOM core
並不專屬於JavaScript
,任何支持DOM
的程序均可以使用
JavaScript
中的getElementByID()
getElementsByTagName()
getAttribute()
setAttribute()
等方法都是DOM Core
的組成部分
HTML-DOM
HTML -DOM
的出現比DOM-Core
還要早,它提供一些更簡明的標誌來描述HTML
元素的屬性
好比:使用HTML-DOM
來獲取某元素的src
屬性的方法
element.src
CSS-DOM
針對CSS
的操做。在JavaScript
中,主要用於獲取和設置style
對象的各類屬性,經過改變style
對象的屬性,使網頁呈現不一樣的效果
查找節點
查找屬性節點 attr()
能夠獲取各屬性的值
建立節點
$(html)
:根據傳遞的標記字符串,建立DOM
對象
插入節點
方法 | 說明 |
---|---|
append() |
向每一個匹配元素內部追加內容 |
appendTo() |
顛倒append() 的操做 |
prepend() |
向每一個匹配元素的內容內部前置內容 |
prependTo() |
顛倒prepend() 的操做 |
after() |
向每一個匹配元素以後插入內容 |
insertAfter() |
顛倒after() 的操做 |
before() |
在每一個匹配元素以前插入內容 |
insertBefore() |
顛倒before() 的操做 |
刪除節點
jQuery提供了三種刪除節點的方法 remove()
detach()
empty()
remove()方法
當某個節點用此方法刪除後,該節點所包含的全部後代節點將同時被刪除,用remove()
方法刪除後,仍是能夠繼續使用刪除後的引用
detach()
和remove()
方法同樣,也是從DOM
中去掉全部匹配的元素,與remove()
不一樣的是,全部綁定的事件、附加的數據等,都會被保留下來
empty()
empty()
方法並非刪除節點,而是清空節點,它能清空元素中全部後代節點
複製節點
使用clone()
方法來完成
在clone()
方法中傳遞一個參數true
,同時複製元素中所綁定的事件
替換節點
jQuery
提供相應的方法 replaceWidth()
樣式操做
獲取樣式和設置樣式 attr()
追加樣式 addClass()
移除樣式 removeClass()
切換樣式
toggle()
方法只要是控制行爲上的重複切換(若是元素是顯示的,則隱藏;若是元素原來是隱藏的,則顯示)
toggleClass()
方法控制樣式上的重複切換(如何類名存在,則刪除它,若是類名不存在,則添加它)
判斷是否含有某個樣式
hasClass()
能夠用來判斷元素是否含有某個class
,若有返回true
該方法等價於is()
設置和獲取HTML、文本和值
html()
此方法相似JavaScript
中innerHTML
屬性,能夠用來讀取和設置某個元素中的HTML
內容
text()
方法
此方法類型JavaScript
中innerHTML
,用來讀取和設置某個元素中的文本內容
val()
方法
此方法相似JavaScript
中的value
屬性,用來設置獲取元素的值。不管是文本框、下拉列表仍是單選框,均可以返回元素的值,若是元素多選,返回一個包含全部選擇的值的數組
遍歷節點
children()
方法
該方法用來取得匹配元素的子元素集合
childre()
方法只考慮子元素而不考慮其餘後代元素
next()
方法
該方法用於取得匹配元素後面緊鄰的同輩元素
prev()
方法
用於匹配元素前面緊鄰的同輩元素
siblings()
方法
用於匹配元素先後全部的同輩元素
parent()
方法
得到集合中每一個 元素的父級元素
parents()
方法
得到集合中每一個元素的祖先元素
CSS DOM
技術簡單的來講就是讀取和設置style
對象的各類屬性
用css()
方法獲取元素的樣式屬性,能夠同時設置多個樣式屬性
CSS DOM
中關於元素定位有幾個經常使用的方法
offset()
方法
它的做用是獲取元素在當前視窗的相對偏移其中返回的對象包含兩個屬性,即top
和left
,他只對可見元素有效
position()
方法
獲取相對於最近的一個position()
樣式屬性設置爲relative
或者absolute
的祖父節點的相對偏移,與offset()
同樣,他返回的對象也包括兩個屬性,即top
和left
scrollTop()
方法和scrollLeft
方法
這兩個方法的做用分別是獲取元素的滾動條距頂端的距離和距左側的距離
一張圖總結以上的位置關係(項目中很經常使用-必需要弄清楚)
操做DOM
a.什麼是DOM
:Document Object Model
縮寫,文檔對象模型
b.理解頁面的樹形結構
c.什麼是節點:是DOM結構中最小單元,包括元素、屬性、文本、文檔等。
1.建立元素
語法:document.createElement(name)
;
var div = document.createElement("div"); document.body.appendChild(div);
$(html)
:根據傳遞的標記字符串,建立DOM對象
2.建立文本
var div = document.createElement("div"); var txt = document.createTextNode("DOM"); div.appendChild(txt); document.body.appendChild(div); var $div = = $("<div>DOM</div>"); $(body).append($div);
3.設置屬性
語法:e.setAttrbute(name,value)
var div = document.createElement("div"); var txt = document.createTextNode("DOM"); div.appendChild(txt); document.body.appendChild(div); div.setAttribute("title","盒子"); var $div = = $("<div title='盒子'>DOM</div>"); $(body).append($div);
內部插入
向元素最後面插入節點:
append()
:向每一個匹配的元素內部追加內容
appendTo()
:把全部匹配的元素追加到指定元素集合中,$("A").append("B")
等效 $("B").appendTo("A")
向元素最前面插入節點:
prepend()
:把每一個匹配的元素內部前置內容
prependTo()
:把全部匹配的元素前置到另外一個指定的元素集合中,$("A").prepend("B")
等效 $("B").prependTo("A")
外部插入
after()
:在每一個匹配的元素以後插入內容
before()
:在每一個匹配想元素以前插入內容
insertAfter()
:將全部匹配的元素插入到另外一個指定的元素集合後面,$A.insert($B)
等效 $B.insertAfter($A);
insertBefore()
:將全部匹配的元素插入到另外一個指定的元素集合前面 $A.before($B)
等效 $B.insertBefore($A)
;
移除
remove()
:從DOM
中刪除全部匹配元素
清空
empty()
:刪除匹配的元素集合中全部子節點內容
clone()
注意:若clone(true)
則是包括克隆元素的屬性,事件等
replaceWith()
:將全部匹配的元素替換成指定的元素
replaceAll()
:用匹配的元素替換掉指定元素
注意:二者效果一致,只是語法不一樣 $A.replaceAll($B)
等效於 $B.replaceWhith($A)
;
JavaScrip
t語言自己不支持動畫設計,必須經過改變CSS
來實現動畫效果
顯隱動畫
show()
:顯示 hide()
:隱藏
原理:hide()
經過改變元素的高度寬度和不透明度,直到這三個屬性值到0
show()
從上到下增長元素的高度,從左到右增長元素寬度,從0
到1
增長透明度,直至內容徹底可見
參數:
show(speed,callback)
speed
: 字符串或數字,表示動畫將運行多久(slow=0.6
/normal=0.4
/fast=0.2
)
callback
: 動畫完成時執行的方法
顯示和隱藏式一對密不可分的動畫形式
顯隱切換
toggle()
:切換元素的可見狀態
原理:匹配元素的寬度、高度以及不透明度,同時進行動畫,隱藏動畫後將display
設置爲none
參數:
toggle(speed)
toggle(speed,callback)
toggle(boolean)
speed
: 字符串或數字,表示動畫將運行多久(slow=0.6
/normal=0.4
/fast=0.2
)
easing
: 使用哪一個緩衝函數來過渡的字符串(linear
/swing
)
callback
: 動畫完成時執行的方法
boolean
:true
爲顯示 false
爲隱藏
滑動
顯隱滑動效果
slideDown()
:滑動隱藏
slidUp()
:滑動顯示
參數:
slideDown(speed,callback)
slidUp(speed,callback)
顯隱切換滑動
slideToggle()
:顯隱滑動切換
參數:
slidUp(speed,callback)
漸變:經過改變不透明度
淡入淡出
fadeIn()
fadeOut()
參數:
fadeIn(speed,callback)
fadeOut(speed,callback)
設置淡出透明效果
fadeTo()
:以漸進的方式調整到指定透明度
參數:
fadeTo(speed,opacity,callback)
漸變切換:結合fadeIn
和fadeOut
fadeToggle()
參數:
fadeOut(speed,callback)
自定義動畫:animate()
注意:在使用animate
方法以前,爲了影響該元素的top
left
bottom
right
樣式屬性,必須先把元素的position
樣式設置爲relative
或者absolute
中止元素的動畫
不少時候須要中止匹配正在進行的動畫,須要使用stop()
stop()
語法結構:stop([clearQueue],[gotoEnd]);
都是可選參數,爲布爾值
若是直接使用stop()
方法,會當即中止當前正在進行的動畫
判斷元素是否處於動畫狀態
若是不處於動畫狀態,則爲元素添加新的動畫,不然不添加if(!$(element).is(":animated")){ //判斷元素是否處於動畫狀態}
這個方法在animate
動畫中常常被用到,須要注意
延遲動畫
在動畫執行過程當中,若是你想對動畫進行延遲操做,那麼使用delay()
用animate
模擬show()
:
show
: 表示由透明到不透明
toggle
: 切換
hide
:表示由顯示到隱藏
動畫方法總結
方法名 | 說明 |
---|---|
hide() 和show() |
同時修改多個樣式屬性即高度和寬度和不透明度 |
fadeIn() 和fadeOut() |
只改變不透明度 |
slideUp() 和slideDown() |
只改變高度 |
fadeTo() |
只改變不透明度 |
toggle() |
用來代替show() 和hide() 方法,因此會同時修改多個屬性即高度、寬度和不透明度 |
slideToggle() |
用來代替slideUp 和slideDown() 方法,因此只能改變高度 |
fadeToggle() |
用來代替fadeIn() 和fadeOut 方法,只能改變不透明度 |
animate() |
屬於自定義動畫,以上各類動畫方法都是調用了animate 方法。此外,用animate 方法還能自定義其餘的樣式屬性,例如:left marginLeft `scrollTop`等 |
事件對象的屬性
event.type
:獲取事件的類型
event.target
:獲取到觸發事件的元素
event.preventDefault
方法 阻止默認事件行爲
event.stopPropagation()
阻止事件的冒泡
keyCode
:只針對於keypress
事件,獲取鍵盤鍵數字 按下回車,13
event.pageX / event.pageY
獲取到光標相對於頁面的x
座標和y
座標
若是沒有jQuery
,在IE瀏覽器中用event.x
/ event.y
;在Firefox
瀏覽器中用event.pageX
/ event.pageY
。若是頁面上有滾動條還要加上滾動條的寬度和高度
event.clientX
:光標對於瀏覽器窗口的水平座標 瀏覽器
event.clientY
:光標對於瀏覽器窗口的垂直座標
event.screenX
:光標對於電腦屏幕的水平座標 電腦屏幕
event.screenY
:光標對於電腦屏幕的水平座標
event.which
該方法的做用是在鼠標單擊事件中獲取到鼠標的左、中、右鍵,在鍵盤事件中的按鍵 1
表明左鍵 2
表明中鍵 3
表明右鍵
事件冒泡
什麼是冒泡
在頁面上能夠有多個事件,也能夠多個元素影響同一個元素
從裏到外
嵌套關係
相同事件
其中的某一父類沒有相同事件時,繼續向上查找
中止事件冒泡
中止事件冒泡能夠阻止事件中其餘對象的事件處理函數被執行
在jQuery
中提供了stopPropagation()
方法
阻止默認行爲
網頁中元素有本身的默認行爲,例如:單擊超連接後會跳轉、單擊提交後表單會提交,有時須要阻止元素的默認行爲
在jQuery
中提供了 preventDefault()
方法來阻止元素的默認行爲
事件捕獲
事件捕獲和冒泡是相反的過程,事件捕獲是從最頂端往下開始觸發
並不是全部的瀏覽器都支持事件捕獲,而且這個缺陷沒法經過JavaScript
來修復。jQuery
不支持事件捕獲,如須要用事件捕獲,要用原生的JavaScript
bind()
;綁定
爲匹配元素綁定處理方法
須要給一個元素添加多個事件 ,事件執行同樣時候
one()
:只執行一次
綁定特定事件類型方法:
|分類|方法名稱|說明|
頁面載入 | ready(fn) |
當DOM 載入就緒能夠綁定一個要執行的函數 |
事件綁定 | blind(type,[data],fn) |
爲每一個匹配元素的特定事件綁定一個事件處理函數 |
事件綁定 | unblind() |
解除綁定 |
事件綁定 | on(events,[,selector[,]data],handler) |
在選擇元素上綁定一個或者多個事件處理函數 |
事件綁定 | off() |
移除on 綁定的事件 |
事件綁定 | delegate(selector,eventType,handler) |
爲全部選擇匹配元素附加一個或多個事件處理函數 |
事件綁定 | undelegate() |
移除綁定 |
事件動態 | live(type,fn) |
對動態生成的元素進行事件綁定 |
事件動態 | die(type,fn) |
移除live() 綁定的事件 |
交互事件 | hover() |
鼠標移入移出 |
交互事件 | toggle(fn1,fn2,[fn3],[fn4]) |
每單擊後依次調用函數 |
交互事件 | blur(fn) |
觸發每個匹配元素的blur 事件 |
交互事件 | change() |
觸發每個匹配元素的change 事件 |
交互事件 | click() |
觸發每個匹配元素的click 事件 |
交互事件 | focus() |
觸發每個匹配元素的focus 事件 |
交互事件 | submit() |
觸發每個匹配元素的submit 事件 |
鍵盤事件 | keydown() |
觸發每個匹配元素的keydown 事件 |
鍵盤事件 | keypress() |
觸發每個匹配元素的keypress 事件 |
鍵盤事件 | keyup() |
觸發每個匹配元素的keyup事件 |
鼠標事件 | mousedown(fn) |
綁定一個處理函數 |
鼠標事件 | mouseenter(fn) |
綁定一個處理函數 |
鍵盤事件 | mouseleave(fn) |
綁定一個處理函數 |
鍵盤事件 | mouseout(fn) |
綁定一個處理函數 |
鍵盤事件 | mouseover(fn) |
綁定一個處理函數 |
窗口操做 | resize(fn) |
綁定一個處理函數 |
窗口操做 | scroll(fn) |
綁定一個處理函數 |
Ajax簡介 :
Asynchronous Javascript And XML
(異步的JavaScript
和XML
)
它並非一種單一的技術,而是有機利用一系列交互式網頁應用相關的技術所造成的結合體
Ajax
優點與不足
Ajax
優點
優秀的用戶體驗
這是Ajax
下最大的有點,能在不刷新整個頁面前提下更新數據
提升web
程序的性能
與傳統模式相比,Ajax
模式在性能上最大的區別在於傳輸數據的方式,在傳統模式中,數據的提交時經過表單來實現的。Ajax
模式只是經過XMLHttpRequest
對象向服務器提交但願提交的數據,即按需發送
減輕服務器和帶寬的負擔
Ajax
的工做原理至關於在用戶和服務器之間加了一箇中間層,似用戶操做與服務器響應異步化。它在客戶端建立Ajax
引擎,把傳統方式下的一些服務器負擔的工做轉移到客戶端,便於客戶端資源來處理,減輕服務器和帶寬的負擔
Ajax的不足
瀏覽器對XMLHttpRequest
對象的支持度不足
破壞瀏覽器前進、後退按鈕的正常功能
對搜索引擎的支持的不足
開發和調試工具的缺少
Ajax
的核心是XMLHttpRequest
對象,它是Ajax
實現的關鍵,發送異步請求、接受響應以及執行回調都是經過它來完成
建立ajax
對象 var xhr = new XMLHttpRequest();
準備發送請求
get
/ post
get
傳遞的數據放在URL
後面
中文編碼 encodeURI( '' )
;
緩存 在數據後面加上隨機數或者日期對象或者……
post
傳遞的數據放在send()
裏面,而且必定要規定數據格式
沒有緩存問題
form
表單中:
action
:
method
: (默認是 get
)
get
: 會在url
裏面以 name=value
, 兩個數據之間用 &
鏈接
post
:
enctype
: "application/x-www-form-urlencoded"
url
是否異步
同步(false
):阻塞
異步(true
):非阻塞
正式發送請求
ajax
請求處理過程
xhr.onreadystatechange = function(){ if (xhr.readyState == 4) { alert( xhr.responseText ); } };
onreadystatechange
:當處理過程發生變化的時候執行下面的函數
readyState
:ajax
處理過程
0:請求未初始化(尚未調用 open()
)。
1:請求已經創建,可是尚未發送(尚未調用 send()
)。
2:請求已發送,正在處理中(一般如今能夠從響應中獲取內容頭)。
3:請求在處理中;一般響應中已有部分數據可用了,可是服務器尚未完成響應的生成。
4:響應已完成;您能夠獲取並使用服務器的響應了。
responseText
:請求服務器返回的數據存在該屬性裏面
status
: http
狀態碼
案例:ajax
封裝案例
//ajax請求後臺數據 var btn = document.getElementsByTagName("input")[0]; btn.onclick = function(){ ajax({//json格式 type:"post", url:"post.php", data:"username=poetries&pwd=123456", asyn:true, success:function(data){ document.write(data); } }); } //封裝ajax function ajax(aJson){ var ajx = null; var type = aJson.type || "get"; var asyn = aJson.asyn || true; var url = aJson.url; // url 接收 傳輸位置 var success = aJson.success;// success 接收 傳輸完成後的回調函數 var data = aJson.data || '';// data 接收須要附帶傳輸的數據 if(window.XMLHttpRequest){//兼容處理 ajx = new XMLHttpRequest();//通常瀏覽器 }else { ajx = new ActiveXObject("Microsoft.XMLHTTP");//IE6+ } if (type == "get" && data) { url +="/?"+data+"&"+Math.random(); } //初始化ajax請求 ajx.open( type , url , asyn ); //規定傳輸數據的格式 ajx.setRequestHeader('content-type','application/x-www-form-urlencoded'); //發送ajax請求(包括post數據的傳輸) type == "get" ?ajx.send():ajx.send(aJson.data); //處理請求 ajx.onreadystatechange = function(aJson){ if(ajx.readState == 4){ if (ajx.status == 200 && ajx.status<300)//200是HTTP 請求成功的狀態碼 { //請求成功處理數據 success && success(ajx.responseText); }else{ alert("請求出錯"+ajx.status); } } };
jquery
對Ajax
操做進行了封裝,在jquery
中的$.ajax()
方法屬於最底層的方法,第2
層是load()
、$.get()
、$.post();
第3
層是$.getScript()
、$.getJSON()
,第2
層使用頻率很高
load()
方法load()
方法是jquery
中最簡單和經常使用的ajax
方法,能載入遠程HTML
代碼並插入DOM
中 結構爲:load(url,[data],[callback])
使用url
參數指定選擇符能夠加載頁面內的某些元素 load
方法中url
語法:url selector
注意:url
和選擇器之間有一個空格
傳遞方式
load()
方法的傳遞方式根據參數data
來自動指定,若是沒有參數傳遞,則採用GET
方式傳遞,反之,採用POST
回調參數
必須在加載完成後才執行的操做,該函數有三個參數 分別表明請求返回的內容、請求狀態、XMLHttpRequest
對象
只要請求完成,回調函數就會被觸發
$("#testTest").load("test.html",function(responseText,textStatus,XMLHttpRequest){ //respnoseText 請求返回的內容 //textStatus 請求狀態 :sucess、error、notmodified、timeout //XMLHttpRequest })
load方法參數
參數名稱 | 類型 | 說明 |
---|---|---|
url |
String |
請求HTML 頁面的URL 地址 |
data(可選) |
Object |
發送至服務器的key / value 數據 |
callback(可選) |
Function |
請求完成時的回調函數,不管是請求成功仍是失敗 |
load()
方法一般用來從web服務器上獲取靜態的數據文件。在項目中須要傳遞一些參數給服務器中的頁面,那麼可使用$.get()
和$.post()
或$.ajax()
方法
注意:$.get()
和$.post()
方法是jquery
中的全局函數
$.get()方法
$.get()
方法使用GET
方式來進行異步請求
結構爲:$.get(url,[data],callback,type)
若是服務器返回的內容格式是xml
文檔,須要在服務器端設置Content-Type
類型 代碼以下:header("Content-Type:text/xml:charset=utf-8")
//php
$.get()
方法參數解析
參數 | 類型 | 說明 |
---|---|---|
url |
String |
請求HTML 頁的地址 |
data(可選) |
Object |
發送至服務器的key / value 數據會做爲QueryString 附加到請求URL中 |
callback(可選) |
Function |
載入成功的回調函數(只有當Response 的返回狀態是success才調用該方法) |
type(可選) |
String |
服務器返回內容的格式,包括xml 、html 、script 、json 、text 和_default |
$.post()方法
它與$.get()
方法的結構和使用方式相同,有以下區別
GET
請求會將參數跟張乃URL後進行傳遞,而POST
請求則是做爲Http
消息的實體內容發送給web服務器,在ajax
請求中,這種區別對用戶不可見
GET
方式對傳輸數據有大小限制(一般不能大於2KB
),而使用POST
方式傳遞的數據量要比GET
方式大得多(理論不受限制)
GET
方式請求的數據會被瀏覽器緩存起來,所以其餘人能夠從瀏覽器的歷史紀錄中讀取這些數據,如:帳號、密碼。在某種狀況下,GET
方式會帶來嚴重的安全問題,而POST
相對來講能夠避免這些問題
GET
和POST
方式傳遞的數據在服務端的獲取也不相同。在PHP
中,GET
方式用$_GET[]
獲取;POST
方式用$_POST[]
獲取;兩種方式均可用$_REQUEST[]
來獲取
總結
使用load()
、$.get()
和$.post()
方法完成了一些常規的Ajax
程序,若是還須要複雜的Ajax
程序,就須要用到$.ajax()
方式
$.ajax()
方法是jquery
最底層的Ajax
實現,它的結構爲$.ajax(options)
該方法只有一個參數,但在這個對象裏包含了$.ajax()
方式所須要的請求設置以及回調函等信息,參數以key
/ value
存在,全部參數都是可選的
$.ajax()方式經常使用參數解析
參數 | 類型 | 說明 |
---|---|---|
url |
String |
(默認爲當前頁地址)發送請求的地址 |
type |
String |
請求方式(POST 或GET )默認爲GET |
timeout |
Number |
設置請求超時時間(毫秒) |
dataType |
String |
預期服務器返回的類型。可用的類型以下 xml:返回 XML 文檔,可用jquery 處理html:返回純文本的 HTML 信息,包含的script 標籤也會在插入DOM 時執行script:返回純文本的 javascript 代碼。不會自動緩存結果,除非設置cache 參數。注意:在遠程請求時,全部的POST 請求都將轉爲GET 請求json:返回 JSON 數據jsonp: JSONP 格式,使用jsonp 形式調用函數時,例如:myurl?call back=?,jquery 將自動替換後一個? 爲正確的函數名,以執行回調函數text:返回純文本字符串 |
beforeSend |
Function |
發送請求前能夠修改XMLHttpRequest 對象的函數,例如添加自定義HTTP 頭。在beforeSend 中若是返回false 能夠取消本次Ajax 請求。XMLHttpRequest 對象是惟一的參數function(XMLHttpRequest){ this ;//調用本次Ajax 請求時傳遞的options 參數} |
complete |
Function |
請求完成後的回調函數(請求成功或失敗時都調用) 參數: XMLHttpRequest 對象和一個描述成功請求類型的字符串function(XMLHttpRequest,textStatus){ this ;//調用本次Ajax請求時傳遞的options 參數} |
success |
Function |
請求成功後調用的回調函數,有兩個參數 (1)由服務器返回,並根據 dataTyppe 參數進行處理後的數據(2)描述狀態的字符串 function (data,textStatus){// data 多是xmlDoc、 `jsonObj、 html、 text等<br> this;//調用本次 Ajax請求時傳遞的 options`參數} |
error |
Function |
請求失敗時被調用的函數 |
global |
Boolean |
默認爲true 。表示是否觸發全局Ajax 事件,設置爲false 將不會觸發。AjaxStart 或AjaxStop 可用於控制各類Ajax 事件 |
什麼是插件
插件(Plugin
)也稱爲jQuery
的擴展。以jQuery
核心代碼爲基礎編寫的符合必定規範的應用程序。經過js
文件的方式引用。
插件分爲哪幾類
UI
類、表單及驗證類、輸入類、特效類、Ajax
類、滑動類、圖形圖像類、導航類、綜合工具類、動畫類等等
引入插件的步驟
引入jquery.js
文件,並且在因此插件以前引入
引入插件
引入插件相關文件,好比皮膚、中文包
如何自定義插件:
插件形式分爲3類:
封裝對象方法插件
封裝全局函數插件
選擇器插件(相似於.find()
)
自定義插件的規範(解決各類插件的衝突和錯誤,增長成功率)
命名:jquery.插件名.js
全部的新方法附加在jquery.fn
對象上面,全部新功能附加在jquery
上
全部的方法或插件必須用分號結尾,避免出問題
插件必須返回jQuery對象,便於鏈式連綴
避免插件內部使用$
,若是要使用,請傳遞jQuery
($
並非總等於jQuery
,另外其餘js
框架也可能使用$
)
插件中的this
應該指向jQuery
對象
使用this.each()
迭代元素
自定義插件案例
爲了方便用戶建立插件,jQuery
提供了 jQuery.extend()
和 jQuery.fn.extend()
jQuery.extend()
:建立工具函數或者是選擇器
jQuery.fn.extend()
:建立jQuery
對象命令 (fn
至關於prototype
的別名)
jQuery
官方提供的插件開發模板
;(function($){ $.fn.plugin=function(options){ var defaults = { //各類參數 各類屬性 } var options = $.extend(defaults,options); this.each(function(){ //實現功能的代碼 }); return this; } })(jQuery);
自定義jQuery
函數:
(function($){ $.extend({ test: function(){ alert("hello plugin"); } }) })(jQuery);
自定義jQuery
命令:
形式1:
(function($){ $.fn.extend({ say : function(){ alert("hello plugin"); } }) })(jQuery);
形式2:
(function($){ $.fn.say = function(){ alert("hello plugin"); }; })(jQuery);
jQuery1.3
新增經常使用的方法
方法 | 說明 |
---|---|
.closest() |
從元素自己開始,逐級向上級元素匹配,並返回最早匹配的祖先元素 |
die() |
從元素中刪除先前用live() 方法綁定的全部的事件 |
live() |
附加一個事件處理器到符合目前選擇器的全部元素匹配 |
jQuery1.4
新增經常使用的方法
方法 | 說明 |
---|---|
.first() |
獲取集合中第一個元素 |
last() |
獲取集合中最後一個元素 |
has(selector) |
保留包含特定後代的元素,去掉那些不含有指定後代的元素 |
detach() |
從DOM 中去掉全部匹配的元素。detach() 和remov() 同樣,除了detach() 保存了全部jquery 數據和被移走的元素相關聯。當須要移走一個元素,不久又將該元素插入DOM 時,這種方法頗有用 |
delegate() |
爲全部選擇器匹配的元素附加一個處理一個或多個事件 |
undelegate() |
爲全部選擇器匹配的元素刪除一個處理一個或多個事件 |
jQuery1.6
新增經常使用的方法
方法 | 說明 |
---|---|
prop(proptyName) |
獲取在匹配元素集合中的第一個元素的屬性值 |
removeProp(proptyName,value) |
爲匹配的元素刪除設置的屬性 |
:focus |
選擇當前獲取焦點的元素 |
性能優化
使用最新版的jQuery類庫
使用合適的選擇器
$(#id)
使用id
來定位DOM
元素是最佳的方式,爲了提升性能,建議從最近的ID
元素開始往下搜索
$("p")
, $("div")
, $("input")
標籤選擇器性能也不錯,它是性能優化的第二選擇。由於jQuery
將直接調用本地方法document.getElementsByTagName()
來定位DOM
元素
$(".class")
建議有選擇性的使用
$("[attribute=value]")
對這個利用屬性定位DOM
元素,本地JavaScript
並無直接實現。這種方式性能並非很理想。建議避免使用。
$(":hidden")
和上面利用屬性定位DOM
方式相似,建議儘可能不要使用
注意的地方
儘可能使用ID
選擇器
儘可能給選擇器指定上下文
緩存對象
若是你須要在其餘函數中使用jQuery
對象,你能夠把他們緩存在全局環境中
數組方式使用jQuery
對象
使用jQuery
選擇器獲取的結果是一個jQuery
對象。在性能方面,建議使用for
或while
循環來處理,而不是$.each()
事件代理
每個JavaScript
事件(如:click
、mouseove
r)都會冒泡到父級節點。當咱們須要給多個元素調用同個函數時這點頗有用。好比,咱們要爲一個表單綁定這樣的行爲:點擊td後,把背景顏色設置爲紅色
$("#myTable td").click(function(){$(this).css("background","red");});
假設有100
個td
元素,在使用以上的方式時,綁定了100
個事件,將帶來性能影響
代替這種多元素的事件監聽方法是,你只需向他們的父節點綁定一次事件,而後經過event.target
獲取到點擊的當前元素
$("#myTable td").click(function({$(e.target).css("background","red")});
e.target
捕捉到觸發的目標
在jQuery1.7
中提供了一個新的方法on()
,來幫助你將整個事件監聽封裝到一個便利的方法中
$("#myTable td").on("click",'td',function(){$(this).css("background","red");});
將你的代碼轉化成jQuery插件
它可以使你的代碼有更好的重用性,而且可以有效的幫助你組織代碼
使用join()方法來拼接字符串
也許你以前使用+
來拼接字符串,如今能夠改了。它確實有助於性能優化,尤爲是長字符串處理的時候
合理使用HTML5和Data屬性
HTML5
的data
屬性能夠幫助咱們插入數據,特別是後端的數據交換。jQuery
的Data()
方法有效利用HTML5
的屬性
例如:<div id="dl" data-role="page" data-list-value="43" data-options='{"name:""John"}'>
爲了讀取數據,你須要使用以下代碼
$("#dl').data("role';//page)
$("#dl').data("lastValue';//43)
$("#dl').data("options';//john)
儘可能使用原生的JavaScript方法
壓縮JavaScript代碼
一方面使用Gzip
;另外一方面去除JavaScript
文件裏面的註釋、空白
速查手冊
jQuery
插件
鋒利的jQuery