javascript 常用的方法.....

 

记录一些常用的javascript方法   常用  常用 哈哈(都是个人理解....如果觉得我理解错了,请指正 )

1.

function Each(list, fun){
    for (var i = 0, len = list.length; i < len; i++) {fun(list[i], i); }
};

作用 :

让list里面的集合都执行一次fun(这么说应该不大对,大概是这个意思拉)

解释 :

list  为引用集 可以是元素集  也可以是数组;

fun 是函数 是让那个元素集里的每个东西都完成一次他;可以带参数如 上面的list[i](元素集的第i个元素),i索引值了;

Examples

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns="http://www.w3.org/1999/xhtml ">
<head>
<title>Command Function</title>
<style type="text/css">
div{height:30px; width:400px; background-color:#0000FF; margin-top:20px;}
</style>
</head>
<script language="JavaScript" type="text/javascript">
function Each(list, fun){
    for (var i = 0, len = list.length; i < len; i++) {fun(list[i], i); }
};
window.onload = function(){
 Each(document.body.getElementsByTagName("div"),function(obj,i){
  obj.onclick = function(){alert(i)}
 });
}
</script>
<body>
<div></div>
<div></div>
<div></div>
<div></div>
</body>
</html>


2.

var Bind = function(object, fun) {
    var args = Array.prototype.slice.call(arguments).slice(2);
    return function() {
        return fun.apply(object, args);
    }
}

作用 :让obj执行fun方法,fun里面的this指向obj(大概就是这个意思),其实Bind的意思就是绑定.

解释 :

 Array.prototype.slice是Array原型上的一个方法,截取数组并返回一个截取后的新数组

Array.prototype.slice.call(arguments)就是 对象arguments调用Array.prototype.slice方法了

参数为空 所以就是把arguments转成数组了

然后数组在执行slice(2);  就是返回一个没有前2个的新数组.

----------------------------------------------------------------------------------

有点奇怪啊 Array.prototype.slice.call(arguments)这里已经是执行一次,会何后面要要写.slice(2)了????

我也不明白  写成这样不是更简单效率更高吗 Array.prototype.slice.call(arguments,2);

一个例子来证明他们是一样的(如果哪位仁兄知道他们是不一样的,麻烦告诉小弟一下)

<script type="text/javascript">
 var arr = [1,2,3,4,5,6,7];
 function ss(){
  alert(Array.prototype.slice.call(arguments,2));
 }
 function tt(){
  alert(Array.prototype.slice.call(arguments).slice(2));
 }
 ss(1,2,3,4,5,6);
 tt(1,2,3,4,5,6);
</script>

----------------------------------------------------------------------------------

知道了这个Array.prototype.slice.call(arguments).slice(2);是把参数转为数组,那

    return function() {
        return fun.apply(object, args);
    }

就是返回一个函数了 我来分析下他的过程啊

如:bind(obj,fun,arg1)

bind(obj,fun,arg1)执行后就变成了

function(){

   return fun.apply(object, [arg1]);

}

因为闭包的原因arg1还存在 

因为apply的关系 所以前面把参数转成数组的原因也出来了

当执行上面的那个函数的时候,

先执行fun.apply(object, [arg1]); 在返回这个执行后的东西.


Examples(其实例子并好举,关键是如何让他有说服力了,我找不到,我也不举了)

-----------------------------------------------------------------------------------------------------------------------------------------

3.

var BindAsEventListener = function(object, fun){
    var args = Array.prototype.slice.call(arguments).slice(2);
    return function(e) {
        return fun.apply(object, [e||window.event].concat(args));
    }
}

这个和上面的那个例子一样的啊,在返回函数的参数第一个为event.

-----------------------------------------------------------------------------------------------------------------------------------------

4.

 function getobjpos(o){
  var x = 0, y = 0;
  do{x += o.offsetLeft;y += o.offsetTop;}while((o=o.offsetParent));
  return {'x':x,'y':y};
 }

作用 :

计算元素相对于浏览器所在的x的坐标和y的坐标

解释:

其实对于offsetParent的说明我也不是很明白.这个写法还是很容易看懂

当o.offsetParent不存在的时候结束循环,将没一次元素的offsetLeft or offsetTop累加

这么写在有些情况下会出错的

比如:当其中一个元素设置了scroll,并且有Top或者Left的时候就得加上top和left...............l

 

-----------------------------------------------------------------------------------------------------------------------------------------

5.

绑定事件和删除事件 

这个是原创噢

绑定事件  这个要和删除事件配合使用的

好处就是不需要在程序外面拿变量来引用绑定的函数  操作都在函数里面完成

var addListener = function(element,e,fn){
    !element.events&&(element.events = {});
    element.events[e]&&(element.events[e][addListener.id++]=fn)||(element.events[e] = {'0':fn});
    element.addEventListener?element.addEventListener(e,fn,false):element.attachEvent("on" + e,fn);
};
addListener.id = 1;
var removeListener = function(element,e,fn){
    var handlers = element.events[e],type;
    if(fn){
        for(type in handlers)
            handlers[type]===fn&&(element.removeEventListener?element.removeEventListener(e,fn,false):element.detachEvent("on" + e,fn));
    }else{
        for(type in handlers)
            element.removeEventListener?element.removeEventListener(e,handlers[type],false):element.detachEvent("on" + e,handlers[type]);
    }        
}; 

 

例子

<div id='cc' style="width:100px; height:120px; background-color:#000000"></div>
<br><br><br>
<div id='ccc' style="width:100px; height:120px; background-color:#000000" οnclick='xx()'></div>
<script>
var $ = function(id){
    return document.getElementById(id);
}
var addListener = function(element,e,fn){
    !element.events&&(element.events = {});
    element.events[e]&&(element.events[e][addListener.id++]=fn)||(element.events[e] = {'0':fn});
    element.addEventListener?element.addEventListener(e,fn,false):element.attachEvent("on" + e,fn);
};
addListener.id = 1;
var removeListener = function(element,e,fn){
    var handlers = element.events[e],type;
    if(fn){
        for(type in handlers)
            handlers[type]===fn&&(element.removeEventListener?element.removeEventListener(e,fn,false):element.detachEvent("on" + e,fn));
    }else{
        for(type in handlers)
            element.removeEventListener?element.removeEventListener(e,handlers[type],false):element.detachEvent("on" + e,handlers[type]);
    }       
};
var vb =function(){
    alert(1)
}
var vc =function(){
    alert(2)
}
window.οnlοad=function(){
    addListener($('cc'),'click',vb)
    addListener($('cc'),'click',vc)
}

function xx(){
    removeListener($('cc'),'click',vc)
}
</script>
</body>

 

-----------------------------------------------------------------------------------------------------------------------------------------

6.

设置元素的样式

setStyle( elems, style, value) )

可以设置单个 或者多个元素的样式

style可是是字符川串 如果是字符串 且value有值  则elem.style[ style ] = value;

若果单独是style没有value 则按elem.style.cssText = style
style也可以是对象


var setStyle = function(elems, style, value){

 

   //如果elems不是集合 就转换成数组  elems可以是数组  也可以是元素集合
    if( !elems.length ) elems = [elems];

    //如果style是字符串  把style转成对象 属性是style 值是value
    if( typeof style == "string"){       
        style = value === undefined?{cssText:style}:(function(o){
            return (o[style] = value,o);           
        })({});
    };


//   遍历elems 透明度 float比较特殊 所以单独出来

each(elems,function(i,elem,style){
        var value,name,ie=Sys.ie ;
        for(name in style){
            value = style[name];
            if (name === "opacity" && ie) {
                elem.style.filter = (elem.currentStyle.filter || "").replace( /alpha/([^)]*/)/, "" ) + "alpha(opacity=" + value * 100 + ")";
            }else if(name === "float"){
                elem.style[ ie ? "styleFloat" : "cssFloat" ] = value;
            }else{
                name = name.replace(/-([a-z])/ig, function(all, letter){
                    return letter.toUpperCase();
                });
                elem.style[name] = value;
            }
        }
    },style);
};

 

Test

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<div id='ss' style="width:20px; border:1px solid #000000"></div>
<div id='sss'></div>
<div id='ssss'></div>
<script language="javascript">

var Sys = function (ua){
    var b = {
        ie: /msie/.test(ua) && !/opera/.test(ua),
        opera: /opera/.test(ua),
        safari: /webkit/.test(ua) && !/chrome/.test(ua),
        firefox: /firefox/.test(ua),
        chrome: /chrome/.test(ua)
    },vMark = "";
    for (var i in b) {
        if (b[i]) { vMark = "safari" == i ? "version" : i; break; }
    }
    b.version = vMark && RegExp("(?:" + vMark + ")[///: ]([//d.]+)").test(ua) ? RegExp.$1 : "0";
    b.ie6 = b.ie && parseInt(b.version, 10) == 6;
    b.ie7 = b.ie && parseInt(b.version, 10) == 7;
    b.ie8 = b.ie && parseInt(b.version, 10) == 8;  
    return b;
}(window.navigator.userAgent.toLowerCase());
var each =  function ( object, callback, args ) {  
    var name, i = 0, length = object.length;  
    if ( args ) {
        args = Array.prototype.slice.call(arguments).slice(2);
        if ( length === undefined ) {  
            for ( name in object )  
                if ( callback.apply( object[ name ],[name,object[ name ]].concat(args) ) === false )  
                    break;  
        } else 
            for ( ; i < length; i++)  
                if ( callback.apply( object[ i ],[i,object[ i ]].concat(args)) === false )   //
                    break;  
    } else {     
        if ( length === undefined ) {  
            for ( name in object )  
                if ( callback.call( object[ name ], name, object[ name ] ) === false )  
                    break;  
        } else 
            for ( var value = object[0];  
                i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}  
    }  
    return object;  
};  
var setStyle = function(elems, style, value){
    if( !elems.length ) elems = [elems];
    if( typeof style == "string"){       
        style = value === undefined?{cssText:style}:(function(o){
            return (o[style] = value,o);           
        })({});
    };
    each(elems,function(i,elem,style){
        var value,name,ie=Sys.ie ;
        for(name in style){
            value = style[name];
            if (name === "opacity" && ie) {
                elem.style.filter = (elem.currentStyle.filter || "").replace( /alpha/([^)]*/)/, "" ) + "alpha(opacity=" + value * 100 + ")";
            }else if(name === "float"){
                elem.style[ ie ? "styleFloat" : "cssFloat" ] = value;
            }else{
                name = name.replace(/-([a-z])/ig, function(all, letter){
                    return letter.toUpperCase();
                });
                elem.style[name] = value;
            }
        }
    },style);
};
window.onload = function(){
    setStyle(document.getElementById('ss'),'height','20px');
    setStyle(document.getElementById('sss'),"width:20px;height:20px; border:1px solid #000000");
    setStyle(document.getElementById('ssss'),{width:"20px",height:"20px",border:"1px solid #000000"});
}
</script>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值