javascript框架设计之种子模块(4)


    isFunction : function(fn){
        return !!fn && typeof fn != "string" && !fn.nodeName && fn.constructor != Array && /^[\s[]?function/.test(fn + "");
    }


jQuery1.43中引入isWindow来处理makeArray中对window的判定,引入isNaN用于确保样式赋值的安全。同时引入type代替typeof关键字,用于获取基本数据的基本类型。

class2type = {}; jQuery.each("Boolean Number String Function Array Date RegExpObject".split(" "),function( i , name ){ class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); jQuery.type = function(obj){ return obj == null ? String(obj) : class2type[toString.call(obj)] || "object"; }

jQuery1.7中添加isNumeric代替isNaN。这是个不同于其它框架的isNumber,它可以是个字符串,只要外观上像数字就可以了。但jQuery1.7还做了一个违背之前提到稳定性的事情。冒然去掉jQuery.isNaN,因此,基于旧版jQuery的有大批插件失效。

//jQuery.1.43-1.64 jQuery.isNaN = function ( obj ) { return obj == null || !rdigit.test( obj ) || isNaN( obj ); } //jQuery1.7就是isNaN的去反版 jQuery.isNumeric = function ( obj ) { return obj != null && rdigit.test( obj ) && !isNaN( obj ); } //jQuery.1.71 - 1.72 jQuery.isNumeric = function ( obj ) { return !isNaN( parseFloat(obj) ) && isFinite( obj ); } //jQuery2.1 jQuery.isMumeric = function( obj ) { return obj - parseFloat(obj) >= 0; }

massFarmeWork的思路与jQuery一致,尽量减少isXXX系列的代码,把is Window,isNaN,nodeName等方法做了整合。代码较长,既可以获取类型,也可以传入第二参数进行类型比较。

var class2type = { "[objectHTMLDocument]" : "Document", "[objectHTMLCollection]" : "NodeList", "[objectStaticNodeList]" : "NodeList", "[objectIXMLDOMNodeList]" : "NodeList", "[objectDOMWindow]" : "window", "[object global]" : "window", "Null" : "Null", "undefined" : "undefined" }, toString = class2type.toString; "Boolean,Number,String,Function,Array,Date,RegExp,Window,Document,Arguments,NodeList".replace($.rword,function( name ) { class2type[ "[object" + name + "]" ] = name; }); //class2type这个映射几乎把常用的判定对象一网打尽 mass.type = function( obj , str ){ var result = class2type[ (obj == null || obj !== obj) ? obj : toString.call(obj) ] || obj.nodeName || "#"; if(result.charAt(0) === "#") { //兼容旧版浏览器的个别情况,如window.opera //利用IE678 window === document为true,document === window为false if( obj == obj.document && obj.document != obj ) { result = "window"; //返回构造器名称 } else if ( obj.nodeType === 9 ) { result = "Document"; } else if ( obj.callee) { result = "Arguments"; } else if ( isFinite(obj.length) && obj.item ) { result = "NodeList" //处理节点集合 } else { result = toString.call(obj).slice(8,-1); } } if(str){ result str === result; } return result; }

然后type方法就十分轻松了,用toSring.call(obj)得出值的左键,直接从映射中取得。IE678,我们才费一些周折处理window,document,argument,nodeList等对象。

百度的七巧板基于实用主义,判定也十分严谨。与EXT一样,能想到的写上,并且判定十分严谨。

目前版本2.0.2.5 ()

baidu.isDate = function( unknow ) { return baidu.type(unknow) == "date" && unknow.toString() != 'Invalid Date' && !isNaN(unknow); }; baidu.isNumber = function( unknow ) { return baidu.type(unknow) == "number" && isFinite( unknow ); };

5.主流框架的引入机制-domReady

domReady其实是一种名为"DOMContentLoaded"事件的别称,不过由于框架的需要,它与真正的DOMContentLoaded有一点区别,在很多新手和旧的书中,很多人将其写在window.onload回调中,防止dom树还没有建完就开始对节点操作。而对于框架来说,越早越介入dom就越好,如要进行特征侦测之类的。domready还可以满足用户提前绑定事件需求,因为有时页面图片过多等,window.onload事件迟迟不能触发,这时用户操作都没有效果,因此,主流的框架都引入了domReady机制,并且费了很大周折才兼容所有浏览器。具体的策略如下:

对于支持DOMContentLoaded事件使用DOMcontentLoaded事件
旧版本IE使用Diego perini发现的著名Hack

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgdfdp.html