1. 程式人生 > >JavaScript之jQuery

JavaScript之jQuery

jQuery

使用:從官網上下載,並在中引入即可

<html>
<head>
    <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
    ...
</head>
<body>
    ...
</body>
</html>

用法:使用jQuery()或者$()

按id查詢

使用#id

var div = $('#abc')

按tag查詢

直接寫tag名稱即可

var p = $('p')

按class查詢

使用.class

var a = $('.red')

按屬性查詢

使用[key=value]

var email = $('[name=email]')

若value含有特殊字元(如空格),需要用雙引號”“

var email = $('[name="abc email"]')

以某個字串開頭或結束可以用

var name = $('[name^=icon]')

var name = $('[name$=icon]')

組合查詢

即按id,class,tag,屬性組合在一起,直接連在一起即可

var tr = $('tr.red')

多項選擇器

使用逗號隔開,只要符合一個即可,按組合要全部都符合

var ps = $('p.red,p.green')

層級選擇器

用空格隔開,表示前者是後者的子孫

如查詢ul下的所有li節點:

$('ul.lang li');

子選擇器

使用>,和層級選擇器差不多,區別是前者必須是後者的父節點

$('ul.lang>li');

過濾器

使用:

用法

$('ul.lang li'); // 選出JavaScript、Python和Lua 3個節點

$('ul.lang li:first-child'); // 僅選出JavaScript
$('ul.lang li:last-child'); // 僅選出Lua $('ul.lang li:nth-child(2)'); // 選出第N個元素,N從1開始 $('ul.lang li:nth-child(even)'); // 選出序號為偶數的元素 $('ul.lang li:nth-child(odd)'); // 選出序號為奇數的元素 $('div:visible'); // 所有可見的div $('div:hidden'); // 所有隱藏的div

還有一些特殊的用法:

  • :input:可以選擇<input><textarea><select><button>
  • :file:可以選擇<input type="file">,和input[type=file]一樣;
  • :checkbox:可以選擇複選框,和input[type=checkbox]一樣;
  • :radio:可以選擇單選框,和input[type=radio]一樣;
  • :focus:可以選擇當前輸入焦點的元素,例如把游標放到一個<input>上,用$('input:focus')就可以選出;
  • :checked:選擇當前勾上的單選框和複選框,用這個選擇器可以立刻獲得使用者選擇的專案,如$('input[type=radio]:checked')
  • :enabled:可以選擇可以正常輸入的<input><select> 等,也就是沒有灰掉的輸入;
  • :disabled:和:enabled正好相反,選擇那些不能輸入的。

查詢和過濾

找到某個節點後,還可以基於這個節點查詢這個節點附近的節點。

向下查詢

find()

向上查詢

parent()

向左/右查詢

prev()/next()

首個子節點

first()

最後一個子節點

last()

n到m-1個子節點

slice(n,m)

可以輸入引數作為過濾條件,若為空則返回[]。

過濾

filter()

引數為過濾的條件

對映

map()

引數為一個function,將jQuery陣列每個元素使用一次map(),返回處理後的陣列

操作DOM

修改Text和HTML

獲取節點的文字

text()

獲取原始的HTML文字

html()

設定文字

只需要在上述函式中新增引數即可

操作css

獲取css

css('key')

修改css

css('key','value')

操作class

var div = $('#test-div');
div.hasClass('highlight'); // false, class是否包含highlight
div.addClass('highlight'); // 新增highlight這個class
div.removeClass('highlight'); // 刪除highlight這個class

隱藏和顯示DOM

var a = $('a[target=_blank]');
a.hide(); // 隱藏
a.show(); // 顯示

獲取DOM資訊

獲取寬高資訊:

width()

height()

設定節點屬性

attr()和removeAttr()

// <div id="test-div" name="Test" start="1">...</div>
var div = $('#test-div');
div.attr('data'); // undefined, 屬性不存在
div.attr('name'); // 'Test'
div.attr('name', 'Hello'); // div的name屬性變為'Hello'
div.removeAttr('name'); // 刪除name屬性
div.attr('name'); // undefined

操作表單

對錶單元素可以使用val()獲取和設定value

/*
    <input id="test-input" name="email" value="">
    <select id="test-select" name="city">
        <option value="BJ" selected>Beijing</option>
        <option value="SH">Shanghai</option>
        <option value="SZ">Shenzhen</option>
    </select>
    <textarea id="test-textarea">Hello</textarea>
*/
var
    input = $('#test-input'),
    select = $('#test-select'),
    textarea = $('#test-textarea');

input.val(); // 'test'
input.val('[email protected]'); // 文字框的內容已變為[email protected]

select.val(); // 'BJ'
select.val('SH'); // 選擇框已變為Shanghai

textarea.val(); // 'Hello'
textarea.val('Hi'); // 文字區域已更新為'Hi'

修改DOM結構

prepend()append()插入到第一個和最後一個子節點

before()after()插入到該節點的前面或後面

可以插入HTML字串、DOM物件或者jQuery物件

var ul = $('#test-div>ul');
ul.append('<li><span>Haskell</span></li>');

// 建立DOM物件:
var ps = document.createElement('li');
ps.innerHTML = '<span>Pascal</span>';
// 新增DOM物件:
ul.append(ps);

// 新增jQuery物件:
ul.append($('#scheme'));

刪除節點

remove()

事件

滑鼠事件

click: 滑鼠單擊時觸發;

dblclick:滑鼠雙擊時觸發;

mouseenter:滑鼠進入時觸發;

mouseleave:滑鼠移出時觸發;

mousemove:滑鼠在DOM內部移動時觸發;

hover:滑鼠進入和退出時觸發兩個函式,相當於mouseenter加上mouseleave。

鍵盤事件

鍵盤事件僅作用在當前焦點的DOM上,通常是<input><textarea>

keydown:鍵盤按下時觸發;

keyup:鍵盤松開時觸發;

keypress:按一次鍵後觸發。

其他事件

focus:當DOM獲得焦點時觸發;

blur:當DOM失去焦點時觸發;

change:當<input><select><textarea>的內容改變時觸發;

submit:當<form>提交時觸發;

ready:當頁面被載入並且DOM樹完成初始化後觸發。

繫結事件

使用on()為相應的事件繫結函式即可

var a = $('#test-link');
a.on('event', function () {
    alert('Hello!');
});

另外,可以使用on()繫結多個事件,按繫結順序執行。

另外,可以直接使用.click(func(…){…})方法直接繫結click事件;

使用.ready(func(…){…})或者直接$(func(…){…})繫結ready事件。

解除繫結

a.off('event',func);//為某個事件解除某個函式
a.off('event');//解除某個事件的所有函式
a.off();//解除所有事件的所有函式

事件引數

對每個繫結的函式func,都會傳入一個event物件,用於獲取事件的引數。

$(function () {
    $('#testMouseMoveDiv').mousemove(function (e) {
        $('#testMouseMoveSpan').text('pageX = ' + e.pageX + ', pageY = ' + e.pageY);
    });
});

動畫

顯示/隱藏

show():顯示

hide():隱藏

toggle():根據當前的狀態選擇隱藏或顯示

展開/收縮

slideUp():收縮

slideDown():展開

slideToggle():根據當前狀態選擇收縮或展開

淡入/淡出

fadeIn():淡入

fadeOut():淡出

fadeToggle():根據當前狀態選擇淡入或淡出

上述函式的引數可以使用時間(以毫秒為單位)作為動畫的過渡時間,也可以使用fast、slow等引數。

自定義動畫

var div = $('#test-animate');
div.animate({
    opacity: 0.25,
    width: '256px',
    height: '256px'
}, 3000,func(...){...}); // 在3秒鐘內CSS過渡到設定值

animate接受三個引數:css最終效果,過渡的時間,回撥函式

暫停

delay():引數為暫停的毫秒數

序列動畫

多次呼叫上述函式即可實現序列的效果

var div = $('#test-animates');
// 動畫效果:slideDown - 暫停 - 放大 - 暫停 - 縮小
div.slideDown(2000)
   .delay(1000)
   .animate({
       width: '256px',
       height: '256px'
   }, 2000)
   .delay(1000)
   .animate({
       width: '128px',
       height: '128px'
   }, 2000);

AJAX

通過$.ajax(url, settings)來使用ajax

settings有如下選項:

  • async:是否非同步執行AJAX請求,預設為true,千萬不要指定為false
  • method:傳送的Method,預設為'GET',可指定為'POST''PUT'等;
  • contentType:傳送POST請求的格式,預設值為'application/x-www-form-urlencoded; charset=UTF-8',也可以指定為text/plainapplication/json
  • data:傳送的資料,可以是字串、陣列或object。如果是GET請求,data將被轉換成query附加到URL上,如果是POST請求,根據contentType把data序列化成合適的格式;
  • headers:傳送的額外的HTTP頭,必須是一個object;
  • dataType:接收的資料格式,可以指定為'html''xml''json''text'等,預設情況下根據響應的Content-Type猜測。

回撥函式:在請求完成後自動呼叫:

var jqxhr = $.ajax('/api/categories', {
    dataType: 'json'
}).done(function (data) {
    ajaxLog('成功, 收到的資料: ' + JSON.stringify(data));
}).fail(function (xhr, status) {
    ajaxLog('失敗: ' + xhr.status + ', 原因: ' + status);
}).always(function () {
    ajaxLog('請求完成: 無論成功或失敗都會呼叫');
});

GET

可以通過get(url,data)快速使用GET方法

POST

可以通過post(url,data)快速使用POST方法

getJSON

可以通過getJSON(url,data)快速使用GET方法獲取一個JSON物件

擴充套件

可以使用$.fn.plugin = func(...){...}為jQuery物件繫結方法。

例:

$.fn.highlight1 = function () {
    // this已繫結為當前jQuery物件:
    this.css('backgroundColor', '#fffceb').css('color', '#d85030');
    return this;
}

使用引數

$.fn.highlight2 = function (options) {
    // 要考慮到各種情況:
    // options為undefined
    // options只有部分key
    var bgcolor = options && options.backgroundColor || '#fffceb';
    var color = options && options.color || '#d85030';
    this.css('backgroundColor', bgcolor).css('color', color);
    return this;
}

其中&&是指若沒有這個key則給它加上去,||表示若為undefined,則取預設值。

還有另一種表示方法:

$.fn.highlight = function (options) {
    // 合併預設值和使用者設定值:
    var opts = $.extend({}, $.fn.highlight.defaults, options);
    this.css('backgroundColor', opts.backgroundColor).css('color', opts.color);
    return this;
}

// 設定預設值:
$.fn.highlight.defaults = {
    color: '#d85030',
    backgroundColor: '#fff8de'
}

其中extend({},obj1,obj2,…)表示將所有物件合併成為一個,若遇到相同的key,後面的obj覆蓋前面的obj。

另外,使用.defaults的方法表示預設值更加靈活。

錯誤處理

try...catch...finally

有錯誤發生時,執行流程:

  1. 先執行try { ... }的程式碼;
  2. 執行到出錯的語句時,後續語句不再繼續執行,轉而執行catch (e) { ... }程式碼;
  3. 最後執行finally { ... }程式碼。

而沒有錯誤發生時,執行流程:

  1. 先執行try { ... }的程式碼;
  2. 因為沒有出錯,catch (e) { ... }程式碼不會被執行;
  3. 最後執行finally { ... }程式碼。

另外,catch和finally不必都出現,但應至少出現一個。

丟擲錯誤

throw new Error('...')