Javascript自定义函数

$()

实至名归,最值钱的函数,可以节省多少流量啊。最先由Prototype.js实现的,那个洪荒时代遗留下来的珍兽,现在有许多变种:
01.function $() {
02.    var elements = [];
03.    for (var i = 0; i < arguments.length; i++) {
04.        var element = arguments[i];
05.        if (typeof element == 'string')
06.            element = document.getElementById(element);
07.        if (arguments.length == 1)
08.            return element;
09.        elements.push(element);
10.    }
11.    return elements;
12.}
 

2、getStyle()与setStyle()

所有UI控件都应该存在的函数,动态设置样式与获取样式。这个可以写得很短,也可以写得很长,但要精确取得样式,一个字:难!但我发现许多问题都是发端于IE,微软的开发人员好像从来不打算给出getComputedStyle这样的函数,与之相近的currentStyle会返回auto、inhert、‘ ’等让你哭笑不得的值,这还没有算上IE怪癖模式带来的难度呢!各类库的实现是非常长与难分离出来的,下面是我实现的版本:
01.function setStyle(el,prop,value){
02.   if(prop == "opacity" && !+"v1"){
03.     //IE7 bug:filter 滤镜要求 hasLayout=true 方可执行(否则没有效果)
04.     if (!el.currentStyle || !el.currentStyle.hasLayout) el.style.zoom = 1;
05.     prop = "filter";
06.     if(!!window.XDomainRequest){
07.       value ="progid:DXImageTransform.Microsoft.Alpha(style=0,opacity="+value*100+")";
08.     }else{
09.       value ="alpha(opacity="+value*100+")"
10.     }
11.   }
12.   el.style.cssText += ';' + (prop+":"+value);
13. }
14. function getStyle(el, style){
15.   if(!+"v1"){
16.     style = style.replace(/-(w)/g, function(all, letter){
17.       return letter.toUpperCase();
18.     });
19.     return el.currentStyle[style];
20.   }else{
21.     return document.defaultView.getComputedStyle(el, null).getPropertyValue(style)
22.   }
23. }
 

有关setStyle还可以看我另一篇博文,毕竟现在设置的样式都是内联样式,与html混杂在一起。

3、getCookie()、setCookie()及deleteCookie()

做BBS与商业网站的应该经常用到,无理由每次都要让用户输入密码登录吧。我们需要借助cookie实现自动登录功能:
01.function getCookie( name ) {
02.    var start = document.cookie.indexOf( name + "=" );
03.    var len = start + name.length + 1;
04.    if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
05.        return null;
06.    }
07.    if ( start == -1 ) return null;
08.    var end = document.cookie.indexOf( ';', len );
09.    if ( end == -1 ) end = document.cookie.length;
10.    return unescape( document.cookie.substring( len, end ) );
11.}
12.function setCookie( name, value, expires, path, domain, secure ) {
13.    var today = new Date();
14.    today.setTime( today.getTime() );
15.    if ( expires ) {
16.        expires = expires * 1000 * 60 * 60 * 24;
17.    }
18.    var expires_date = new Date( today.getTime() + (expires) );
19.    document.cookie = name+'='+escape( value ) +
20.        ( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()
21.        ( ( path ) ? ';path=' + path : '' ) +
22.        ( ( domain ) ? ';domain=' + domain : '' ) +
23.        ( ( secure ) ? ';secure' : '' );
24.}
25.function deleteCookie( name, path, domain ) {
26.    if ( getCookie( name ) ) document.cookie = name + '=' +
27.            ( ( path ) ? ';path=' + path : '') +
28.            ( ( domain ) ? ';domain=' + domain : '' ) +
29.            ';expires=Thu, 01-Jan-1970 00:00:01 GMT';
30.}
 

4、inArray()

用于判断检查数组中是否存在某个值,下面方法取自Prototype类库:
1.Array.prototype.inArray = function (value) {
2.    for (var i=0,l = this.length ; i <l ; i++) {
3.        if (this[i] === value) {
4.            return true;
5.        }
6.    }
7.    return false;
8.};
 

5、insertAfter()

DOM只提供了insertBefore,我们很有必要自己实现insertAfter。不过我认为 insertAdjacentElement是更好的选择,现在除了火狐其他浏览器都实现这个方法。下面是Jeremy Keith的版本:
1.function insertAfter(parent, node, referenceNode) {
2.    parent.insertBefore(node, referenceNode.nextSibling);
3.}

6、toggle()

用来显示或隐藏一个DOM元素:
01.function toggle(obj) {
02.    var el = document.getElementById(obj);
03.    if ( el.style.display != 'none' ) {
04.        el.style.display = 'none';
05.    }
06.    else {
07.        el.style.display = '';
08.    }
09.}

7、cssQuery()

别名为getElementsBySeletor,由Dean Edwards最先实现,Prototype.js、JQuery等类库都有相应实现,其中JQuery把它整合到$()选择器中,名声盖过其前辈。不过IE8等新锐浏览器已经实现querySelector与querySelectorAll方法,待到IE6与IE7报废之日,它就无用了。无忧里有它的实现原理讲解。由于太长,就不粘出来了,具体可到原作者网站看看。

8、getElementsByClass()

我有收集癖,手头上拥有许多版本,最后集思广益自己实现了一个。下面是我的实现:
01.var getElementsByClassName = function (searchClass, node,tag) {
02.    if(document.getElementsByClassName){
03.        return  document.getElementsByClassName(searchClass)
04.    }else{
05.        node = node || document;
06.        tag = tag || "*";
07.        var classes = searchClass.split(" "),
08.        elements = (tag === "*" && node.all)? node.all : node.getElementsByTagName(tag),
09.        patterns = [],
10.        returnElements = [],
11.        current,
12.        match;
13.        var i = classes.length;
14.        while(--i >= 0){
15.            patterns.push(new RegExp("(^|\s)" + classes[i] + "(\s|$)"));
16.        }
17.        var j = elements.length;
18.        while(--j >= 0){
19.            current = elements[j];
20.            match = false;
21.            for(var k=0, kl=patterns.length; k<kl; k++){
22.                match = patterns[k].test(current.className);
23.                if (!match)  break;
24.            }
25.            if (match)  returnElements.push(current);
26.        }
27.        return returnElements;
28.    }
29.}
 

9、addLoadEvent()

我以前讨论过这函数,不细说,就是慢了一点,各大类库基本无视它,自行实现domReady版本。下面是Simon Willison 的实现:
01.var addLoadEvent = function(fn) {
02.  var oldonload = window.onload;
03.  if (typeof window.onload != 'function') {
04.    window.onload = fn;
05.  }else {
06.    window.onload = function() {
07.      oldonload();
08.      fn();
09.    }
10.  }
11.}
 

10、addEvent

网上最流行的版本是Scott Andrew的,据说Javascript界曾举行一场比赛(此事件我们可以在Pro Javascript Techniques第100页看到)或浏览PPK的网站,征求添加事件与移除事件的函数,他就是其获奖者。下面就是他的实现:
01.function addEvent(elm, evType, fn, useCapture) {
02.  if (elm.addEventListener) {
03.    elm.addEventListener(evType, fn, useCapture);//DOM2.0
04.    return true;
05.  }
06.  else if (elm.attachEvent) {
07.    var r = elm.attachEvent('on' + evType, fn);//IE5+
08.    return r;
09.  }
10.  else {
11.    elm['on' + evType] = fn;//DOM 0
12.  }
13.}
 

下面是Dean Edwards 的版本:
01.function addEvent(elm, evType, fn, useCapture) {
02.  if (elm.addEventListener) {
03.    elm.addEventListener(evType, fn, useCapture);//DOM2.0
04.    return true;
05.  }
06.  else if (elm.attachEvent) {
07.    var r = elm.attachEvent('on' + evType, fn);//IE5+
08.    return r;
09.  }
10.  else {
11.    elm['on' + evType] = fn;//DOM 0
12.  }
13.}

下面是Dean Edwards 的版本:
01.//addEvent/removeEvent written by Dean Edwards, 2005
02.//with input from Tino Zijdel
03.//http://dean.edwards.name/weblog/2005/10/add-event/
04.function addEvent(element, type, handler) {
05.    //为每一个事件处理函数分派一个唯一的ID
06.    if (!handler.$$guid) handler.$$guid = addEvent.guid++;
07.    //为元素的事件类型创建一个哈希表
08.    if (!element.events) element.events = {};
09.    //为每一个"元素/事件"对创建一个事件处理程序的哈希表
10.    var handlers = element.events[type];
11.    if (!handlers) {
12.        handlers = element.events[type] = {};
13.        //存储存在的事件处理函数(如果有)
14.        if (element["on" + type]) {
15.            handlers[0] = element["on" + type];
16.        }
17.    }
18.    //将事件处理函数存入哈希表
19.    handlers[handler.$$guid] = handler;
20.    //指派一个全局的事件处理函数来做所有的工作
21.    element["on" + type] = handleEvent;
22.};
23.//用来创建唯一的ID的计数器
24.addEvent.guid = 1;
25.function removeEvent(element, type, handler) {
26.    //从哈希表中删除事件处理函数
27.    if (element.events && element.events[type]) {
28.        delete element.events[type][handler.$$guid];
29.    }
30.};
31.function handleEvent(event) {
32.    var returnValue = true;
33.    //抓获事件对象(IE使用全局事件对象)
34.    event = event || fixEvent(window.event);
35.    //取得事件处理函数的哈希表的引用
36.    var handlers = this.events[event.type];
37.    //执行每一个处理函数
38.    for (var i in handlers) {
39.        this.$$handleEvent = handlers[i];
40.        if (this.$$handleEvent(event) === false) {
41.            returnValue = false;
42.        }
43.    }
44.    return returnValue;
45.};
46.//为IE的事件对象添加一些“缺失的”函数
47.function fixEvent(event) {
48.    //添加标准的W3C方法
49.    event.preventDefault = fixEvent.preventDefault;
50.    event.stopPropagation = fixEvent.stopPropagation;
51.    return event;
52.};
53.fixEvent.preventDefault = function() {
54.    this.returnValue = false;
55.};
56.fixEvent.stopPropagation = function() {
57.    this.cancelBubble = true;
58.};
 

功能非常强悍,解决IE的this指向问题,event总是作为第一个参数传入,跨浏览器就更不在话下。

另,我还珍藏了一个HTML5工作组的版本:
01.var addEvent=(function(){
02.    if(document.addEventListener){
03.        return function(el,type,fn){
04.            if(el.length){
05.                for(var i=0;i<el.length;i++){
06.                    addEvent(el[i],type,fn);
07.                }
08.            }else{
09.                el.addEventListener(type,fn,false);
10.            }
11.        };
12.    }else{
13.        return function(el,type,fn){
14.            if(el.length){
15.                for(var i=0;i<el.length;i++){
16.                    addEvent(el[i],type,fn);
17.                }
18.            }else{
19.                el.attachEvent('on'+type,function(){
20.                    return fn.call(el,window.event);
21.                });
22.            }
23.        };
24.    }
25.})();

时间: 2024-08-31 14:46:57

Javascript自定义函数的相关文章

最常用的10个javascript自定义函数

javascript|函数 If there was ever a universal common.js shared among the entire develosphere, you'd fine these ten (plus one bonus) functions. It would be the swiss army knife no developer would go into production without. They have no doubt been teste

JavaScript自定义函数实现查找两个字符串最长公共子串的方法_javascript技巧

本文实例讲述了JavaScript自定义函数实现查找两个字符串最长公共子串的方法.分享给大家供大家参考,具体如下: //查找两个字符串的最长公共子串 function findSubStr(s1,s2){ var S=sstr= "" ,L1=s1.length,L2=s2.length; if (L1>L2){ var s3=s1;s1=s2,s2=s3,L1=s2.length;} for ( var j=L1;j> 0 ;j--) for ( var i= 0 ;i&

javascript自定义函数参数传递为字符串格式_javascript技巧

自定义函数参数传递为 字符串格式 ,传递方式 1:用this传递 2:引号缺省 3:转义字符(html中 " 代表"双引号,'代表单引号,javascript中直接\" 和Java通用转义字符集) <html> <head> <script language="LiveScript"> function print(arg){ alert("你好!"+arg); } </script> &

asp.net中调用javascript自定义函数的方法(包括引入JavaScript文件)总结

通常javascript代码可以与HTML标签一起直接放在前 端页面中,但如果JS代码多的话一方面不利于维护,另一方面也对搜索引擎不友好,因为页面因此而变得臃肿:所以一般有良好开发习惯的程序员都会把 javascript代码放到独立的js文件中,其他页面通过引入该js文件来使用相应的 javascript代码.用如下方法引用JS文件:<script src="script/admin.js" type="text/javascript"></scr

Javascript自定义函数判断网站访问类型是PC还是移动终端

 如果,能够判断出访问Web网页的类型(PC还是移动终端).就可以解决许多绚丽多彩的 Flash效果出不来的问题 由于很多移动终端不支持 Flash,因此 许多绚丽多彩的 Flash效果出不来.如果,能够判断出访问Web网页的类型(PC还是移动终端).就可以对症下药,找出解决的办法!    访问的类型为移动终端我们就用.gif代替Flash(.swf后缀)动画,PC端就不做改变.这样就比较完美了!    如下所示,函数 flashChecker() 就是用来检测访问的类型.  代码如下: <sc

Javascript自定义函数判断网站访问类型是PC还是移动终端_javascript技巧

由于很多移动终端不支持 Flash,因此 许多绚丽多彩的 Flash效果出不来.如果,能够判断出访问Web网页的类型(PC还是移动终端).就可以对症下药,找出解决的办法! 访问的类型为移动终端我们就用.gif代替Flash(.swf后缀)动画,PC端就不做改变.这样就比较完美了! 如下所示,函数 flashChecker() 就是用来检测访问的类型. 复制代码 代码如下: <script language="javascript" type="text/javascri

JavaScript基于自定义函数判断变量类型的实现方法_javascript技巧

本文实例讲述了JavaScript基于自定义函数判断变量类型的实现方法.分享给大家供大家参考,具体如下: 通常用typeof来判断js变量的类型,但很多时候仅仅typeof满足不了要求的. 我写了一个自定义函数来做这个事,判断的比较全面了. function varType(v){ if ( typeof v=== "object" ){ if (v=== null ) return 'null' ; if (v. constructor ) return (v. constructo

javascript定义函数的方法_javascript技巧

JavaScript 使用关键字 function 定义函数. 函数可以通过声明定义,也可以是一个表达式. 函数声明 在之前的教程中,你已经了解了函数声明的语法 : function functionName(parameters) { 执行的代码 } 函数声明后不会立即执行,会在我们需要的时候调用到.实例 function myFunction(a, b) { return a * b; } 函数表达式 JavaScript 函数可以通过一个表达式定义. 函数表达式可以存储在变量中: 实例 v

JavaScript自定义等待wait函数实例分析

 这篇文章主要介绍了JavaScript自定义等待wait函数,实例分析了自定义等待函数的实现与使用技巧,需要的朋友可以参考下     本文实例讲述了JavaScript自定义等待wait函数用法.分享给大家供大家参考.具体分析如下: 下面是一个js自定义的wait函数,可以暂停程序的执行 ? 1 2 3 4 5 6 7 8 function sleep(delay) { var start = new Date().getTime(); while (new Date().getTime()