每次申明一個(gè)jQuery對象的時(shí)候,返回的是jQuery.prototype.init
站在用戶的角度思考問題,與客戶深入溝通,找到思茅網(wǎng)站設(shè)計(jì)與思茅網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋思茅地區(qū)。
對象,很多人就會(huì)不明白,init明明是jQuery.fn的方法啊,實(shí)際上這里不是方法,而是init的構(gòu)造函數(shù),因?yàn)閖s的prototype對象可
以實(shí)現(xiàn)繼承,加上js的對象只是引用不會(huì)是拷貝,new
jQuery,new
jQuery.fn和new
jQuery.fn.init的子對象是一樣的,只是有沒有執(zhí)行到init的不同,這里就不講原因了,等下一篇再講為什么會(huì)是這樣。
當(dāng)我們使用選擇器的時(shí)候$(selector,content),就會(huì)執(zhí)行
init(selectot,content),我們看看inti中是怎樣執(zhí)行的:
復(fù)制代碼
代碼如下:
if
(
typeof
selector
==
"string"
)
{
//正則匹配,看是不是HTML代碼或者是#id
var
match
=
quickExpr.exec(
selector
);
//沒有作為待查找的
DOM
元素集、文檔或
jQuery
對象。
//selector是#id的形式
if
(
match
(match[1]
||
!context)
)
{
//
HANDLE:
$(html)
-
$(array)
//HTML代碼,調(diào)用clean補(bǔ)全HTML代碼
if
(
match[1]
){
selector
=
jQuery.clean(
[
match[1]
],
context
);
}
//
是:
$("#id")
else
{
//判斷id的Dom是不是加載完成
var
elem
=
document.getElementById(
match[3]
);
if
(
elem
){
if
(
elem.id
!=
match[3]
)
return
jQuery().find(
selector
);
return
jQuery(
elem
);//執(zhí)行完畢return
}
selector
=
[];
}
//非id的形式.在context中或者是全文查找
}
else{
return
jQuery(
context
).find(
selector
);
}
}
這里就說明只有選擇器寫成$(‘#id')的時(shí)候最快,相當(dāng)于執(zhí)行了一次
getElementById,后邊的程序就不用再執(zhí)行了。當(dāng)然往往我們需要的選擇器并不是這么簡單,比如我們需要id下的CSS為className,
有這樣的寫法$(‘#id.className')和$(‘#id').find(‘.className');這兩種寫法的執(zhí)行結(jié)果都是一樣的,比
如div
id=”id”span
class=”className”/span/div,返回的肯定都是span
class=”className”/span,但是執(zhí)行的效率是完全不一樣的。
在分析一下上邊的代碼,如果不是$(‘#id')這樣的簡單選擇器的話,都會(huì)執(zhí)行find函
數(shù),那我們再看看find到底是做用的:
復(fù)制代碼
代碼如下:
find:
function(
selector
)
{
//在當(dāng)前的對象中查找
var
elems
=
jQuery.map(this,
function(elem){
return
jQuery.find(
selector,
elem
);
});
//下邊的代碼可以忽略,只是做一些處理
//這里應(yīng)用了js的正則對象的靜態(tài)方法test
//indexOf("..")需要了解一下xpath的語法,就是判斷selector中包含父節(jié)點(diǎn)的寫法
//本意就是過濾數(shù)組的重復(fù)元素
return
this.pushStack(
/[^+]
[^+]/.test(
selector
)
||
selector.indexOf("..")
-1
?
jQuery.unique(
elems
)
:
elems
);
}
如果這樣寫$(‘#id
.className'),就會(huì)執(zhí)行到擴(kuò)展的find(‘#id
.className',document),因?yàn)楫?dāng)前的this是document的jQuery數(shù)組,那我們在看看擴(kuò)展的find他的實(shí)現(xiàn),代碼比較
多,就不列出來,總之就是從第二個(gè)參數(shù)傳遞進(jìn)行的dom第一個(gè)子節(jié)點(diǎn)開始找,遇見#比對id,遇見.比對ClassName,還有:+-等處理。
那我們要優(yōu)化,是不是就要想辦法讓第二個(gè)參數(shù)context的范圍最小,那樣遍歷是不是就很少了?
如果我們這樣寫$(‘#id').find(‘.className'),那程序只這樣執(zhí)行
的,第一次init的時(shí)候執(zhí)行一步getElementById,就return了,接著執(zhí)行
find(‘.className',divDocument),divDocument就是我們第一次選擇的是div標(biāo)簽,如果document下有很
多dom對象的時(shí)候,這次只遍歷divDocument是不是少了很多次,而且在第一次選擇id的速度也要比遍歷快的多。
現(xiàn)在大家應(yīng)該是明白了吧。就是說第一層選擇最好是ID,而是簡單選擇器,目的就是定義范圍,
提高速度,這次就說這些,選擇寫法的優(yōu)化,其他的優(yōu)化,下次再說。
主要分三個(gè)部分,注冊Handler的Click事件
Click事件引發(fā)是開始拖動(dòng),此時(shí)注冊Document的MouseMove事件,Move的時(shí)候修改對象的位置
松開或者ESC的時(shí)候取消移動(dòng),注銷Document的Move事件
基本上所有的DragDrop都是這么實(shí)現(xiàn)的
jquery用AJAX讀回來代碼字符串然后用下面的代碼執(zhí)行讀取回來的script
( window.execScript || function( script ) {
window[ "eval" ].call( window, script );
} )( script );
JavaScript中Promise模式。
它的底層實(shí)現(xiàn)包括下面幾個(gè)方面:1.jQuery底層在實(shí)現(xiàn)ajax功能時(shí),調(diào)用了瀏覽器中的XMLHttpRequest對象,在最新的2.0版本后,由于不考慮IE瀏覽器的支持,直接使用該對象獲取用戶請求的數(shù)據(jù),包括地址和參數(shù)等。2.它將對象打開請求地址時(shí)的相關(guān)參數(shù)封裝在相關(guān)函數(shù)如ajax()的配置項(xiàng)中,一旦傳入了必需選項(xiàng),則直接調(diào)用相應(yīng)的send()方法進(jìn)行數(shù)據(jù)的請求。3.jQuery底層將對象請求后返回的數(shù)據(jù)結(jié)果,直接封裝到相關(guān)函數(shù)的success方法中,所以,一旦異步請求成功,返回的數(shù)據(jù)對象直接注入到方法中,因此,可以調(diào)用success方法獲取服務(wù)端返回的數(shù)據(jù)。我之前在黑馬程序員的免費(fèi)視頻中看到過ajax和jQuery的相關(guān)視頻,講的都還挺不錯(cuò)的。