[轉]jquery不爲人知的祕密

jQuery的向來以其完善的文檔著稱,而不像早期的Prototype那樣庫寫的很牛,而文檔很糟糕,其他使用者不得不看他的源碼以瞭解一些功能。

但是,文檔的更新速度是遠沒有其程序變化的快的。這裏介紹一些隱藏在jQuery源碼內部的“祕密”。

序列化一個對象

類似於Prototype中的$H(obj).toQueryString()
jQuery中也有一個內部函數,用於在ajax時候序列化對象用:
jQuery.param

var obj={A:1,B:2,C:3};
jQuery.param(obj); //A=1&B=2&C=3

獲取原始的event對象

用過jQuery都知道,jQuery提供了一個事件對象,用於在事件處理函數中使用,並且這個對象已經將ie中的事件修復成了標準的W3C事件。具體可以參考我這篇日誌

但他並沒有完全統一所有事件,比如獲取mousemove的event事件中鼠標的相對座標的位置,ie和ff分別用的x和layerX來實現,而jQuery沒有給統一。我們只能使用原始的event對象再自己判斷,此時就可以使用
e.originalEvent
這樣就得到了原始的event對象了
在ie中,這個指向的是window.event,而在其他瀏覽器中,就是傳遞給事件處理函數的第一個參數。

像上面那個例子,我就用瞭如下的代碼,用於獲取鼠標的相對座標。

$(“#menuWrap“).mousemove(function(e) {
var xx=e.originalEvent.x||e.originalEvent.layerX||0;
});

再說選擇器,兩個特殊的選擇器,沒有在文檔裏列出來。有可能只是選擇器正則匹配的失誤,也可能是故意的,但我源碼中看不出來。望各位看官指點。注意,下面兩個特殊選擇器,隨時可能在以後版本中消失,慎用。本文涉及的是1.2.6,經測試1.2.3也可使用。

創建一個空jQuery對象:

$(“ “); //切記,引號中間至少有_一個_空格

這段簡易的代碼即可創建一個空的jQuery對象。這就類似創建一個代碼片段。但由於是空的,所以無法append進任何東西。但你可以用add將你要的東西添加進去。

獲取document,有時候需要寫一些關於document的事件,比如keypress之類的,或者其他的,就可以用

$(““); //切記,引號中間_沒有_空格

這一定程度上可以用於混淆代碼,比如將$(document).ready()寫成$(”“).ready(),不知道的人就看不懂了。當然,要看過本文的人就都知道了~~(笑~)

順便一說,前端加密是沒有可能的,混淆也是有限度的。有jQuery的操作是鏈式操作,沒有中間變量,同時通常綁定函數也是匿名函數,所以對於 jQuery代碼的混淆更是沒有太大用處。除非,不再使用匿名函數,每次都外部定義一個。同時不再使用鏈式操作,用next,parent之類操作的時候,統統再定義一箇中間變量。這樣你的jQuery代碼已經沒有jQuery風格了,對混淆會稍微有點點幫助。注意,以上所有混淆操作,只防君子不防小人!切記,前端開發不可能加密!所以一切都做好開源的準備!瞭解GPL、MIT之類的都是有必要的!

如果你要用中間變量,像前面說的爲了混淆,有時候你可能需要用到之前的一個對象,就好像在鏈式寫法中用end()的效果,那就可以用prevObject屬性,end()就是返回這個屬性。

$(“#id“).prevObject; //切記,最後沒有括號,這個是屬性不是方法

下面說的這個其實不是很祕密,但值得一提
attr是很偉大的方法,以下這些都是可以執行的,你就可以通過這些來進行一些簡單的判斷,比如這個元素的標籤名啦之類的。

$(“body“).attr(“tagName“);
$(“body“).attr(“nodeName“);
$(“body“).attr(“nodeType“);

還有個相關的,他返回的是布爾值true/false

jQuery.nodeName( elem, nodeName )

第一個參數是一個DOM對象,不是jQuery對象,第二個就是節點名稱(標籤名)了,大小寫無關。返回true/false
有人問,爲什麼我不直接使用elem.nodeName==nodeName呢,愛用寫這麼麻煩呢?
看一下jQuery的源碼就知道了

nodeName: function( elem, name ) {
return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
},

明白了吧?瀏覽器兼容性問題,某些瀏覽器中的nodeName是大寫,有些是小寫,夠噁心吧?兼容一下總是好的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章