-
Math.max(0, startTime + options.duration - createTime()) 過濾出數組最大值
+new Date 時間戳
查看全部 -
onceRun =?
function(func) {
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? makeAnim(element, options, func);
? ? ? ? ? ? ? ? }
func =?
function() {
? ? ? ? ? ? ? ? ? ? ? ? fireing = false;
? ? ? ? ? ? ? ? ? ? ? ? _fire();
? ? ? ? ? ? ? ? ? ? }
查看全部 -
在 ajax 請求中類型如果是 type 是 post,其實內部都只會用 get,因為其跨域的原理就是用的動態加載 script 的 src,所以我們只能把參數通過 url 的方式傳遞
我們使用了 dataType 是 'jsonp' 但是 jquery 內部有進一步的優化,如果探測到還是同域下的請求,依然還是用 XmlHttpRequest 處理,所以我們在同域下測試的話,可以把 crossDomain 選項置為 true,這樣強制為跨域處理,這樣就會通過 script 處理了
查看全部 -
jsonp: "callback", //傳遞給請求處理程序或頁面的,用以獲得jsonp回調函數名的 參數名(一般默認為:callback)
? ? jsonpCallback: "Handler", //自定義的jsonp回調函數名稱,默認為jQuery自動生成的隨機函數名,也可以寫"?",jQuery會自動為你處理數據
查看全部 -
如果 on 中傳入參數 selector ,意味著就是有委托的處理,那么我們就需要用一個標記來記錄下這個元素到底委托了多少次。
查看全部 -
event 對象的屬性和方法包含了當前事件的狀態。
當前事件,是指正在發生的事件;狀態,是與事件有關的性質,如引發事件的?DOM?元素、鼠標的狀態、按下的鍵等等。
?
如上結構,currentTarget 是 aaron 的 div 元素 , target 是 p 元素,事件對象是有作用域的 currentTarget 是等于 this 的。
e.stopImmediatePropagation 方法不僅阻止了一個事件的冒泡,也把這個元素上的其他綁定事件也阻止了。
事件對象提供了 preventDefault,stopPropagation2 個方法一個停止事件傳播,一個傳遞默認的行為(暫且無視IE),
查看全部 -
在下列情況下,應該使用 .live()或 .delegate(),而不能使用 .bind():
1.?為DOM中的很多元素綁定相同事件; 2.?為DOM中尚不存在的元素綁定事件; 3.?用.bind()的代價是非常大的,它會把相同的一個事件處理程序hook到所有匹配的DOM元素上 4.?不要再用.live()了,它已經不再被推薦了,而且還有許多問題 5.?.delegate()會提供很好的方法來提高效率,同時我們可以添加一事件處理方法到動態添加的元素上
我們可以用 .on() 來代替上述的 3 種方法。
不足點也是有的:
1.?并非所有的事件都能冒泡,如load,?change,?submit,?focus,?blur 2.?加大管理復雜 3.?不好模擬用戶觸發事件 4.?如何取舍就看項目實際中運用了
?.bind() 綁定事件的時候這些元素必須已經存在,很明顯就是直接調用沒利用委托機制,如下:
問:單擊ddddd,會在最上面顯示sdfsdf,但我單擊sdfsdf后,并沒有顯示“on觸發”,是因為on不能綁定動態添加的元素嗎?
<body>
? <p>on,click,delegate</p>
? <h2>ddddd</h2>
? <span></span
<script>
$("h2").on("click",function(){
? ? $("p:first").before(" <h3>sdfsdf</h3>");
})
$("h3").on("click", function(){
? ? $("span").append("on觸發! ");
});
答:on支持動態綁定,只不過需要綁定到父級元素上。(使用委托機制)
<script>
$("h2").on("click",function(){
$("p:first").before(" <h3>sdfsdf</h3>");
})
$("body").on("click","h3", function(){
??? $("span").append("on觸發! ");
});
?</script>
查看全部 -
jQuery不支持獲取隱藏元素的偏移坐標。同樣的,也無法取得隱藏元素的 border, margin, 或 padding 信息
查看全部 -
cloneNode不會復制javascript屬性,比如事件,這個方法只會復制特性。當然IE有這個BUG它會復制事件處理程序。cloneNode(a)方法接受一個布爾值參數,表示是否深拷貝。
true:表示執行深拷貝,復制本節點以及整個子節點樹。
false:淺拷貝,只復制節點本身。
復制后返回的節點副本屬于文檔所有,但是并沒有父節點。除非使用 appendChild,insertChild(),replaceChild()將它添加到文檔。
cloneNode(true)的時候是遍歷的節點,但是不會把對應的事件與數據給復制,但是jQuery.clone方法克隆的時候,是會把該節點上的事件與數據給一并復制過去的,這樣的機制是建立在數據分離的基礎上。
查看全部 -
移除 涉及節點刪除的接口jQuery劃分了四個分別是detach,empty,remove,unwrap,因為使用的范圍不同,所以功能有所差異,但是總的來說都是用來清理節點的。?
.empty() 從DOM中移除集合中匹配元素的所有子節點,為了避免內存泄漏,jQuery先移除子元素的數據和事件處理函數,然后移除子元素。?
.remove() 將元素移出DOM,當我們想將元素自身移除時我們用 .remove(),同時也會移除元素內部的一切,包括綁定的事件及與該元素相關的jQuery數據。remove是empty的加強版,把本身的父節點也清除掉了。因為remove支持過濾器所以支持傳遞selecor。remove需要刪除自身及其所有的子元素包括事件與數據,所以要通過找到父節點parnetNode移除。?
.detach() 如果你想刪除元素,不破壞他們的數據或事件處理程序(這些綁定的信息還可以在之后被重新添加回來)。.detach() 方法和.remove()一樣, 除了 .detach()保存所有jQuery數據和被移走的元素相關聯。當需要移走一個元素,不久又將該元素插入DOM時,這種方法很有用。
innerText是我們常用的文本清理方法,但是火狐下不兼容,不過會提供一個類似的方法叫textContent。
查看全部 -
在所有節點類型中,只有DocumentFragment在文檔中沒有對應的標記。DOM規定文檔片段(documentfragment)是一種“輕量級”的文檔,可以包含和控制節點,但不會像完整的文檔那樣占用額外資源。
即當請求把一個 DocumentFragment 節點插入文檔樹時,插入的不是 DocumentFragment 自身,而是它的所有子孫節點。
查看全部 -
jQuery在節點操作上使用了innerHTML,創建效率上來說至少比createElement快了2-10倍不等,而且還能一次性生成一堆的節點,但是隨之而來就有一些兼容性問題,
我總結了有以下幾點,當然兼容上也結合了jQuery的解決方案。
? IE會對用戶字符串進行trimLeft操作,用戶可能的本意就是需要空白
? IE8有些元素innerHTML是只讀
? IE會忽略開頭的無作用域元素
? 大多情況下不執行script腳本,當然如果支持defer的IE9之前的瀏覽器除外
? 一些標簽不能作為div的子元素,如tr,tb, col等
jQuery的節點操作最終是需要轉化成文檔碎片也就是要通過buildFragment()方法處理的,所以innerHTML兼容的修復也自然在buildFragment方法中。
查看全部 -
dffkklglg
查看全部 -
jjdkdkkdkd
查看全部 -
來來來擴擴擴擴
查看全部 -
jquery 源碼查看全部
-
?jQuery.each({
? ? parent: function(elem) {
? ? ? var parent = elem.parentNode;
? ? ? return parent && parent.nodeType !== 11 ? parent : null;
? ? },
? ? parents: function(elem) {
? ? ? return dir(elem, "parentNode");
? ? },
? ? parentsUntil: function(elem, until) {
? ? ? return dir(elem, "parentNode", until);
? ? }
? }, function(name, fn) {
? ? ajQuery[name] = function(until, selector) {
? ? ? return? fn(until, selector);
? ? };
? });
查看全部 -
接口抽象合并查看全部
-
針對節點的操作有幾個重點的細節:
保證最終操作的永遠是dom元素,瀏覽器的最終API只認識那么幾個接口,所以如果傳遞是字符串或者其他的,當然需要轉換
針對節點的大量操作,我們肯定是需要引入文檔碎片做優化的,這個必不可少
我們知道jQuery的的接口是支持多種參數傳遞的,那么就需要有一個過濾器的中介來處理各種參數類型。
細節:
1:IE下面innerHTML會忽略沒作用域元素,no-scope element(script,link,style,meta,noscript)等,所以這類通過innerHTML創建需要加前綴
2:innerHTML在IE下面會對字符串進行trimLeft操作,去掉空白
3: innerHTML不會執行腳本的代碼,如果支持defer除外
4:很多標簽不能作為div的子元素、td、tr, tbody等等
5:jQuery是合集對象,文檔碎片的與事件的復制問題
?
針對innerHTML不會執行腳本的代碼,如果支持defer除外的解釋:
div.innerHTML?=?"<script>alert(1)</srcript>"?這個代碼不會執行
例外的情況:IE9之前滿足幾個條件
1:script設定defer屬性
2: script元素必須位于有作用域元素之后,因為script被認為是無作用域的(頁面中不可見)
換句話說,這樣設置
div.innerHTML?=?"<div><script?defer>alert(1)</srcript></div>"??可以執行
jQuery在內部通過會有一個domManip方法,把這些問題都方方面面處理掉了
?
綜合上面一系列的問題,jQuery引入了domManip方法
原因清楚了,我們再來看jQuery是如何處理tbody問題,jQuery是兼容IE 6瀏覽器的。append、prepend、before和after都是操作Dom元素的函數,如果被插入的對象是table,那就要在table中加入tbody標簽啊
所以domManip,主要是處理這個問題的,他還處理插入元素的順序等等
在結構上首先用extend在原型上拓展了一堆方法,其實每一個的實現都很簡單,重點就是要看懂domManip的使用??梢灾攸c挑兩個方法的實現看一看,不用每個都看。
然后就是appendTo和append之類的處理,大同小異,因為實現差不多,所以就放在一起了
查看全部 -
HTML結構:
$('.inner').after('<p>Test</p>');
$對象:
$('.container').after($('h2'));
回調函數
一個返回HTML字符串、DOM 元素、 或者 jQuery 對象的函數,插在每個匹配元素的后面。接收元素在集合中的索引位置作為參數。在函數中this指向元素集合中的當前元素:
.domManip()是jQuery DOM操作的核心函數。dom即Dom元素,Manip是Manipulate的縮寫,連在一起就是Dom操作的意思。
對封裝的節點操作做了參數上的校正支持,與對應處理的調用:append、prepend、before、after、replaceWith、appendTo、prependTo、insertBefore、insertAfter、replaceAll。
為什么需要用這個domManip函數呢?
我們知道節點操作瀏覽器提供的接口無非就是那么幾個:
appendChild()
通過把一個節點增加到當前節點的childNodes[]組,給文檔樹增加節點:
cloneNode()
復制當前節點,或者復制當前節點以及它的所有子孫節點:
hasChildNodes()
如果當前節點擁有子節點,則將返回true:
insertBefore()
給文檔樹插入一個節點,位置在當前節點的指定子節點之前。如果該節點已經存在,則刪除之再插入到它的位置:
removeChild()
從文檔樹中刪除并返回指定的子節點:
replaceChild()
從文檔樹中刪除并返回指定的子節點,用另一個節點替換它。
以上接口都有一個特性,傳入的是一個節點元素。如果我們傳遞不是一個dom節點元素,如果是一個字符串,一個函數或者其他呢?
所以針對所有接口的操作,jQuery會抽象出一種參數的處理方案,也就是domManip存在的意義了,針對很多類似接口的參數抽象jQuery內部有很多這樣的函數了,如之前屬性操作中的jQuery.access。
查看全部
舉報