博客

  • $.callbacks()函数回调管理

    jquery $.callbacks 函数 回调 管理

    注:阅读版本为1.8.3

    $.callbacks() //管理多个 函数 回调

    function fn1(i,a){
     alert(i+a);
     return false
    }
    
    function fn2(){
     alert('f2');
    }
     
    function fn3(){
     alert('f3');
    }
    var callbacks=$.Callbacks(); //创建回调对象
    callbacks.disable(); //跟empty()类似,但它仅次哪条语句之下就禁用哪条,以下代码不受影响。
    callbacks.add(fn1); // 方式1
    callbacks.add(fn1, fn2); // 方式2 一次添加多个回调函数
    callbacks.add([fn1, fn2]); // 方式3 传数组
    callbacks.add(fn1, [fn2]); // 方式4 函数和数组掺和
    callbacks.remove(fn1); //移除fn1的回调
    callbacks.empty(); //移除所有 回调函数
    callbacks.fire(1,1); //执行add()中添加的函数,括号里传参数
    callbacks.fireWith(window,[1,1]); //跟fire(1,1)类似
    callbacks.has(fn3); //判断某函数是否加入了回调列表中
    callbacks.fired(); //判断 只要调用过一次fire或fireWith就会返回true。

     

    $.Callbacks() //可传递4种参数 once,memory,unique,stopOnFalse,也可组合使用。

    once:触发一次
    var callbacks=$.Callbacks('once');
    callbacks.add(fn);
    callbacks.fire(); // 触发一次
    callbacks.fire(); // 不再触发
    memory:触发全部函数不分先后
    callbacks.add(fn1);
    callbacks.fire(); 
    callbacks.add(fn2); // fn2也会触发到
    unique:保证重复出现的函数也仅调用一次
    callbacks.add(fn1);
    callbacks.add([fn1, fn2]); // fn1重复了
    callbacks.fire(); // fn1不会在被执行
    stopOnFalse: 让函数中有return false的语句生效
    function fn1() {
     console.log(1)
    }
    function fn2() {
     console.log(2)
     return false // 注意这里
    }
    function fn3() {
     console.log(3)
    }
    var callbacks = $.Callbacks('stopOnFalse');
    callbacks.add(fn1, fn2, fn3);
    callbacks.fire(); // fn3 不会被执行到
    可以随意组合使用
    var callbacks = $.Callbacks('once stopOnFalse');
  • mousewheel滑轮滚动触发事件

    fullpage 手机 滚屏 pagefull

    滑轮滚动触发事件在网上搜索到最多的是jquery.mousewheel.js插件,但是兼容性貌似不支持IE,找了很多有找到类似不错的插件效果例如:https://sdeno.com/?p=3718能兼容IE5.5。

    但是我们不用滑轮做这么炫的效果的时候,我们只需要以下代码就行。

    var scrollFunc=function(e){ 
      e=e || window.event; 
      if(e.wheelDelta){//IE/Opera/Chrome 
         if(e.wheelDelta/120==1){ 
           // console.log('向上');
           up();
         }else{
           // console.log('向下');
            down();
         }
     }else if(e.detail){//Firefox 
        if(e.detail/3==1){
           // console.log('向下');
           down();
        }else{
           // console.log('向上');
           up();
          }
       } 
     } 
     /*注册事件*/ 
     if(document.addEventListener){ 
       document.addEventListener('DOMMouseScroll',scrollFunc,false); 
     }//W3C 
     document.onmousewheel=scrollFunc;//IE/Opera/Chrome

    https://sdeno.com/zp/mousewheel.html

    摘抄:http://www.cnblogs.com/huangyong8585/archive/2012/11/14/2770114.html

  • 最完美的手机手势监控插件idangerous.swiper.js

    此插件兼容IE7以上浏览器,之前也有介绍过类似的插件swipe.js,但是没idangerous.swiper.js好用,

    Swiper是一款免费和超级轻量的适用于多种设备的的滑块幻灯片插件,可适用于移动网站,移动APP和移动本地APP,插件原为IOS设计,也可以在Android,Windows Phone 8和现代桌面浏览器上使用。

    引入核心文件,可以不需要jquery的,但jQ酷习惯了jquery,所以还是引入了。

    1,

    <link rel="stylesheet" href="path_to_css/idangerous.swiper.css">
    <script defer src="http://libs.useso.com/js/jquery/2.1.1/jquery.min.js "></script>
    <script defer src="path_to_js/idangerous.swiper-2.x.min.js"></script>

    2,写入html

    <div class="swiper-container">
     <div class="swiper-wrapper"> <!--First Slide-->
     <div class="swiper-slide"> 
     <!-- 这里写入你需要的任意html内容 -->
     </div> 
     <!--Second Slide-->
     <div class="swiper-slide"> 
     <!-- Any HTML content of the second slide goes here -->
     </div> 
     <!--Third Slide-->
     <div class="swiper-slide"> 
     <!-- Any HTML content of the third slide goes here -->
     </div> 
     <!--Etc..-->
     </div>
    </div>

    打开 idangerous.swiper.css ,在文件最后修改Swiper’s 的宽和高

    /* Specify Swiper's Size: */
    .swiper-container, .swiper-slide {
     width: 500px;
     height: 200px;
    }

    写入JS,初始化插件

    <script type="text/javascript">
    /*======
    Use document ready or window load events
    For example:
    With jQuery: $(function() { ...code here... })
    Or window.onload = function() { ...code here ...}
    Or document.addEventListener('DOMContentLoaded', function(){ ...code here... }, false)
    =======*/
    //无jquery
    window.onload = function() {
     var mySwiper = new Swiper('.swiper-container',{
     //Your options here:
     mode:'horizontal',
     loop: true
     //etc..
     }); 
    }
     
    /*
    使用jquery
    */
    $(function(){
     var mySwiper = $('.swiper-container').swiper({
     //Your options here:
     mode:'horizontal',
     loop: true
     //etc..
     });
    })
     
    </script>

    函数

    • mySwiper.disableMousewheelControl()– 关闭鼠标滚轮控制
    • mySwiper.enableMousewheelControl()– 开启鼠标滚轮控制
    • mySwiper.enableKeyboardControl()– 开启按键控制
    • mySwiper.disableKeyboardControl()– 关闭按键控制
    • mySwiper.swipeNext()– 变形到下一个slide
    • mySwiper.swipePrev() – 变形到上一个slide
    • mySwiper.swipeTo(index, speed, runCallbacks) – 跳转到index值的slide,speed为跳转的速度,runCallbacks为跳转后回调的涵数
    • mySwiper.browser.ie10 – 如果是IE10返回true
    • mySwiper.browser.ie8 – 如果是IE8返回true
    • mySwiper.support.touch –如果支持触屏事件返回true
    • mySwiper.support.transforms -如果支持CSS3变型返回true
    • mySwiper.support.transforms3d – 如果支持CSS3 3D变型返回true
    • mySwiper.support.transitions – 如果支持CSS3返回true
    • mySwiper.activeSlide() – 返回当前slide的内容
    • mySwiper.clickedSlideIndex – 返回单击或触摸后的slide的index值. 便于 “onSlideTouch” 和”onSlideClick” 调用
    • mySwiper.clickedSlide – 返回单击或触摸后的slide的内容便于 “onSlideTouch” 和”onSlideClick” 调用.
    • mySwiper.activeIndex – 返回当前slide的index值.
    • mySwiper.activeLoopIndex – 在循环模式下返回当前slide的index值.
    • mySwiper.activeLoaderIndex – 在加载模式下返回当前slide的index值.
    • mySwiper.previousIndex – 返回上一个slide的index值.
    • mySwiper.startAutoplay() – 开始自动播放.
    • mySwiper.stopAutoplay() – 停止自动播放.
    • mySwiper.destroy( removeResizeEvent ) – 将删除所有附加事件侦听器
    • mySwiper.resizeFix() – 在slide改变大小窗口没有变时调用此函数.
    • mySwiper.reInit() – 初始化 Swiper. 用于动态添加或删除 slides.
    • mySwiper.width – 返回swiper容器的宽度
    • mySwiper.height – 返回swiper容器的高度
    • mySwiper.isTouched – 当触摸slide时返回true
    • mySwiper.positions -返对对象容器的x轴与y轴值
    • mySwiper.touches -返回对象的信息
    • mySwiper.params – 访问对象与传递的参数初始化.初始化后你可以重定义参数, 像mySwiper.params.speed=500
    • mySwiper.getWrapperTranslate(axis) – 返回对象容器的变形偏移量,像素为单位。 “translate”/offset (in px). “axis” – 为字符 “x”(横屏) 或 “y” (f直屏)
    • mySwiper.setWrapperTranslate(x,y,z) -手动给对象容器设定CSS3的转换数值,单位为像素
    • mySwiper.wrapperTransitionEnd(callback,permanent) – 自定义回调函数,在transitionEnd”事件后触发

     

     

    参数 类型 默认值 例子
    speed number 300 600
    eventTarget string ‘wrapper’ ‘container’
    autoplay number 5000
    autoplayDisableOnInteraction boolean true false
    autoplayStopOnLast boolean false true
    mode string ‘horizontal’ ‘vertical’
    loop boolean false true
    loopAdditionalSlides number 0 2
    loopedSlides number 1 2
    slidesPerView numberor’auto’ 1 4
    slidesPerViewFit boolean true false
    slidesPerGroup number 1 2
    calculateHeight boolean false true
    roundLengths boolean false true
    cssWidthAndHeight boolean false true
    updateOnImagesReady boolean true false
    releaseFormElements boolean true false
    watchActiveIndex boolean false true
    visibilityFullFit boolean false true
    autoResize boolean true false
    resizeReInit boolean false true
    DOMAnimation boolean true false
    resistance booleanor’100%’ true false
    noSwiping boolean false true
    preventLinks boolean true false
    preventLinksPropagation boolean false true
    initialSlide number 2 0
    useCSS3Transforms boolean true false
    Free Mode and Scroll Container
    freeMode boolean false true
    freeModeFluid boolean false true
    scrollContainer boolean false true
    momentumRatio number 1 2
    momentumBounce boolean true false
    momentumBounceRatio number 1 2
    Slides offset
    centeredSlides boolean false true
    offsetPxBefore number 0 100
    offsetPxAfter number 0 100
    offsetSlidesBefore number 0 2
    offsetSlidesAfter number 0 2
    Touch/mouse interactions
    touchRatio number 1 0.8
    simulateTouch boolean true false
    onlyExternal boolean false true
    followFinger boolean true false
    grabCursor boolean false true
    shortSwipes boolean true false
    longSwipesRatio number 0.5 0.3
    moveStartThreshold number false 100
    swipeToNext boolean true false
    swipeToPrev boolean true false
    Navigation
    keyboardControl boolean false true
    mousewheelControl boolean false true
    mousewheelControlForceToAxis boolean false true
    分页
    pagination string or HTML Element ‘.my-pagination’
    paginationClickable boolean false true
    paginationAsRange boolean true
    createPagination boolean true false
    Namespace
    wrapperClass string ‘swiper-wrapper’ ‘my-wrapper’
    slideClass string ‘swiper-slide’ ‘my-slide’
    slideActiveClass string ‘swiper-slide-active’ ‘my-active-slide’
    slideVisibleClass string ‘swiper-slide-visible’ ‘my-visible-slide’
    slideElement string ‘div’ ‘li’
    noSwipingClass string ‘swiper-no-swiping’ ‘stop-swiping’
    paginationElement string ‘span’ ‘div’
    paginationElementClass string ‘swiper-pagination-switch’ ‘my-switch’
    paginationActiveClass string ‘swiper-active-switch’ ‘my-active-switch’
    paginationVisibleClass string ‘swiper-visible-switch’ ‘my-visible-switch’
    回调
    queueStartCallbacks boolean false true
    queueEndCallbacks boolean false true
    onFirstInit function function(swiper){ do something }
    onInit function function(swiper){ do something }
    onSwiperCreated function function(swiper){ do something }
    onTouchStart function function(swiper){ do something }
    onTouchMove function function(swiper){ do something }
    onTouchEnd function function(swiper){ do something }
    onSlideReset function function(swiper){ do something }
    onSlideChangeStart function function(swiper, direction){ do something }
    onSlideChangeEnd function function(swiper, direction){ do something }
    onSlideNext function function(swiper){ do something }
    onSlidePrev function function(swiper){ do something }
    onSlideClick function function(swiper){ do something }
    onSlideTouch function function(swiper){ do something }
    onImagesReady function function(swiper){ do something }
    onMomentumBounce function function(swiper){ do something }
    onResistanceBefore function function(swiper,p){ do something }
    onResistanceAfter function function(swiper,p){ do something }
    onSetWrapperTransition function function(swiper, duration){ do something }
    onSetWrapperTransform function function(swiper, transform){ do something }
    $(document).ready(function(){
     var mySwiper = new Swiper('.swiper-container',{
     mode:'vertical',
     speed: 600, onSlideChangeStart: function(swiper){
     alert('Hello 1');
     }
     }); 
    });

    http://www.jqcool.net/jquery-swiper.html

    案例http://www.jqcool.net/demo/201412/jquery-swiper/

    http://pan.baidu.com/s/1sjPt3kD

    使用直接下载: http://pan.baidu.com/s/1i3hCxMH

  • jquery Deferred对象 延迟对象

    回调 函数

    一,什么是deferred对象?

    开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们都不是立即能得到结果的。
    通常的做法是,为它们指定回调函数(callback)。即事先规定,一旦它们运行结束,应该调用哪些函数。
    但是,在回调函数方面,jQuery的功能非常弱。为了改变这一点,jQuery开发团队就设计了deferred对象。

    简单说,deferred对象就是jQuery的回调函数解决方案。

    它解决了如何处理耗时操作的问题,对那些操作提供了更好的控制,以及统一的编程接口。它的主要功能,可以归结为四点。下面我们通过示例代码,一步步来学习。

    二、ajax操作的链式写法

    首先,回顾一下jQuery的ajax操作的传统写法:

    $.ajax({
        url: "test.html",
        success: function(){
          alert("哈哈,成功了!");
        },
        error:function(){
          alert("出错啦!");
        }
      });

    $.ajax()操作完成后,如果使用的是低于1.5.0版本的jQuery,返回的是XHR对象,你没法进行链式操作;如果高于1.5.0版本,返回的是deferred对象,可以进行链式操作,要使用Deferred对象一定要支持1.5以上版本。

    $.ajax("test.html")
    .done(function(){ alert("哈哈,成功了!"); })
    .fail(function(){ alert("出错啦!"); });

    可以看到,done()相当于success方法,fail()相当于error方法。采用链式写法以后,代码的可读性大大提高。

    三、指定同一操作的多个回调函数

    deferred对象的一大好处,就是它允许你自由添加多个回调函数。
    还是以上面的代码为例,如果ajax操作成功后,除了原来的回调函数,我还想再运行一个回调函数,怎么办?
    很简单,直接把它加在后面就行了。

    $.ajax("test.html")
      .done(function(){ alert("哈哈,成功了!");} )
      .fail(function(){ alert("出错啦!"); } )
      .done(function(){ alert("第二个回调函数!");} );

    回调函数可以添加任意多个,它们按照添加顺序执行。

     

    四、$.when()为多个操作指定回调函数

    deferred对象的另一大好处,就是它允许你为多个事件指定一个回调函数,这是传统写法做不到的。

    $.when($.ajax("test1.html"), $.ajax("test2.html"))
      .done(function(){ alert("哈哈,成功了!"); })
      .fail(function(){ alert("出错啦!"); });

    这段代码的意思是,先执行两个操作$.ajax(“test1.html”)和$.ajax(“test2.html”),如果都成功了,就运行done()指定的回调函数;如果有一个失败或都失败了,就执行fail()指定的回调函数。

    五、普通操作的回调函数接口(上)

    deferred对象的最大优点就是为那些没有自带回调功能的函数,添加回调功能。

    我们来看一个具体的例子。假定有一个很耗时的操作wait:

    var wait = function(){
        var tasks = function(){
          alert("执行完毕!");
        };
        setTimeout(tasks,5000);
    };

    我们为它指定回调函数,应该怎么做呢?
    很自然的,你会想到,可以使用$.when():

    $.when(wait())
      .done(function(){ alert("哈哈,成功了!"); })
      .fail(function(){ alert("出错啦!"); });

    但是,这样写的话,done()方法会立即执行,起不到回调函数的作用。原因在于$.when()的参数只能是deferred对象,所以必须返回deferred对象

    var dtd = $.Deferred(); // 新建一个deferred对象
      var wait = function(dtd){
        var tasks = function(){
          alert("执行完毕!");
          dtd.resolve(); // 改变deferred对象的执行状态,未完成也一样执行done()
        };
        setTimeout(tasks,5000);
        return dtd; //目的要让wait()返回的是deferred对象不然就不能在$.when()下使用
      };

    现在,wait()函数返回的是deferred对象,这就可以加上链式操作了。

    $.when(wait(dtd))
      .done(function(){ alert("哈哈,成功了!"); })
      .fail(function(){ alert("出错啦!"); });

    wait()函数运行完,就会自动运行done()方法指定的回调函数。

    六、deferred.resolve()方法和deferred.reject()方法

    将”未完成”状态归类于done()方法还是fail()方法去执行。

    deferred对象有三种执行状态:未完成已完成已失败

    在1.5.0版本以上$.ajax返回的是deferred对象,deferred对象会根据返回结果,自动改变自身的执行状态,但是,在wait()函数中,这个执行状态必须由程序员手动指定。dtd.resolve()的意思是,将dtd对象的执行状态从”未完成”改为”已完成”,从而触发done()方法。

    类似的,还存在一个deferred.reject()方法,作用是将dtd对象的执行状态从”未完成”改为”已失败”,从而触发fail()方法。

    var dtd = $.Deferred(); // 新建一个Deferred对象
      var wait = function(dtd){
        var tasks = function(){
          alert("执行完毕!");
          dtd.reject(); // 改变Deferred对象的执行状态,未完成执行fail()方法
        };
        setTimeout(tasks,5000);
        return dtd;
      };
      $.when(wait(dtd))
      .done(function(){ alert("哈哈,成功了!"); })
      .fail(function(){ alert("出错啦!"); });

    ——————————————————————————-

    以上例子代码,可以在外界修改Deferred对象的执行状态存在缺陷,如:

    var dtd = $.Deferred(); // 新建一个Deferred对象
      var wait = function(dtd){
        var tasks = function(){
          alert("执行完毕!");
          dtd.resolve(); // 改变Deferred对象的执行状态
        };
        setTimeout(tasks,5000);
        return dtd;
      };
      $.when(wait(dtd))
      .done(function(){ alert("哈哈,成功了!"); })
      .fail(function(){ alert("出错啦!"); });
      dtd.resolve();//突然加了一条,wait()回调功能就失效。

    解决以上方法有4种:

    1,deferred.promise()方法就是为了解决以上问题

    var dtd = $.Deferred(); // 新建一个Deferred对象
      var wait = function(dtd){
        var tasks = function(){
          alert("执行完毕!");
          dtd.resolve(); // 改变Deferred对象的执行状态
        };
           setTimeout(tasks,5000);
        return dtd.promise(); // 返回promise对象
      };
      var d = wait(dtd); // 新建一个d对象,改为对这个对象进行操作
      $.when(d)
      .done(function(){ alert("哈哈,成功了!"); })
      .fail(function(){ alert("出错啦!"); });
      d.resolve(); // 此时,这个语句是无效的

    在上面的这段代码中,wait()函数返回的是promise对象。然后,我们把回调函数绑定在这个对象上面,而不是原来的deferred对象上面。这样的好处是,无法改变这个对象的执行状态,要想改变执行状态,只能操作原来的deferred对象
    不过,更好的写法是allenm所指出的。

    2,将dtd对象变成wait()函数的内部对象。

    var wait = function(dtd){
        var dtd = $.Deferred(); //在函数内部,新建一个Deferred对象
        var tasks = function(){
          alert("执行完毕!");
          dtd.resolve(); // 改变Deferred对象的执行状态
        };
           setTimeout(tasks,5000);
        return dtd.promise(); // 返回promise对象
      };
      $.when(wait())
      .done(function(){ alert("哈哈,成功了!"); })
      .fail(function(){ alert("出错啦!"); });

    3,直接把需要有回调功能的函数传入到$.Deferred()(个人推荐这种写法)

    var wait = function(dtd){ //将代码写在一个function中防止外面随意可以修改里面的代码
          var dtd = $.Deferred(); //在函数内部,新建一个Deferred对象
          var tasks = function(){
    
            $('#test').css('background','red');//给 css()添加一个回调, 假如这个就是我们一堆逻辑代码,为逻辑代码完成后添加回调
    
            dtd.resolve(); // 修改$.Deferred()状态为成功,这样才能触发done成功回调
          };
         tasks();
         return dtd.promise(); // 返回promise对象,这样才能使用在$.when这样的函数中也才能使用done,fail等其他回调,防止外面随意修改$.Deferred()状态
    };
    
     $.when(wait()) //$.when能执行返回来promise对象的函数,所以$.ajax也能在$.when里面执行$.ajax返回的就是promise对象
        .done(function(){ alert("哈哈,成功了!"); }) //成功之后的回调
        .fail(function(){ alert("出错啦!"); });//失败之后的回调

    jQuery规定,$.Deferred()里面的参数只能是函数名:例如$.Deferred(wait),而不是

    $.Deferred(wait())。

    4,直接在wait对象上部署deferred接口

     var dtd = $.Deferred(); // 生成Deferred对象
      var wait = function(dtd){
        var tasks = function(){
          alert("执行完毕!");
          dtd.resolve(); // 改变Deferred对象的执行状态
        };
        setTimeout(tasks,5000);
      };
      dtd.promise(wait); //相当于wait上添加了deferred接口这样就能直接使用.done().fail()
      wait.done(function(){ alert("哈哈,成功了!"); })
      .fail(function(){ alert("出错啦!"); });
      wait(dtd);  //开始执行。

    这里的关键是dtd.promise(wait)这一行,它的作用就是在wait对象上部署Deferred接口。正是因为有了这一行,后面才能直接在wait上面调用done()和fail()。

     

     

    小结:deferred对象的方法

    前面已经讲到了deferred对象的多种方法,下面做一个总结:

      (1) $.Deferred() 返回一个deferred对象。

      (2) deferred.done() 指定操作成功时的回调函数

      (3) deferred.fail() 指定操作失败时的回调函数

      (4) deferred.promise() 没有参数时,返回一个新的deferred对象,该对象的运行状态无法被改变;接受参数时,作用为在参数对象上部署deferred接口。

      (5) deferred.resolve() 手动改变deferred对象的运行状态为”已完成”,从而立即触发done()方法。

      (6)deferred.reject() 这个方法与deferred.resolve()正好相反,调用后将deferred对象的运行状态变为”已失败”,从而立即触发fail()方法。

      (7) $.when() 为多个操作指定回调函数。

    除了这些方法以外,deferred对象还有二个重要方法,上面的教程中没有涉及到。

      (8)deferred.then()

    有时为了省事,可以把done()和fail()合在一起写,这就是then()方法。

    $.when($.ajax( "/main.php" )).then(successFunc, failureFunc );

    如果then()有两个参数,那么第一个参数是done()方法的回调函数,第二个参数是fail()方法的回调方法。如果then()只有一个参数,那么等同于done()。

    *注意then()如果有返回数据后面链接done()就可以接受数据,例如:

    //以下结果是在jQuery 1.8版本之后
    
    $.when($.ajax( "/main.php" )).then(function(a){
      return a; //这里的a是上个$.when返回的数据
    }).done(function(a){
      console.log(a);  //这里接收的a是上个then返回的
    });
    
    
    案例二:
     var defer = jQuery.Deferred();
     defer.done(function(a,b){
        return a * b; //done 不能返回数据跟done
     }).done(function( result ) {
        console.log("result1 = " + result); //2 done不能返回数据跟done,所以第一个参数还是2
     }).then(function( a, b ) {
        return a * b; //then能返回数据给done
     }).done(function( result ) {
        console.log("result2 = " + result); //6 6,结果是then返回来的
     }).then(function( a, b ) { // then 能返回数据给then ,第一个参数是上一个then返回来的,第二个没有
        return a * b;
     }).done(function( result ) {
        console.log("result3 = " + result); //NAN
     });
     defer.resolve( 2, 3 );
    
    结论:
    then能传值给done
    then能传值给then
    
    done不能传值给done
    done不能传值给then

     

    (9)deferred.always()

    这个方法也是用来指定回调函数的,它的作用是,不管调用的是deferred.resolve()还是deferred.reject(),最后总是执行。

    $.ajax( "test.html" )
      .always( function() { alert("已执行!");} );

    (10)deferred.progress() / deferred.notify()

    deferred.progress(function(e){  //定义一个回调函数
       //alert(e)
    })
    deferred.notify('哈哈')  //调用此回调函数

    一个显示input填表的进度案例

    案例效果:https://sdeno.com/wp-content/uploads/2016/06/ceshi.html

    http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html

  • undefined与null的区别

    什么情况下给变量赋值null?

    var car=null;
    alert(typeof car);  //object

    也就是说意图将一个变量赋值成一个对象的时候,但是又没想到要怎么去写可以先暂时将变量的类型转化为object。

     

    除了以上情况下使用null,其他情况就使用undefined,书籍上没有给具体什么情况下时候,我们也就知道在为定义了一个变量但未赋值,变量默认就赋值了undefined。

    undefined 实际上是从值 null 派生来的,也就是说null是爸爸undefined是儿子。

    alert(undefined==null);  //true