Time of Update: 2018-12-06
扯淡:本來這個《Prototype源碼淺析》是只打算作為學習Prototype的筆記的,不過有時候發現一個問題可以深入一點(雖然還是淺析),就脫離了原來的預期,越來越偏題了。今天的打算本來是寫完Str的,但是寫到變數檢測的時候,發現又可以扯點淡,就又拖累了進程。這個對於項目來說,肯定是不好的,不過對於學習,就不清楚了。因為自己吃過的虧,所以從一個新手的角度,寫得盡量新手向,新手共勉。 這裡我不關心javascript裡面各種類型是怎麼定義的,唯一要指出的是var str_1 = 'xesam';
Time of Update: 2018-12-06
在DOM操作裡,createElement是建立一個新的節點,createDocumentFragment是建立一個文檔片段。網上可以搜到的大部分都是說使用createDocumentFragment主要是因為避免因createElement多次添加到document.body引起的效率問題,比如:var arrText=["1","2","3","4","5","6","7","8","9","10"];for(var i=0;i<arrText.length;i++){var
Time of Update: 2018-12-06
剩下的方法太多,於是分作兩部分。亮點就是$break和$continue,以及grep方法的思想。 前面each方法中掉了一個方面沒有說,就是源碼中的$break和$continue。這兩個變數是預定義的,其作用相當於普通迴圈裡面的break和continue語句的作用。出於效率的考慮,在某些操作中並不需要完全遍曆一個集合(不局限於一個數組),所以break和continue還是很必要的。對於一個迴圈來說,對比下面幾種退出迴圈的方式: var array_1 =
Time of Update: 2018-12-06
這個比較簡單,做個記錄而已。建立一個嵌套節點,讓外層節點產生捲軸,然後用offsetWidth - clientWidth即可獲得捲軸寬度。需要注意的是為了避免頁面抖動,可以設定外層元素position:absolute和visibility:hidden參考: function getScrollWith(){var wrap = setAttributes(document.createElement('div'),{ style : {
Time of Update: 2018-12-06
setTimeout的通常用法是幹什麼我就不多說了,上次看到一個setTimeout的一個用法: var arr = [1,9,2,8,3,7,4,6,4,5];for(var i = 0, len = arr.length; i < len; i++){ setTimeout(function(x){ console.log(x); },arr[i],arr[i]);
Time of Update: 2018-12-06
這兩種主要是對《Prototype淺析》先前略過的Sring部分中toQueryParams和Object部分的toQueryString方法的補充 一、從URL中提取參數有下列字串:var linkURL = 'http://localhost:8080/String/string_6.html?暱稱=小西山子&age=24#id1';對於一個真實的URL地址,可以用js來讀取location中的相關資訊來獲得某些資訊,下面列舉一些:location.origin :
Time of Update: 2018-12-06
JSON介紹http://json.org/這個解析JSON,也是Prototype源碼淺析的一個鋪墊。下面是一個開篇例子,其中response是從伺服器獲得的JSON字串: var response_1 = "{\"user\":\"xesam\",\"info\":{\"age\":\"24\"}}";var response_2 = "{'user' : 'xesam'}";var response_3 = "console.log('xss')";var obj_1_1 =
Time of Update: 2018-12-06
Hash是Prototype作者擴充出來的一個資料類型。本質上他就是一個普通的javascript對象(註:不要糾結什麼javascript變數都是對象,這裡說new Object()那種),然後在這個對象上面擴充出來一些其他的方法。基本原理基本的原理的代碼說明就是: function Hash(object){this._object = object; } Hash.prototype = { constructor : Hash,
Time of Update: 2018-12-06
測試例子:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>
Time of Update: 2018-12-06
接著上一部分:Prototype源碼淺析——Function.prototype部分(一)粗略回顧,前面的一個例子,兩條道路:function handler(greet){ console.log(greet,this.name); }var obj = { name : 'xesam'
Time of Update: 2018-12-06
鏈式調用的優點是代碼簡潔易讀,減少了多次重複使用同一個變數。最常見的還是在jQuery庫裡面,例如:$(‘#id’).show().hide().show().hide().show().hide();(當然,這麼調用純屬蛋疼)在上面的語句中,$(‘#id’)是一個對象,然後鏈式的執行方法,其中的原理很簡單,就是執行完一個方法之後就返回本身(return this);然後被返回的對象(上例中就是$(‘#id’))繼續執行後面的方法,如果你這麼寫:var obj = $(‘#id’).show()
Time of Update: 2018-12-06
HTML處理stripTags | escapeHTML | unescapeHTML JSON處理unfilterJSON | isJSON | evalJSON | parseJSON指令碼處理stripScripts | extractScripts | evalScripts
Time of Update: 2018-12-06
簡述 $ 方法是 Prototype 的基礎,和jquery中的$作用差不多,不過功能卻弱了很多。因為Prototype中還有一個$$方法,看名字就知道,和$相比,$$加了一倍的錢,功能肯定就豐富撒。本文主要是剖析$方法,1.7版本的$$方法使用的是Sizzle引擎,比較複雜,是後面的事情。基本原理 $ 方法其實比較簡單,平時在個人的代碼中見得也比較多。基本原理就是如果傳入的是一個字串,就執行document.getElementById方法,如果是一個DOM元素,就直接返回傳入的元素,
Time of Update: 2018-12-06
前些天小小的分析了一下Prototype的Function部分,今天開始Prototype的Object這一部分開始需要說明的一點是,Object這部分與先前的Function那一部分有點不一樣,這次Object是直接擴充在Object上面的,而非Object.prototype,兩者是有本質區別的,也就是本次Obeject的擴充相當於添加Object的一個靜態變數(方法);extend(Object,
Time of Update: 2018-12-06
大家都知道,Sizzle是jQuery的禦用選取器引擎,是jQuery作者John Resig寫的DOM選取器引擎,速度號稱業界第一。另外,Sizzle是獨立的一部分,不依賴任何庫,如果你不想用jQuery,可 以只用Sizzle。所以單獨拿出來特別對待。在Prototype1.7中,選取器也採用了Sizzle,不過版本有點老,所以我去Sizzle網站搞了一份新的
Time of Update: 2018-12-06
對JSON不甚瞭解的可以先看下這個:《JSON三分鐘課程》、《JSON入門課程》對JSON的操作主要是解析JSON字串為一個對象和將一個對象轉換成JSON字串。網上搜一下JSON解析,就會發現一堆文章和方法,當然這篇文章主要不是討論JSON的解析,不過也可以大致回顧一下:第一、eval。eval('(' + jsonStr +
Time of Update: 2018-12-06
主要流程與Regex分塊var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g;這個正則比較長,主要是用來分塊和一步預先處理。1、2、3、4、'div#test + p > a.tab' --> ['div#test','+','p'
Time of Update: 2018-12-06
最近幾個同事升級了ff到5和6,於是有人向我報告了一個bug,說是一個上傳圖片的功能失效了,關鍵是有的升級有問題,有的升級之後又沒有問題。於是我檢查下,發現這個問題太坑爹了,居然是由一個外掛程式引起的,就是更新之後出現的那個由Firefox魔鏡升級的Firefox應用中心。具體原因:上傳圖片使用的是jquery的一個外掛程式:ajaxfileupload.js,裡面有段代碼是這樣的:if (io.contentWindow) {
Time of Update: 2018-12-06
尋找的入口對應的是Sizzle.find方法,Sizzle.find = function( expr, context) {}expr :尋找的運算式context :尋找的範圍find的步驟第一步:判斷主要集合,方法說過了,依次匹配,順序就是ID --> NAME -->
Time of Update: 2018-12-06
元素過濾是Sizzle中最複雜的一部分基本形式Sizzle.filter = function( expr, set, inplace, not ) {}expr 過濾運算式set 候選集合inplace 是否原地修改not 是否取補集說明:set傳遞的是一個集合(數組),如果inplace為true,set會被修改;not的作用是用來取補集。還是用個例子來說明下:<li id="a1" class="test"></li><li id="