jQuery 工具方法

2021-09-15 16:20 更新

jQuery函數(shù)庫提供了一個jQuery對象(簡寫為$),這個對象本身是一個構(gòu)造函數(shù),可以用來生成jQuery對象的實例。有了實例以后,就可以調(diào)用許多針對實例的方法,它們定義jQuery.prototype對象上面(簡寫為$.fn)。

除了實例對象的方法以外,jQuery對象本身還提供一些方法(即直接定義jQuery對象上面),不需要生成實例就能使用。由于這些方法類似“通用工具”的性質(zhì),所以我們把它們稱為“工具方法”(utilities)。

常用工具方法

(1)$.trim

$.trim方法用于移除字符串頭部和尾部多余的空格。

$.trim('   Hello   ') // Hello

(2)$.contains

$.contains方法返回一個布爾值,表示某個DOM元素(第二個參數(shù))是否為另一個DOM元素(第一個參數(shù))的下級元素。

$.contains(document.documentElement, document.body); 
// true

$.contains(document.body, document.documentElement); 
// false

(3)$.each,$.map

$.each方法用于遍歷數(shù)組和對象,然后返回原始對象。它接受兩個參數(shù),分別是數(shù)據(jù)集合和回調(diào)函數(shù)。

$.each([ 52, 97 ], function( index, value ) {
  console.log( index + ": " + value );
});
// 0: 52 
// 1: 97 

var obj = {
  p1: "hello",
  p2: "world"
};
$.each( obj, function( key, value ) {
  console.log( key + ": " + value );
});
// p1: hello
// p2: world

需要注意的,jQuery對象實例也有一個each方法($.fn.each),兩者的作用差不多。

$.map方法也是用來遍歷數(shù)組和對象,但是會返回一個新對象。

var a = ["a", "b", "c", "d", "e"];
a = $.map(a, function (n, i){
  return (n.toUpperCase() + i);
});
// ["A0", "B1", "C2", "D3", "E4"]

(4)$.inArray

$.inArray方法返回一個值在數(shù)組中的位置(從0開始)。如果該值不在數(shù)組中,則返回-1。

var a = [1,2,3,4];
$.inArray(4,a) // 3

(5)$.extend

$.extend方法用于將多個對象合并進第一個對象。

var o1 = {p1:'a',p2:'b'};
var o2 = {p1:'c'};

$.extend(o1,o2);
o1.p1 // "c"

$.extend的另一種用法是生成一個新對象,用來繼承原有對象。這時,它的第一個參數(shù)應(yīng)該是一個空對象。

var o1 = {p1:'a',p2:'b'};
var o2 = {p1:'c'};

var o = $.extend({},o1,o2);
o
// Object {p1: "c", p2: "b"}

默認情況下,extend方法生成的對象是“淺拷貝”,也就是說,如果某個屬性是對象或數(shù)組,那么只會生成指向這個對象或數(shù)組的指針,而不會復(fù)制值。如果想要“深拷貝”,可以在extend方法的第一個參數(shù)傳入布爾值true。

var o1 = {p1:['a','b']};

var o2 = $.extend({},o1);
var o3 = $.extend(true,{},o1);

o1.p1[0]='c';

o2.p1 // ["c", "b"]
o3.p1 // ["a", "b"]

上面代碼中,o2是淺拷貝,o3是深拷貝。結(jié)果,改變原始數(shù)組的屬性,o2會跟著一起變,而o3不會。

(6)$.proxy

$.proxy方法類似于ECMAScript 5的bind方法,可以綁定函數(shù)的上下文(也就是this對象)和參數(shù),返回一個新函數(shù)。

jQuery.proxy()的主要用處是為回調(diào)函數(shù)綁定上下文對象。

var o = {
    type: "object",
    test: function(event) {
        console.log(this.type);
    }
};

$("#button")
  .on("click", o.test) // 無輸出
  .on("click", $.proxy(o.test, o)) // object

上面的代碼中,第一個回調(diào)函數(shù)沒有綁定上下文,所以結(jié)果為空,沒有任何輸出;第二個回調(diào)函數(shù)將上下文綁定為對象o,結(jié)果就為object。

這個例子的另一種等價的寫法是:

$("#button").on( "click", $.proxy(o, test))

上面代碼的$.proxy(o, test)的意思是,將o的方法test與o綁定。

這個例子表明,proxy方法的寫法主要有兩種。

jQuery.proxy(function, context)

// or

jQuery.proxy(context, name)

第一種寫法是為函數(shù)(function)指定上下文對象(context),第二種寫法是指定上下文對象(context)和它的某個方法名(name)。

再看一個例子。正常情況下,下面代碼中的this對象指向發(fā)生click事件的DOM對象。

$('#myElement').click(function() {
    $(this).addClass('aNewClass');
});

如果我們想讓回調(diào)函數(shù)延遲運行,使用setTimeout方法,代碼就會出錯,因為setTimeout使得回調(diào)函數(shù)在全局環(huán)境運行,this將指向全局對象。

$('#myElement').click(function() {
    setTimeout(function() {
        $(this).addClass('aNewClass');
    }, 1000);
});

上面代碼中的this,將指向全局對象window,導(dǎo)致出錯。

這時,就可以用proxy方法,將this對象綁定到myElement對象。

$('#myElement').click(function() {
    setTimeout($.proxy(function() {
        $(this).addClass('aNewClass'); 
    }, this), 1000);
});

(7)$.data,$.removeData

$.data方法可以用來在DOM節(jié)點上儲存數(shù)據(jù)。

// 存入數(shù)據(jù)
$.data(document.body, "foo", 52 );

// 讀取數(shù)據(jù)
$.data(document.body, "foo");

// 讀取所有數(shù)據(jù)
$.data(document.body);

上面代碼在網(wǎng)頁元素body上儲存了一個鍵值對,鍵名為“foo”,鍵值為52。

$.removeData方法用于移除$.data方法所儲存的數(shù)據(jù)。

$.data(div, "test1", "VALUE-1");
$.removeData(div, "test1");

(8)$.parseHTML,$.parseJSON,$.parseXML

$.parseHTML方法用于將字符串解析為DOM對象。

$.parseJSON方法用于將JSON字符串解析為JavaScript對象,作用與原生的JSON.parse()類似。但是,jQuery沒有提供類似JSON.stringify()的方法,即不提供將JavaScript對象轉(zhuǎn)為JSON對象的方法。

$.parseXML方法用于將字符串解析為XML對象。

var html = $.parseHTML("hello, <b>my name is</b> jQuery.");
var obj = $.parseJSON('{"name": "John"}');

var xml = "<rss version='2.0'><channel><title>RSS Title</title></channel></rss>";
var xmlDoc = $.parseXML(xml);

(9)$.makeArray

$.makeArray方法將一個類似數(shù)組的對象,轉(zhuǎn)化為真正的數(shù)組。

var a = $.makeArray(document.getElementsByTagName("div"));

(10)$.merge

$.merge方法用于將一個數(shù)組(第二個參數(shù))合并到另一個數(shù)組(第一個參數(shù))之中。

var a1 = [0,1,2];
var a2 = [2,3,4];
$.merge(a1, a2);

a1
// [0, 1, 2, 2, 3, 4]

(11)$.now

$.now方法返回當(dāng)前時間距離1970年1月1日00:00:00 UTC對應(yīng)的毫秒數(shù),等同于(new Date).getTime()。

$.now()
// 1388212221489

判斷數(shù)據(jù)類型的方法

jQuery提供一系列工具方法,用來判斷數(shù)據(jù)類型,以彌補JavaScript原生的typeof運算符的不足。以下方法對參數(shù)進行判斷,返回一個布爾值。

  • jQuery.isArray():是否為數(shù)組。
  • jQuery.isEmptyObject():是否為空對象(不含可枚舉的屬性)。
  • jQuery.isFunction():是否為函數(shù)。
  • jQuery.isNumeric():是否為數(shù)值(整數(shù)或浮點數(shù))。
  • jQuery.isPlainObject():是否為使用“{}”或“new Object”生成的對象,而不是瀏覽器原生提供的對象。
  • jQuery.isWindow():是否為window對象。
  • jQuery.isXMLDoc():判斷一個DOM節(jié)點是否處于XML文檔之中。

下面是一些例子。

$.isEmptyObject({}) // true
$.isPlainObject(document.location) // false
$.isWindow(window) // true
$.isXMLDoc(document.body) // false

除了上面這些方法以外,還有一個$.type方法,可以返回一個變量的數(shù)據(jù)類型。它的實質(zhì)是用Object.prototype.toString方法讀取對象內(nèi)部的[[Class]]屬性(參見《標(biāo)準庫》的Object對象一節(jié))。

$.type(/test/) // "regexp"

Ajax操作

$.ajax

jQuery對象上面還定義了Ajax方法($.ajax()),用來處理Ajax操作。調(diào)用該方法后,瀏覽器就會向服務(wù)器發(fā)出一個HTTP請求。

$.ajax()的用法主要有兩種。

$.ajax(url[, options])
$.ajax([options])

上面代碼中的url,指的是服務(wù)器網(wǎng)址,options則是一個對象參數(shù),設(shè)置Ajax請求的具體參數(shù)。

$.ajax({
  async: true,
  url: '/url/to/json',
  type: 'GET',
  data : { id : 123 },
  dataType: 'json',
  timeout: 30000,
  success: successCallback,
  error: errorCallback,
  complete: completeCallback,
  statusCode: {
        404: handler404,
        500: handler500
  }
})

function successCallback(json) {
    $('<h1/>').text(json.title).appendTo('body');
}

function errorCallback(xhr, status){
    console.log('出問題了!');
}

function completeCallback(xhr, status){
    console.log('Ajax請求已結(jié)束。');
}

上面代碼的對象參數(shù)有多個屬性,含義如下:

  • accepts:將本機所能處理的數(shù)據(jù)類型,告訴服務(wù)器。
  • async:該項默認為true,如果設(shè)為false,則表示發(fā)出的是同步請求。
  • beforeSend:指定發(fā)出請求前,所要調(diào)用的函數(shù),通常用來對發(fā)出的數(shù)據(jù)進行修改。
  • cache:該項默認為true,如果設(shè)為false,則瀏覽器不緩存返回服務(wù)器返回的數(shù)據(jù)。注意,瀏覽器本身就不會緩存POST請求返回的數(shù)據(jù),所以即使設(shè)為false,也只對HEAD和GET請求有效。
  • complete:指定當(dāng)HTTP請求結(jié)束時(請求成功或請求失敗的回調(diào)函數(shù),此時已經(jīng)運行完畢)的回調(diào)函數(shù)。不管請求成功或失敗,該回調(diào)函數(shù)都會執(zhí)行。它的參數(shù)為發(fā)出請求的原始對象以及返回的狀態(tài)信息。
  • contentType:發(fā)送到服務(wù)器的數(shù)據(jù)類型。
  • context:指定一個對象,作為所有Ajax相關(guān)的回調(diào)函數(shù)的this對象。
  • crossDomain:該屬性設(shè)為true,將強制向相同域名發(fā)送一個跨域請求(比如JSONP)。
  • data:向服務(wù)器發(fā)送的數(shù)據(jù),如果使用GET方法,此項將轉(zhuǎn)為查詢字符串,附在網(wǎng)址的最后。
  • dataType:向服務(wù)器請求的數(shù)據(jù)類型,可以設(shè)為text、html、script、json、jsonp和xml。
  • error:請求失敗時的回調(diào)函數(shù),函數(shù)參數(shù)為發(fā)出請求的原始對象以及返回的狀態(tài)信息。
  • headers:指定HTTP請求的頭信息。
  • ifModified:如果該屬性設(shè)為true,則只有當(dāng)服務(wù)器端的內(nèi)容與上次請求不一樣時,才會發(fā)出本次請求。
  • jsonp:指定JSONP請求“callback=?”中的callback的名稱。
  • jsonpCallback: 指定JSONP請求中回調(diào)函數(shù)的名稱。
  • mimeType:指定HTTP請求的mime type。
  • password:指定HTTP認證所需要的密碼。
  • statusCode:值為一個對象,為服務(wù)器返回的狀態(tài)碼,指定特別的回調(diào)函數(shù)。
  • success:請求成功時的回調(diào)函數(shù),函數(shù)參數(shù)為服務(wù)器傳回的數(shù)據(jù)、狀態(tài)信息、發(fā)出請求的原始對象。
  • timeout: 等待的最長毫秒數(shù)。如果過了這個時間,請求還沒有返回,則自動將請求狀態(tài)改為失敗。
  • type:向服務(wù)器發(fā)送信息所使用的HTTP動詞,默認為GET,其他動詞有POST、PUT、DELETE。
  • url:服務(wù)器端網(wǎng)址。這是唯一必需的一個屬性,其他屬性都可以省略。
  • username:指定HTTP認證的用戶名。
  • xhr:指定生成XMLHttpRequest對象時的回調(diào)函數(shù)。

這些參數(shù)之中,url可以獨立出來,作為ajax方法的第一個參數(shù)。也就是說,上面代碼還可以寫成下面這樣。

$.ajax('/url/to/json',{
  type: 'GET',
  dataType: 'json',
  success: successCallback,
  error: errorCallback
})

作為向服務(wù)器發(fā)送的數(shù)據(jù),data屬性也可以寫成一個對象。

$.ajax({
  url: '/remote/url',
  data: {
    param1: 'value1',
    param2: 'value2',
    ...
  }
});

// 相當(dāng)于
$.ajax({
    url: '/remote/url?param1=value1&param2=value2...'
}});

簡便寫法

ajax方法還有一些簡便寫法。

  • $.get():發(fā)出GET請求。
  • $.getScript():讀取一個JavaScript腳本文件并執(zhí)行。
  • $.getJSON():發(fā)出GET請求,讀取一個JSON文件。
  • $.post():發(fā)出POST請求。
  • $.fn.load():讀取一個html文件,并將其放入當(dāng)前元素之中。

一般來說,這些簡便方法依次接受三個參數(shù):url、數(shù)據(jù)、成功時的回調(diào)函數(shù)。

(1)$.get(),$.post()

這兩個方法分別對應(yīng)HTTP的GET方法和POST方法。

$.get('/data/people.html', function(html){
  $('#target').html(html);
});

$.post('/data/save', {name: 'Rebecca'}, function (resp){
  console.log(JSON.parse(resp));
});

get方法和post方法的參數(shù)相同,第一個參數(shù)是服務(wù)器網(wǎng)址,該參數(shù)是必需的,其他參數(shù)都是可選的。第二個參數(shù)是發(fā)送給服務(wù)器的數(shù)據(jù),第三個參數(shù)是操作成功后的回調(diào)函數(shù)。

上面的post方法對應(yīng)的ajax寫法如下。

$.ajax({
    type: 'POST',
    url: '/data/save',
    data: {name: 'Rebecca'},
    dataType: 'json',
    success: function (resp){
      console.log(JSON.parse(resp));
    }
});

(2)$.getJSON()

ajax方法的另一個簡便寫法是getJSON方法。當(dāng)服務(wù)器端返回JSON格式的數(shù)據(jù),可以用這個方法代替$.ajax方法。

$.getJSON('url/to/json', {'a': 1}, function(data){
    console.log(data);
});

上面的代碼等同于下面的寫法。

$.ajax({
  dataType: "json",
  url: '/url/to/data',
  data: {'a': 1},
  success: function(data){
    console.log(data);
  }
});

(3)$.getScript()

$.getScript方法用于從服務(wù)器端加載一個腳本文件。

$.getScript('/static/js/myScript.js', function() {
    functionFromMyScript();
});

上面代碼先從服務(wù)器加載myScript.js腳本,然后在回調(diào)函數(shù)中執(zhí)行該腳本提供的函數(shù)。

getScript的回調(diào)函數(shù)接受三個參數(shù),分別是腳本文件的內(nèi)容,HTTP響應(yīng)的狀態(tài)信息和ajax對象實例。

$.getScript( "ajax/test.js", function (data, textStatus, jqxhr){
  console.log( data ); // test.js的內(nèi)容
  console.log( textStatus ); // Success
  console.log( jqxhr.status ); // 200
});

getScript是ajax方法的簡便寫法,因此返回的是一個deferred對象,可以使用deferred接口。

jQuery.getScript("/path/to/myscript.js")
    .done(function() {
        // ...
    })
    .fail(function() {
        // ...
});

(4)$.fn.load()

$.fn.load不是jQuery的工具方法,而是定義在jQuery對象實例上的方法,用于獲取服務(wù)器端的HTML文件,將其放入當(dāng)前元素。由于該方法也屬于ajax操作,所以放在這里一起講。

$('#newContent').load('/foo.html');

$.fn.load方法還可以指定一個選擇器,將遠程文件中匹配選擇器的部分,放入當(dāng)前元素,并指定操作完成時的回調(diào)函數(shù)。

$('#newContent').load('/foo.html #myDiv h1:first',
    function(html) {
        console.log('內(nèi)容更新!');
});

上面代碼只加載foo.html中匹配“#myDiv h1:first”的部分,加載完成后會運行指定的回調(diào)函數(shù)。

$('#main-menu a').click(function(event) {
   event.preventDefault();

   $('#main').load(this.href + ' #main *');
});

上面的代碼將指定網(wǎng)頁中匹配“#main *”,加載入當(dāng)前的main元素。星號表示匹配main元素包含的所有子元素,如果不加這個星號,就會加載整個main元素(包括其本身),導(dǎo)致一個main元素中還有另一個main元素。

load方法可以附加一個字符串或?qū)ο笞鳛閰?shù),一起向服務(wù)器提交。如果是字符串,則采用GET方法提交;如果是對象,則采用POST方法提交。

$( "#feeds" ).load( "feeds.php", { limit: 25 }, function() {
  console.log( "已經(jīng)載入" );
});

上面代碼將{ limit: 25 }通過POST方法向服務(wù)器提交。

load方法的回調(diào)函數(shù),可以用來向用戶提示操作已經(jīng)完成。

$('#main-menu a').click(function(event) {
   event.preventDefault();

   $('#main').load(this.href + ' #main *', function(responseText, status) {
      if (status === 'success') {
         $('#notification-bar').text('加載成功!');
      } else {
         $('#notification-bar').text('出錯了!');
      }
   });
});

Ajax事件

jQuery提供以下一些方法,用于指定特定的AJAX事件的回調(diào)函數(shù)。

  • .ajaxComplete():ajax請求完成。
  • .ajaxError():ajax請求出錯。
  • .ajaxSend():ajax請求發(fā)出之前。
  • .ajaxStart():第一個ajax請求開始發(fā)出,即沒有還未完成ajax請求。
  • .ajaxStop():所有ajax請求完成之后。
  • .ajaxSuccess():ajax請求成功之后。

下面是示例。

$('#loading_indicator')
.ajaxStart(function (){$(this).show();})
.ajaxStop(function (){$(this).hide();});

返回值

ajax方法返回的是一個deferred對象,可以用then方法為該對象指定回調(diào)函數(shù)(詳細解釋參見《deferred對象》一節(jié))。

$.ajax({
  url: '/data/people.json',
  dataType: 'json'
}).then(function (resp){
  console.log(resp.people);
})

JSONP

由于瀏覽器存在“同域限制”,ajax方法只能向當(dāng)前網(wǎng)頁所在的域名發(fā)出HTTP請求。但是,通過在當(dāng)前網(wǎng)頁中插入script元素(),可以向不同的域名發(fā)出GET請求,這種變通方法叫做JSONP(JSON with Padding)。

ajax方法可以發(fā)出JSONP請求,方法是在對象參數(shù)中指定dataType為JSONP。

$.ajax({
  url: '/data/search.jsonp',
  data: {q: 'a'},
  dataType: 'jsonp',
  success: function(resp) {
    $('#target').html('Results: ' + resp.results.length);
  }
});)

JSONP的通常做法是,在所要請求的URL后面加在回調(diào)函數(shù)的名稱。ajax方法規(guī)定,如果所請求的網(wǎng)址以類似“callback=?”的形式結(jié)尾,則自動采用JSONP形式。所以,上面的代碼還可以寫成下面這樣。

$.getJSON('/data/search.jsonp?q=a&callback=?',
  function(resp) {
    $('#target').html('Results: ' + resp.results.length);
  }
);

文件上傳

假定網(wǎng)頁有一個文件控件。

<input type="file" id="test-input">

下面就是如何使用Ajax上傳文件。

var file = $('#test-input')[0].files[0];
var formData = new FormData();

formData.append('file', file);

$.ajax('myserver/uploads', {
  method: 'POST',
  contentType: false,
  processData: false,
  data: formData
});

上面代碼是將文件作為表單數(shù)據(jù)發(fā)送。除此之外,也可以直接發(fā)送文件。

var file = $('#test-input')[0].files[0];

$.ajax('myserver/uploads', {
  method: 'POST',
  contentType: file.type,
  processData: false,
  data: file
});

參考鏈接

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號