『壹』 如何正確閱讀jquery源碼和jquery插件源碼
1. jQuery 裡面有很多東西是出於兼容性,歷史遺留。
比如 .ready() 之類的函數,為什麼會很scroll 有關,那是為了兼容某些ie。這種代碼對於編程思想來說不僅沒用,而且是雜音,你要篩選出來就得了解這段代碼的變動,費心費力得不償失。
2. jQuery 裡面的代碼不一定是最優的,例如事件委託,每一次事件觸發都要調用選擇器,實際上是效率很低的。但是我又比較懶,沒有提交patch。
3. jQuery 實際上很容易寫出來一個 barebone alternative,在使用的過程中多想,多思考多總結就可以了。
4. jQuery 這類框架里真正有思維挑戰性的東西不多,一半以上是堆代碼而已,剩下的一點價值在於架構、抽象、擴展能力。
5. 我有一句話與所有的同行分享:工程師讓需求成為現實,優秀工程師化復雜為簡單,頂尖工程師變不可能為可能;架構師掌握現在,優秀架構師展望未來,頂尖架構師創造時代。
jQuery 的設計目的是,讓前端工程師的工作更簡單更輕松,但它並不適合所有的前端工程師,假如你的目標是成為優秀架構師、頂尖架構師的話,你在jQuery里也看不清未來。
『貳』 使用$.noConflict()後,怎麼讓$重新指定window.jQuery
jQuery默認使用"$"操作符,$ 符號只是 window.jQuery 對象的一個引用,jQuery.noConflict() ,這個函數將變數$的控制權讓渡給第一個實現它的那個庫。這有助於確保jQuery不會與其他庫的$對象發生沖突。在運行這個函數後,就只能使用jQuery變數訪問jQuery對象。例如,在要用到$("div p")的地方,就必須換成jQuery("div p")。
一、"$"操作符
1、jQuery默認使用"$"操作符,prototype等其他框架也是是使用"$",於是,如果jQuery在其他庫之後引入,那麼jQuery將獲得"$"使用權。這樣的情況也很容易理解,畢竟JS是從上到下流式執行的。
2、如果在其他使用"$"的庫之前引入jQuery,那麼jQuery將不會佔用"$"。
提示:在其他 javaScript 庫為其函數使用 $ 時,該方法很有用。
我們在jquery中獲取變數都會使用到$,但是還有很多插件都是可以使用$這個符號了,如果我們同時要引用就會導致出現問題了,jquery為了防止這種事情發生就引入了noconflict()
二、jQuery.noConflict的定義
jQuery.noConflict 方法包含一個可選的布爾參數,用以決定移交 $ 引用的同時是否移交 jQuery 對象本身:
jQuery.noConflict([removeAll])
函數的說明:
預設情況下,執行 noConflict 會將變數 $ 的控制權移交給第一個產生 $ 的庫;當 removeAll 設置為 true 時,執行 noConflict 則會將 $ 和 jQuery 對象本身的控制權全部移交給第一個產生他們的庫。
三、jQuery.noConflict源碼分析
jQuery 源碼開頭,首先做的一斗皮件事情是這樣的:
// Map over jQuery in case of overwrite_jQuery = window.jQuery,// Map over the $ in case of overwrite_$ = window.$,
容易理解的是,jQuery 通過兩個私有變數映射了 window 環境下的 jQuery 和 $ 兩個對象,以防止變數被強行覆蓋。一旦 noConflict 方法被調用,則通過 _jQuery, _$, jQuery, $ 四者之間的差異,來決定控制權的移交方式,具體的代碼如下:
noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery;}
再來看上面所說的參數設定問題,如果 deep 沒有設置,_$ 覆蓋 window.$,此時 jQuery 別名 $ 失效,但 jQuery 本身完好無損。如果有其他類庫或代碼重新定義了 $ 變數,它的控制權就完全祥冊交接出去了。反之如果 deep 設置為 true 的話,_jQuery 覆蓋 window.jQuery,此時 $ 和 jQuery 都將失效。
這種操作的好處是,不管是框架混用還是 jQuery 多版本共存這種高度沖突的執行環境,由於 noConflict 方法提供的移交機制,以及本身返回未被覆蓋的 jQuery 對象,完全能夠通過變數映射的方式解決沖突。
四、jQuery.noConflict實例
1、將 $ 引用的對象映射回原始的對象:
jQuery.noConflict();jQuery("div p").hide(); // 使用 jQuery$("content").style.display = "none"; // 使用其他庫的 $()
2、恢復使用別名 $,然後創建並執行一個函數,在這個函數的作用域中仍然將 $ 作為 jQuery 的別名來使用。在這個函數中,原來的 $ 對象是無效的。這個函數對於大多數不依賴於其他庫的插件都十分有效:
jQuery.noConflict();(function($) { $(function() { // 使用 $ 作為 jQuery 別名的代碼 });})(jQuery);... // 其他空宴差用 $ 作為別名的庫的代碼
3、可以將 jQuery.noConflict() 與簡寫的 ready 結合,使代碼更緊湊:
jQuery.noConflict()(function(){ // 使用 jQuery 的代碼});... // 其他庫使用 $ 做別名的代碼
4、創建一個新的別名用以在接下來的庫中使用 jQuery 對象:
var j = jQuery.noConflict();j("div p").hide(); // 基於 jQuery 的代碼$("content").style.display = "none";// 基於其他庫的 $() 代碼
5、完全將 jQuery 移到一個新的命名空間:var dom = {};dom.query = jQuery.noConflict(true);//結果:dom.query("div p").hide(); // 新 jQuery 的代碼$("content").style.display = "none"; // 另一個庫 $() 的代碼jQuery("div > p").hide(); // 另一個版本 jQuery 的代碼
『叄』 簡單易懂的jQuery導航(三級菜單)源碼
<!--三級操蛋導航-->
<divclass="nav_left">
<divclass="nav_leftlist">
<h2><b></b>用戶系統</h2>
<dl>
<dt><b></b>用戶管理</dt>
<dd>
<aclass="cur"href="">商戶信息<b></b></a>
<ahref="">用戶信息<b></b></a>
</dd>
</dl>
</div>
<divclass="nav_leftlist">
<h2><b></b>財務系統</h2>
<dl>
<dt><b></b>系統賬務</dt>
<dd>
<ahref="">平台賬單<b></b></a>
<ahref="">賬單明細<b></b></a>
</dd>
</dl>
<dl>
<dt><b></b>商戶賬務</dt>
<dd>
<ahref="">商戶賬單<b></b></a>
<ahref="">提現管理<b></b></a>
</dd>
</dl>
<dl>
<dt><b></b>用戶賬務</dt>
<dd>
<ahref="">用戶賬單<b></b></a>
<ahref="">提現管理<b></b></a>
</dd>
</dl>
</div>
</div>
<style>
.nav_left{background:#232b35;height:100%;width:220px;min-height:600px;position:fixed;top:100px;left:0;}
.nav_leftlist{}
.nav_leftlisth2{height:50px;line-height:50px;padding-left:40px;font-size:16px;background:#3b444f;color:#999999;position:relative;cursor:pointer;}
.nav_leftlisth2b{position:absolute;top:20px;left:13px;width:16px;height:9px;background:url(../images/icon04.png)no-repeat;background-position:00;cursor:pointer;}
.nav_leftlisth2b.cur{background-position:-16px0;}
.nav_leftlistdl{}
.nav_leftlistdldt{height:50px;line-height:50px;background:#2c3643;font-size:16px;color:#ffffff;padding-left:60px;position:relative;cursor:pointer;}
.nav_leftlistdldtb{position:absolute;top:20px;left:34px;width:16px;height:9px;background:url(../images/icon04.png)no-repeat;background-position:0-10px;}
.nav_leftlistdldtb.cur{background-position:-16px-10px;}
.nav_leftlistdldd{}
.nav_leftlistdldda{display:block;height:50px;line-height:50px;color:#fff;padding-left:80px;font-size:16px;position:relative;}
.nav_leftlistdldda.cur{color:#ee581c;}
.nav_leftlistdldda.curb{display:block;position:absolute;top:16px;right:-1px;width:11px;height:18px;background:url(../images/icon04.png)no-repeat;background-position:0-20px;}
</style>
</body>
<scripttype="text/javascript"src="../js/jquery.js"></script>
<scripttype="text/javascript">
$(function(){
$('.nav_leftlist').on('click','h2',function(event){
$(this).siblings('dl').toggle();
if($(this).siblings('dl').css('display')=='none'){
$(this).find('b').addClass('cur');
}else{
$(this).find('b').removeClass('cur');
}
});
$('.nav_leftlist').on('click','dldt',function(event){
$(this).siblings('dd').toggle();
if($(this).siblings('dd').css('display')=='none'){
$(this).find('b').addClass('cur');
}else{
$(this).find('b').removeClass('cur');
}
});
})
</script>
效果圖:
『肆』 如何通過JavaScript或者jQuery非同步實現獲取遠程網頁源碼,例如按下按鈕就顯示某網站的源
js和jquery無法直接獲取遠程網站的原碼,因為ajax無法跨域,如果你想引用,直接用iframe不就得了。如果想獲取源碼,用js訪問php,讓php去干這活,然後返回給頁面
方法有了,自己動手
『伍』 jquery源碼中的var document=window.document是什麼意思
jquery本高搜身就是面向對象的阿,window.document實際上被jquery包裝成一個對象了。
可畢稿以手念孝調用很多方法。
實際上js中才是對dom元素的引用,jquery是作為對象的引用。
『陸』 jquery中each 跳出為什麼用return false
由於jQuery的each是通過循環調用回調函數的方式實現的,所以在函數內寫的break只適用於函數內部的邏輯,並不能對函數外層的循環起到作用,所以break不管用。具體可以分析一下jQuery的源碼,下面以jQuery2.1.4中的each方法舉例:
each:function(obj,callback,args){
varvalue,
i=0,
length=obj.length,
isArray=isArraylike(obj);//如果obj是一個類似數組的結構(可用for遍歷的),則為true
if(args){
if(isArray){
for(;i<length;i++){
value=callback.apply(obj[i],args);//循環調用
if(value===false){//如果返回值全等於(包括類型和值)false,就退出循環
break;
}
}
}else{
for(iinobj){//這種是對象的,需要用forin遍歷
value=callback.apply(obj[i],args);
if(value===false){
break;
}
}
}
//Aspecial,fast,caseforthemostcommonuseofeach
}else{
if(isArray){
for(;i<length;i++){
value=callback.call(obj[i],i,obj[i]);
if(value===false){
break;
}
}
}else{
for(iinobj){
value=callback.call(obj[i],i,obj[i]);
if(value===false){
break;
}
}
}
}
returnobj;
}
由源碼可以看出,只有回調函數返回的值為false時,才會退出循環
『柒』 jquery 是如何通過 class 來獲取元素的
jquery通過任哪陸何選擇器取得的對象都是jquery對象而不是JavaScript的dom對象不能用js的方法進行操作 而需要使用jquery對象支李謹頃持的方法 如果是通過class的話取得的是jquery對象數組
ps 如果想把jquery對象裝換為js對象可晌敗以用以下方法
1 var obj = $('#xx')[0] 獲得dom對象
2 對於數組
var obj = $('.xx').each(function(){
alert(this)//這里 this獲得的就是每一個dom對象 如果需要jquery對象 需要寫成$(this)
});
『捌』 jQuery 是如何判斷HTML頁面載入完畢的它的原理是什麼
jquery是一個輕量級的JS框架,這點相信大部分人都聽過,而jquery之所以有這樣一個稱呼,就是因為它悄悄披了一件外衣,將自己給隱藏了起來。
//以下截取自jquery源碼片段(function( window, undefined ) { /* 源碼內容 */})( window );
上面這一小段代碼來自於1.9.0當中jquery的源碼,它是一個無污染的JS插件的標准寫法,專業名詞叫閉包。可以把它簡單的看做是一個函數,與普通函數不同的是,這個函數沒有名字,而且會立即執行,就像下面這樣,會直接彈出字元串。
(function( window, undefined ) {
alert("Hello World!");
})( window );
可以看出來這樣寫的直接效果,就相當於我們直接彈出一個字元串。但是不同的是,我們將裡面的變數變成了局域變數,這不僅可以提高運行速度,更重要的是我們在引用jquery的JS文件時,不會因為jquery當中的變數太多,而與其它的JS框架的變數命名產生沖突。對於這一點,我們拿以下這一小段代碼來說明。
var temp = "Hello World!";
(function( window, undefined ) { var temp = "ByeBye World!";
})( window );
alert(temp);
這段代碼的運行結果是Hello而不是ByeBye,也就是說閉包中的變數聲明沒有污染到外面的全局變數,倘若我們去掉閉包,則最終的結果會是ByeBye,就像下面這樣。
var temp = "Hello World!";// (function( window, undefined ) {
var temp = "ByeBye World!";// })( window );
alert(temp);
由此就可以看出來,jquery的外衣就是這一層閉包,它是很重要的一個內容,是編寫JS框架必須知道的知識,它可以幫助我們隱藏我們的臨時變數,降低污染。
『玖』 急 求jquery完整視頻教程
Jquery視頻教程.zip網路網盤資源免費下載
鏈接:https://pan..com/s/1nIebXgAcvf8wuTWwXXyhrw