jQuery: 第三方的極簡化的DOM操做的函數庫
第三方: 下載
極簡化: 是DOM操做的終極簡化: 4個方面:php
1. DOM: 增刪改查 2. 事件綁定: 3. 動畫效果: 4. Ajax
DOM操做: 學習jQuery仍是在學DOM,只不過API簡化了
函數庫: jQuery中都是函數,用函數來解決一切問題
爲何使用:css
下載: 版本:
1.x: 兼容舊瀏覽器 IE8html
1.x.js 未壓縮版 優: 包含完備的註釋,格式,變量名,可讀性好 缺: 體積大,不便於傳輸 什麼時候: 學習和開發階段 1.x.min.js 壓縮版 優: 體積小,便於傳輸 缺: 去掉註釋,格式,極簡化了變量名 可讀性差 什麼時候: 生產環境
2.x: 再也不兼容舊瀏覽器
3.x: 再也不兼容舊瀏覽器,提供了更多新特性:
鄙視: 3.x的新特性:前端
1. 全部代碼運行在嚴格模式下 2. 用for...of代替了forEach $.each 3. 新動畫API: requestAnimationFrame() 4. 支持promise 5. ajax的API防備跨站點腳本(XSS)攻擊
引入網頁: 2種:jquery
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.js"ajax
原理:
引入jquery-1.x.js實際上是在全局添加了一種新類型jQuery
包括:
構造函數jQuery: 用於建立jQuery類型的子對象
原型對象jQuery.fn: 用於保存只有jQuery類型的子對象才能訪問的共有方法
如何使用jQuery簡化版API:
問題: DOM元素沒法使用jQuery簡化版API
解決: 要想使用jQuery簡化版API,必須先建立jQuery類型的子對象:
如何建立jQuery類型的子對象: 2種:json
jQuery API的通用特色: 3個bootstrap
基本選擇器: 同CSS
id class element * ,
層次選擇器: 同CSS
空格 > + ~
子元素過濾選擇器: 同CSS
在各自父元素內,分別排序,從1開始
:first-child :last-child :only-child
:nth-child(2n/2n+1/odd/even/i)
基本過濾選擇器(位置過濾選擇器): jQuery新增
將全部符合條件的元素,保存在一個統一的集合中,在集合內統一編號。從0開始
:first/last :gt/lt/eq(i) :even/odd
屬性過濾選擇器: 同CSS
內容過濾: jQuery新增4種:api
可見性過濾: jQuery新增
:hidden 只能選擇兩種隱藏的元素跨域
type="hidden" display:none
:visible
狀態過濾: 同CSS 四大狀態:
:enabled :disabled :checked :selected
表單元素過濾:
:input 選擇全部表單元素: input select textarea button
:[type] 每種type都對應一種選擇器
:text :password :file :button :submit ....
內容: 3種:
html代碼片斷: $(...).html([新內容]) .innerHTML
純文本內容: $(...).text([新內容]) .textContent
表單元素的值: $(...).val([新值]) .value
清空內容: $(...).empty();
屬性: 3種:
HTML標準屬性: $(...).attr("屬性名"[,"值"])
問題: 一次只能修改一個屬性的值: 解決: 同時修改多個屬性的值: $(...).attr({ 屬性名:值, 屬性名:值, ... : ... })
狀態屬性: $(...).prop("屬性名"[,bool])
自定義擴展屬性: $(...).data("屬性名"[,"值"])
樣式:
修改: 內聯樣式:
獲取: 計算後的樣式:
都用.css: $(...).css("css屬性名"[,值])
問題: 單獨修改每一個css屬性,代碼繁瑣
解決: 用class批量修改樣式:
$(...).addClass("class ... ")
$(...).removeClass("class ...")
$(...).hasClass("class ...")
$(...).toggleClass("class ...")
按節點間關係查找:
2大類:
添加,刪除,替換,克隆:
添加: 2步:
將新元素添加到DOM樹:
末尾追加: $parent.append($elem) //return $parent
$elem.appendTo($parent) //return $elem
開頭插入: $parent.prepend($elem) //return $parent
$elem.prependTo($parent) //return $elem
指定元素前插入: $child.before($elem)
指定元素後插入: $child.after($elem)
可簡化爲1步:
$("html代碼片斷").appendTo($parent)
$parent.append("html代碼片斷")
移除: $(...).remove()
替換: $(...).replaceWith(); //右替換左 //return 左
$(...).replaceAll(...); //左替換右 //return 左
克隆: $(...).clone();
淺克隆: 僅複製內容和樣式,不復制行爲
.clone() 默認是淺克隆
深克隆: 即複製內容和樣式,又複製行爲
.clone(true)
鄙視: jq中有幾種事件綁定方式,分別是什麼:
.bind("事件名",handler)
.unbind("事件名",handler)
3個重載:
.unbind("事件名",handler) 移除指定事件上的一個處理函數 .unbind("事件名") 移除指定事件上的全部處理函數 .unbind() 移除全部事件上的全部處理函數
.delegate("selector","事件名",handler)
其實就是利用冒泡的簡化版:
鄙視: .delegate vs .bind
解綁: .undelegate()
.on: 統一bind和delegate的用法
解綁: .off()
DOMContentLoaded:
DOM內容(html,js)加載完成,就提早觸發
什麼時候: 操做不須要等待css和圖片時,首選DOMContentLoaded
jQuery: $(document).ready(function(){ ... })
簡化: $().ready(function(){...})
更簡化: $(function(){...})
ES6: $(()=>{ ... })
鄙視: jQuery中$的原理: 4種重載
DOM: mouseover mouseout
進出子元素,也會反覆觸發父元素上的事件
jq: mouseenter mouseleave
進出子元素,再也不觸發父元素上的事件
簡化: 若是同時綁定mouseenter和mouseleave
可簡化爲.hover(enterHandler, leaveHandler) 若是enterHandler和leaveHandler可統一爲一個處理函數: .hover(handler)
模擬觸發:
$(...).trigger("事件名") => $(...).事件名()
簡單動畫: 3種:
顯示隱藏: .show(ms) .hide(ms) .toggle(ms)
不帶參數,默認: 瞬間顯示隱藏,不帶動畫
原理: display屬性實現的,不支持動畫
帶毫秒數參數: 會有動畫效果
問題: 1. 效果是固定的,不便於維護
2. 用程序的定時器實現的動效,效率不如transition
萬能動畫:
$(...).animate({
css屬性:目標值,
css屬性:目標值,
},ms)
問題: 只支持單個數值的css屬性
不支持顏色和CSS3變換
動畫播放後自動執行: 動畫API的最後一個參數都是一個回調函數,在動畫播放完成後自動執行!
回調函數中的this,指正在播放動畫的當前DOM元素
中止動畫: $(...).stop();
默認: 僅中止動畫隊列中,當前正在播放的一個動畫,隊列中後續動畫,依然執行!
如何中止動畫,並清空隊列: .stop(true)
選擇器: :animated 可選擇或判斷一個正在播放動畫的元素
遍歷:
$(...).each(function(i,elem){
//this->當前elem
})
鄙視: $(...).each() vs $.each(數組/集合,fun)
查找:
var i=$(...).index(要找的DOM元素/jq對象)
簡化: 若是在一個父元素內查找子元素:
$(子元素).index();
添加在jQuery.fn中
強調: jQuery.fn.自定義方法=function(){
//this->未來調用該方法的jq對象 }
官方插件jQuery UI:
使用jQueryUi:
先引入jquery.js,由於jQuery UI是基於jQuery開發的
再引入jquery-ui.js
再編寫自定義腳本
包括:
交互: 自學
效果:
部件:
什麼是部件: 具備完整樣式和行爲的小功能
如何使用: 4步:
1. 引入: jquery-ui.css 2. 按照部件約定,編寫html內容結構 3. 引入jquery.js和jquery-ui.js 4. 在自定義腳本中,找到插件的父元素,調用插件API
原理:
侵入性: 在開發者不知情的狀況下,自動添加class和行爲 優: 簡單! 缺: 不可維護!
jQuery UI vs bootstrap
jQuery UI 傻瓜式,侵入式
優: 簡單 缺: 不可維護
bootstrap 少許手動添加樣式和行爲(自定義擴展屬性)
缺: 相比jQuery UI,稍微麻煩
優: 可定製!
文件上傳:
富文本編輯器:
masonry: 彩磚牆/瀑布流
什麼時候: 只要但願複用一塊功能和樣式時,都要封裝爲插件
如何:
前提: 必須已經用原生的html,css,jss實現了插件的功能
2種封裝插件的風格:
jQuery侵入式:
定義插件的js文件:
先檢查是否提早引入了jQuery
定義插件函數,保存在jQuery的原型對象jQuery.fn中
侵入: 根據插件須要,爲子元素自動添加class 爲子元素綁定事件處理函數
Bootstrap DIY式:
$.ajax({
type:"get/post",
url:"xxx",
data:"rawData"/{ 變量名:值, ...}
dataType:"json",
beforeSend(){
//在發送以前觸發
}
completed(){
//只要請求完成,不管成功仍是失敗,都觸發
}
success(data){
//請求成功觸發
}
error(){
//發生錯誤時觸發
}
}).then(data=>{
... ...
}).catch(err=>{ ... })
簡寫:
$.get(url,data,dataType).then(data=>{ ... })
$.getJSON(url,data).then(data=>{ ... })
$.getScript(url,data)
$(父元素).load("xx.php/xx.html")
強調: 不支持then!
專門簡化post請求的:
$.post(url,data,dataType).then(data=>{ ... })
跨域:
從http://store.company.com/dir/...
容許跨域請求: link, img, script
不容許跨域: xhr對象 (ajax請求)
變通: script 須要服務器返回一段可執行的js語句
服務器應該返回包含數據的一條可執行的js語句
如何實現:
客戶端實現: JSONP (填充式json)
起始jQuery的ajax api均可用, 只不過,dataType必須都寫成jsonp,原理同上。
服務端: header("Access-Control-Allow-Origin:*");
容許客戶端使用xhr對象跨域請求!
結語:以爲總結的還能夠的話,點下贊咯,大家的鼓勵是我前進的動力,謝謝各位老鐵們!