"

亚博电子拥有全球最顶尖的原生APP,每天为您提供千场精彩体育赛事,亚博电子更有真人、彩票、电子老虎机、真人电子竞技游戏等多种娱乐方式选择,亚博电子让您尽享娱乐、赛事投注等,且无后顾之忧!

"
首頁 > Notes on

Notes on

互聯網 2021-02-28 07:24:07

Chapter 7:?Expand your reach by extending jQuery

7.1 為何擴展jQuery?

7.2 jQuery插件製作綱要

命名法則:

作者建議爲了避免命名衝突而將js文件的名字按照jquery.yourextname-version的格式。例如:jquery.fred-1.0.js。另外在創建plugin之前去到jQuery的官網去看下都有哪些plugin的名字已經被使用了。

時刻注意$:

這個話題前面說過,就是用一些方法在自定義函數的作用域內將$指向jQuery。

簡化參數列表:

很多情況下,一個函數的參數表非常長,而當其中的某些參數不是強制需要時,維護一個這樣長的參數列表會變得很困難,作者先是通過討論的方式引出一個解決辦法,就是將參數作為一個對象的屬性,將這個對象作為參數,作者稱之為“options hash'”。之后作者給出一個在jQuery下通用的做法,就是給函數對象聲明一個settings屬性,用它來作為一個對象,去存儲具有默認值的屬性,然后通過extend()函數將傳入的options hash里面的屬性整合到這個settings里:

function complex(p1,options) {var settings = $.extend({option1: defaultValue1,option2: defaultValue2,option3: defaultValue3,option4: defaultValue4,option5: defaultValue5,option6: defaultValue6},options||{});// remainder of function ...} 7.3 定制公用函數

作者用“utility function”來指稱$的屬性方法,這類方法通常不是用來操作DOM元素的,它們一般都是用來操作Javascript的基本對象和數據類型。關于這種函數的聲明模式,作者強烈建議使用前面討論過的:

(function($){$.say = function(what) { alert('I say '+what); };})(jQuery); 這樣可以保證,在函數自己的域內,$是指向jQuery的。之后作者通過一個示例來展示了如何寫一個公用函數:toFixedWidth(),和一個更為復雜的例子:formatDate()。

7.4 增加新的元素集函數

作者將那些用來操作DOM元素集合的函數為“wrapper function”。它的聲明的通用模式是:

(function($){$.fn.makeItBlue = function() {return this.css('color','blue');};})(jQuery); 注意:其實“fn”就是jQuery下,對于“prototype”的異稱。

在這個函數里,“this”指向的就是元素集合本身,所以我們可以在其上調用jQuery的其他元素集合函數;但是,為了保持與jQuery的設計四維一致,所創建的函數一定也要返回元素集合,就是this,這樣就可以保證新函數也可以被與其他函數鏈在一起使用。當然如果這個函數就是設計用來返回其他類型值的情況另議。

接著作者做了一個示例:setReadOnly(),在這個函數的實現里,作者提到一些設計技巧,比如通過filter()來濾掉那些元素集合里的多余元素,這樣可以避免無效或者甚至非法操作,最后在返回之前再用end()將最初傳入的集合原樣返回。之后作者用用了一個在線購買的例子演示了如何使用這個新創建的函數。

在本章的最后,作者創建了一個名為photomatic的元素集合函數(wrapper function)。作者給這個小節的標題是:retaining state within a wrapper function??梢娮髡呦胪ㄟ^這個例子介紹一個設計jQuery擴展時常常遇到的問題,其實就是在這個新函數內利用它的屬性settings來保存一些中間過程的變量,以此來記錄插件運行中間的狀態。事實上,由于Javascript里函數也是對象的這個特性,寫一個擴展函數的本質跟寫一個擴展全局靜態類是有些相似的,因為這個函數自己運行時的作用域與一個類很相似。

Chapter 8: Talk to the server with Ajax

這一章毋庸置疑,講的是jQuery里對於Ajax功能的封裝。而且作者還貫穿一個賣靴子的網站案例于其中,所以除了單純介紹Ajax以外,作者也花了不少筆墨講解下這個案例的其中一些代碼的設計細節,比如如何用jQuery做到一個二級聯動的下拉菜單。而且最後,作者還呼應下第七章,給這個示例網站寫了一些jQuery擴展,比如擴展的wrapper set方法,以及最後還提出一些發散性思考留給讀者,比如如何令這個擴展方法更具有靈活性和可擴展性等等。

嗯,我現在暫時不想複述關於這個示例網站的細節。所以我只會提下單純介紹jQuery里的Ajax方法,另外就是,作者介紹的順序是由(從使用的角度來看)最簡單到最複雜,可是事實上這些函數的依賴性若按照這個順序排列則是由最高到最低,我喜歡的認知方法是由依賴性最低到最高,因為你要先知道將會被B使用的A是怎麼用的,才去認識B會好一些。所以我會把順序倒過來。

8.1 重溫下Ajax

(略)

8.4 完全控制Ajax請求

就是通過$.ajax()方法:

?ParametersReturns$.ajax(options)options? (Object) An object whose properties define the parameters for this operation. See table 8.2 for details.The XHR instance.

參數比較複雜,以至於需要另一個表:

NameDescriptionurl(String) The URL for the request.type(String) The HTTP method to use. Usually either POST or GET. If omitted, the default is GET.

設定請求的默認參數:

這個方法需要的參數如此之多,所以jQuery將Ajax的參數做了全局化,然後提供一個辦法來全局化地設定$.ajax()方法運行時用到的參數,而這個設定將會被記住並且影響之後所有的ajax()方法的運行,除非你又修改它們。通過$.ajaxSetup()方法。

?ParametersReturns$.ajaxSetup(options)options(Object) An object instance whose properties define the set of default Ajax options. These are the same properties described for the $.ajax() function in table 8.2. This function should not be used to set callback handlers for success, error, and completion. (We’ll see how to set these up using an alternative means in an upcoming section.)Undefined.

需要注意的是,這個方法做的設定將不會影響通過其他方法發出的Ajax請求,下面將會介紹到那些方法,它們是$.ajax()的簡化形式。關於這個方法的使用,作者建議將其呼叫放在一個頁面的HEAD裏面的script標籤里,這樣就能領那個頁面內的Ajax請求都是使用這個設定。

處理Ajax事件:

并未完,jQuery給Ajax請求還提供了更多的事件處理方法。首先,Ajax的事件分為本地和全局兩種;前者就是目前我們一直在打交道的,比如success和complete;後者則是觸發後將對所有DOM對象廣播的事件,它們包括:ajaxStart、ajaxSend、ajaxSuccess、ajaxError、ajaxStop和ajaxComplete,其實它們與本地事件都是對應的。其實本地事件是jQuery對Ajax的事件的封裝;全局事件是jQuery自己增加的擴展,它們的處理函數可以通過bind()來指定,就像第四章介紹的那樣。

但是jQuery也提供了綁定這些事件處理函數的便捷方法:

?ParametersReturnsajaxComplete(callback) ajaxError(callback) ajaxSend(callback) ajaxStart(callback) ajaxStop(callback) ajaxSuccess(callback)callback(Function) The function to be established as the Ajax event handler. The function context (this) is the DOM element upon which the handler is established. Parameters may be passed as outlined in table 8.3.The wrapped set.

8.3 發送GET與POST請求

首先作者就在選擇使用GET還是POST時應該如何取捨給出了經驗之談:使用GET就意味著這個操作應該僅僅是獲取信息;而使用POST意味著這個請求會導致一些服務器端的數據的變化或者整個程序的狀態的轉化。

其實這兩個函數就是個簡化版的$.ajax(),它們的參數少於$.ajax():

?ParametersReturns$.get(url,parameters,callback,type)url(String) The URL of the server-side resource to contact via the GET method.parameters(String|Object|Array) Specifies any data that’s to be passed as request parameters. This parameter can be a string that will be used as the query string, an object whose properties are serialized into properly encoded parameters to be passed to the request, or an array of objects whose name and value properties specify the name/value pairs.callback(Function) An optional function invoked when the request completes successfully. The response body is passed as the first parameter to this callback, interpreted according to the setting of the type parameter, and the text status is passed as the second parameter. A third parameter contains a reference to the XHR instance.type(String) Optionally specifies how the response body is to be interpreted; one of html, text, xml, json, script, or jsonp. See the description of $.ajax() later in this chapter for more details.The XHR instance.$.post(url,parameters,callback,type)??

除此以外,$.get()還有個特別版:$.getJSON():

?ParametersReturns$.getJSON(url,parameters,callback)url(String) The URL of the server-side resource contacted via the GET method.parameters(String|Object|Array) Specifies any data that’s to be passed as request parameters. This parameter can be a string that will be used as the query string, an object whose properties are serialized into properly encoded parameters to be passed to the request, or an array of objects whose name and value properties specify the name/value pairs.callback(Function) A function invoked when the request completes. The data value resulting from digesting the response body as a JSON representation is passed as the first parameter to this callback, and the status text is passed as the second parameter. A third parameter provides a reference to the XHR instance.The XHR instance.

8.2 給元素加載內容

這個需求是基於我們常常做這樣的一個操作:利用Ajax的異步功能去到服務器端獲取一個HTML片段,然後將這個返回的片段插入到一個DOM元素的子元素列表中。jQuery在上面介紹的函數的基礎之上,進一步簡化了這個操作,就是在wrapper set上直接呼叫load()函數。

?ParametersReturnsload(url,parameters,callback)url(String) The URL of the server-side resource to which the request is sent, optionally modified via selector (explained below).parameters(String|Object|Array) Specifies any data that’s to be passed as request parameters. This argument can be a string that will be used as the query string, an object whose properties are serialized into properly encoded parameters to be passed to the request, or an array of objects whose name and value properties specify the name/value pairs. If specified as an object or array, the request is made using the POST method. If omitted or specified as a string, the GET method is used.callback(Function) An optional callback function invoked after the response data has been loaded into the elements of the matched set. The parameters passed to this function are the response text, a status string (usually "success"), and the XHR instance. This function will be invoked once for each element in the wrapped set with the target element set as the function context (this).The wrapped set.

但是,這個load()方法並沒有參數讓我們能夠明確指定是以GET還是POST的方式發送Ajax請求,就像之前介紹的函數那樣,當我們傳遞一個對象或者數組作為parameters傳給函數時,它們的URI編碼將由jQuery自己來完成,而在load()這里,這種情況將導致Ajax請求以POST形式發送。反之,如果你傳遞的是一個字符串,那麼請求就是以GET形式發出的,可是請注意:這種情況下,開發者要自行負責字符串的URL編碼。而Javascript本身有encodeURIComponent()來做這個事,jQuery也提供了更為方便的$.param()函數,這個在前面的第六章介紹過了。

另外,load()還提供一個便利之處,就是對於返回的DOM元素進行過濾,過濾的方法就是在參數url後面跟一個選擇器,選擇器的規則就是跟前面講過的一樣:

$('.injectMe').load('/someResource div'); 在某些時候,我們可能想將一個表單里的控件的值作為Ajax請求的參數傳回服務器,爲了方便這一操作,jQuery提供了serialize()和serializeArray()函數,前者返回的是一個查詢字符串,後者返回的是一個數組,這個數組的每個元素都是匿名對象,對象有name和value屬性,分別是表單控件的name和value,這兩個函數的返回值都可以直接作為load()或者上面其他函數的parameters。

?ParametersReturnsserialize()?The formatted query string.serializeArray()?The array of form data.

但是,一個表單中的控件是如何被這兩個函數收集的呢?某些情況下,控件的值會被這兩個函數忽略,比如:未選擇的check box和radio button,為選擇的select(下拉列表),還有被disable了的控件。

免責聲明:非本網注明原創的信息,皆為程序自動獲取互聯網,目的在于傳遞更多信息,并不代表本網贊同其觀點和對其真實性負責;如此頁面有侵犯到您的權益,請給站長發送郵件,并提供相關證明(版權證明、身份證正反面、侵權鏈接),站長將在收到郵件12小時內刪除。
亚博电子 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>