• JavaScript滚动条的制作


    效果演示

     

    这个效果的制作是借助setTimeout的第三个参数。setTimeout/setInterval,这两个函数相信前端开发同学都很熟悉。它们在非IE(6-9)浏览器中还可以如下使用:

    1 setTimeout(function(obj){
    2     alert(obj.a);
    3 }, 2000, {a:1});

    即传了第三个参数,第三个参数将作为回调函数的参数obj传入。在非IE浏览器中都弹出了1。这样有个好处,即解决了回调函数的执行上下文,比如要调用某个对象的某个方法,即可以通过参数把该对象传进去。

    1 setTimeout(function(obj){
    2     obj.method();
    3 }, 2000, obj);

    上次看到一个setTimeout的一个用法:

    1 var arr = [1,9,2,8,3,7,4,6,4,5];
    2 for(var i = 0, len = arr.length; i < len; i++){
    3     setTimeout(function(x){
    4         console.log(x);
    5     },arr[i],arr[i]);
    6 }

    虽然这个并不是什么好的用法,这里setTimeout的第三个参数主要得到了除IE外的系列浏览器的支持。

    要让IE支持的话,可以按下面方法进行扩展:

    01 (function(w){
    02     //ie传入第三个参数
    03     if(!+[1,]){//除IE外,!+[1,]都是返回false
    04         (function(overrideFn){
    05             w.setTimeout = overrideFn(w.setTimeout);
    06             w.setInterval = overrideFn(w.setInterval);
    07         })(function(originalFn){
    08             return function(code,delay){
    09                 var args = Array.prototype.slice.call(arguments,2);
    10                 return originalFn(function(){
    11                     if(typeof code == 'string'){
    12                         eval(code);
    13                     }else{
    14                         code.apply(this,args);
    15                     }
    16                 },delay);
    17             }
    18         })
    19     }
    20 })(window)

    如果有第三个参数,某些情况下的调用就可以方便的处理回调函数中当前对象的问题,写起来好看点。扩展一下Function,增加一个延时调用(参考而已):

    01 function.prototype.delay = function(){
    02     var args = Array.prototype.slice.call(arguments,0);
    03     setTimeout(function(fn){
    04         fn.apply('',args.slice(1));
    05     },args[0],this);
    06 }
    07 var fn = function(x){
    08     alert(x)
    09 };
    10 fn.delay(1000,'xesam');

    下面是模拟进度条的代码:

    01 <script type="text/javascript">
    02     function Load(id,width){
    03         this.ele = document.getElementById(id);
    04         this.indicator = document.createElement('div');
    05         this.width = (width > 0 && width) || 300;
    06         this.init();
    07     }
    08     Load.prototype = {
    09         constructor:Load,
    10         init:function(){
    11             this.ele.style.width = this.width + 'px';
    12             this.ele.appendChild(this.indicator);
    13             var iStyle = this.indicator.style;
    14             iStyle.width = 0;
    15             iStyle.height = '100%';
    16             iStyle.background = '#ff5500';
    17         },
    18         start:function(){
    19             //this.init();
    20             this.loading();
    21         },
    22         loading:function(){
    23             this.timer = setTimeout(function(obj){
    24                 var t = obj.indicator.data || 0;
    25                 if(t < obj.width){
    26                     obj.indicator.style.width = t + 1 +'px';
    27                     obj.indicator.data = t + 1;
    28                     obj.loading();
    29                 }else{
    30                     clearInterval(obj.timer);
    31                 }
    32             },10,this);
    33         },
    34         stop:function(){
    35             clearTimeout(this.timer);
    36         }
    37     }
    38     var load_1 = new Load('loading',300);
    39     load_1.start();
    40 </script>
  • 相关阅读:
    前端面试题六
    前端面试题五
    前端面试题四
    前端面试题之三
    前端面试题分享二
    前端面试题分享一
    JS学习笔记一
    git使用学习笔记一
    常见User-Agent
    ado.net之SQLServer和Oracle (sys_cursor) 数据库链接——获取结果集方式对比
  • 原文地址:https://www.cnblogs.com/xiaoyang002/p/4074599.html
Copyright © 2020-2023  润新知