前言
之前的項目也一直都是在用jQuery,遇到問題就翻翻API,也從來沒有進行過比較系統的總結和整理。最近由於要做個培訓,因為比較系統的歸納了一下javascript的相關知識,順手做個筆記。說到jQuery,難免避開javascript,所以打算本次分兩篇文章簡要的介紹一下,第一篇主要是jQuery方面的,第二章就是對javascript做一個比較深入的探討。
jQuery的優點
jQuery是一個輕量級的js框架,它在出現后的段時間內就贏得相當大的一部分人的青睞,它有着相當多的優點:代碼簡練,容易上手,瀏覽器兼容,插件豐富....等等。就我個人而言,我選擇jQuery是鍾情於它簡潔而強大的選擇器和快速靈活的事件處理等。
好了,閑話扯了這么多,咱們轉入正題,在介紹jQuery之前,我們先來看一段代碼:

<form id="loginForm" action="/" method="post"> <p>用戶名:<input type="text" name="UserID" /></p> <p>密 碼:<input type="password" name="UserPassword" /></p> <p>驗證碼:<input type="text" name="ValidateCode" /></p> <p> <input type="submit" value="登錄" /> </p> </form>
在這段代碼中我們定義了一個登錄表單,這種表單在我們的網站各個地方都可能存在,我們在表單提交之前一般都需要做一些事情,比如表單驗證。然而,我不希望在每個有這樣表單的頁面都寫上一段JS來進行表單的驗證,jQuery可以很簡潔的幫我們解決這個問題。請看下面的代碼:

<script type="text/javascript"> $(function () { $("form#loginForm input[type=submit]").click(function () { var validate = true; $("form#loginForm").find("input[type=text],input[type=password]").each(function () { if ($(this).val() == "") { validate = false; alert("登錄表單填寫的不完整"); return false; } }); return validate; }); }); </script>
這段代碼是在每個id="loginForm"的form提交前都會驗證text和password是否為空。當然了,您不可能每個form的id都為"loginForm"(雖然沒有這個id的form瀏覽器也不會報js錯誤),也不會每個form都用submit提交,那要驗證提交的form該怎么做呢?這個難不倒jQuery,我們把上面的代碼稍作修改即可,代碼如下:

<form action="/" method="post"> <p>用戶名:<input type="text" empty="false" name="UserID" /></p> <p>密 碼:<input type="password" empty="false" name="UserPassword" /></p> <p>驗證碼:<input type="text" empty="false" name="ValidateCode" /></p> <p> <input type="submit" value="登錄" /> </p> </form>

<script type="text/javascript"> $(function () { $("form").submit(function () { var validate = true; $(this).find("input[empty=false]").each(function () { if ($(this).val() == "") { validate = false; alert("登錄表單填寫的不完整"); return false; } }); return validate; }); }); </script>
可以看到,我們在表單需要驗證的元素中加入了一個empty="false"的屬性(部分的瀏覽器支持required屬性,為了說明jQuery支持自定義的屬性,用了empty),然后我們在表單提交前去做輸入驗證。當然了,您也可以用別的自定義屬性名稱或者值來區分您要驗證的對象,比如 inputType="email",inputType="phone"之類的來驗證郵箱或者電話號碼,只需要把表單提交中的邏輯稍作修改即可。jQuery已經提前讓我們享受到了HTML5的特性了。
OK,說了這么多,您是否對jQuery已經產生了一點興趣呢?那么下面,我簡要的把jQuery一些常用的知識做一下整理和歸納。
一、構造函數
$(".navo") //查找當前document下所有class="navo"的元素 $(".navo","form") //查找當前document下所有form中class="navo"的元素
$(document.getElementById("signin")); //將一個id="signin"的對象轉換成jQuery對象
$(document.getElementByName("signin")) //將所有name="signIn"的對象轉換成jQuery數組
$("input").each(function(){ if($(this).val()==""){ //you can do something } });
$(“<div></div>”);
$(“<div/>”,{class: "test", text: "Click me!", click: function(){ $(this).toggleClass("test"); } });
$(function(){ //you can do something…… });
$(“#name”) //選擇id="name"的元素 $(“div”) //選擇所有的div $(“.className”) //選擇所有class="className"的元素 $(“ul>li”) //選擇所有ul的下一級li元素 $(“form input”) //選擇的form下的所有input元素 $(“input[type=checkbox]”) //選擇所有的checkbox $(“form input:text”) //選擇所有的text元素
$(“input[name$=shop][type=text]”);
$(“div,span,p,.classname”)
function getCheckBoxValue(){ var value=""; $("input:checked").each(function(){ value += $(this).val(); }); return value; }
$(document.getElementById("msg")).html(); $("#msg").html(); $("#msg")[0].innerHTML; $("#msg").eq(0)[0].innerHTML; $("#msg").get(0).innerHTML;
$("input[type=button]").bind("click",{name:"Button",value="Params"},function(event){ alert(event.data.name); });
$("#id").data(name,"value"); $(#id).click(function(){ alert($(this).data("name")); });
$(“#demo”) .attr(“class”,”test”) .css("style","display:block") .text(“hello word”) .click(function(){//you can do something}) .bind(“select”,function(){//you can do something}) ……
$("input",form).each(function(){ if($(this).attr("type")=="text"){ alert("針對文本框可以做一些操作。"); } });
var data=[{name:"sherry",value:"20"},{name:"alex",value:"26"}]; $.each(data,function(){ alert($(this).name); });
$.extend({min: function(a, b){return a < b?a:b; },
max: function(a, b){return a > b?a:b; }});
在這段代碼中我們定義了兩個函數:min和max,然后我們就可以直接使用$.min(10,20)和$.max(10,20)這種形式調用了。
jQuery.extend()這個函數的描述是這樣的:合並兩個或更多的對象的內容匯集成到第一個對象。它的構造函數是:
jQuery.extend( [ deep ], target, object1, [ objectN ] )
從這兒我們可以看出,extend的作用就是講多個對象合並起來,如果target被省略,那么就會默認的被合並到jQuery的命名空間下。
有人會對deep這個參數產生疑問。我們再看下面的代碼:
var object1 = { apple: 0, banana: {weight: 52, price: 100}, cherry: 97 }; var object2 = { banana: {price: 200}, durian: 100 }; $.extend(object1, object2); //object1 === {apple: 0, banana: {price: 200}, cherry: 97, durian: 100}
var object1 = { apple: 0, banana: {weight: 52, price: 100}, cherry: 97 }; var object2 = { banana: {price: 200}, lime: 100 }; $.extend(true, object1, object2); //object1 === {apple: 0, banana: {weight: 52, price: 200}, cherry: 97, lime: 100}
從上面的例子可以看出,如果第一個對象的屬性本身是一個對象或數組,這將是完全用第二個對象相同的key重寫一個屬性,如果true
為第一個函數參數,對象將被遞歸合並。
當然了,.extend()是可以返回對象的。看下面的代碼:
var empty = {} var defaults = { validate: false, limit: 5, name: "foo" }; var options = { validate: true, name: "bar" }; var settings = $.extend(empty, defaults, options); //settings == { validate: true, limit: 5, name: "bar" } //empty == { validate: true, limit: 5, name: "bar" }
說到合並,順便說一下jQuery.merge()函數,還是看代碼更具體:
var first = [0,1,2,3]; var second = [1,2,3,4,5]; $.merge( first, second); //first=[0,1,2,3,1,2,3,4,5];
merge會合並兩個數組內容到第一個數組。是完全合並,不會排重的。
url:一個用來包含發送請求的URL字符串。
settings :一個以“{鍵:值}”組成的AJAX 請求設置。
下面我們看一下常用的setting列表:
async // boolean,是否同步。跨域請求和dataType: "jsonp"請求不支持同步操作。 complete(jqXHR, textStatus) // function 函數完成時執行,不論成功或者失敗 data //object,string {} 需要的參數 dataType// string (“xml“, ”html“, ”script“, ”json“, ”jsonp“, ”text”),返回類型有多個時用空格分割 error(jqXHR, textStatus, errorThrown)// function 發生錯誤時執行(null,"timeout", "error", "abort" 和 "parsererror”) success(data, textStatus, jqXHR)// function請求成功后執行 type// string get/post, PUT 和 DELETE 也可以使用,但僅部分瀏覽器支持 url// string 請求需要的地址 timeout// Number 設置為超時的執行時間 statusCode// Map 根據函數返回的狀態碼來執行相應操作,調用方式為:statusCode: {404: function() { alert('page not found');} jsonp// string 在一個jsonp請求中重寫回調函數的名字。這個值用來替代在"callback=?"這種GET或POST請求中URL參數里的"callback"部分 cache// Boolean是否啟用瀏覽器緩存 beforeSend(jqXHR, settings)// function請求發送前調用
下面寫兩個事例:
$.ajax({ url: 'ajax/test.html', success: function(data) { $('.result').html(data); } });
var jqxhr = $.ajax({ url: "ajax/test.html" }) .success(function() { alert("success"); }) .error(function() { alert("error"); }) .complete(function() { alert("complete"); }); jqxhr.beforeSend(function(){ alert("beforeSend"); });
這兩種寫法都是支持的。
還有兩個.ajax()的簡化版本:
jQuery.get()
jQuery.post()
$.ajax({ url: url,
data: data,
success: success,
dataType: dataType });
由於瀏覽器的安全限制,大多數的請求不能成功地檢索來自不同的域,子域或協議的數據。但是有兩種數據形式(dataType)不受這個限制:script和jsonp,以及他們有兩個簡寫的快速調用方法:
jQuery.getScript()
jQuery.getJSON()
這兩種方式已經跨出的瀏覽器的安全限制,所以要慎用。如果供調用方不是您信任的網站,請不要使用這種方式,因為它可能會為您的網站帶來相當大的風險,它們都是會執行請求的內容的,具體的內容可以參閱園子里其他大牛的分享。
最后說一個方法:.load()。
這個和jQuery.get()比較相似,不同的是.load()不是全局函數,而且這個方法都不是用來請求數據的。.load() 方法將返回的HTML 內容數據設置到相匹配的節點中,所以我們經常用它來加載HTML片段。
有關jQuery的東西就到這里,在這兒我只是作為一種學習筆記做個記錄,很多的內容都沒有深究。之前都是看別人的經驗,很少自己寫東西。如果其中有謬誤,歡迎指正。由於最近經常在做前端的一些開發,所以對javascript的接觸相當的頻繁,所以我的下一篇文章打算寫一點關於javascript相關的東西。