这两天在看jQuery源码回调对象模块,因为jQuery.ready()是基于此来实现的,所以也回顾了一下ready函数。然后一直想不明白一个问题, 在bindReady()函数中
readyList = jQuery.Callbacks( "once memory" );
创建了一个带有'once memory'标志的回调对象,在回调对象中,once是表示只能fire一次,memory是有记忆功能,也就是说后面添加的回调函数会立即触发,并且是上一次fire时所调用的参数。但是在ready事件中,页面DOM加载完成才会触发ready,而DOM加载只会出现一次,也就是说 ready函数不会触发第二次,也自然不会fire两次,所以觉得once是没有必要的呀?希望了解的 回应一下,真的比较困惑。

解决方案 »

  1.   


    // Mozilla, Opera and webkit nightlies currently support this event
    if ( document.addEventListener ) {
    // Use the handy event callback
    document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); // A fallback to window.onload, that will always work
    window.addEventListener( "load", jQuery.ready, false ); // If IE event model is used
    } else if ( document.attachEvent ) {
    // ensure firing before onload,
    // maybe late but safe also for iframes
    document.attachEvent( "onreadystatechange", DOMContentLoaded ); // A fallback to window.onload, that will always work
    window.attachEvent( "onload", jQuery.ready ); ……
    }
    因为考虑到浏览器的兼容性,它绑定了DOMContentLoaded/onreadystatechange和load/onload 两个事件;
      

  2.   

    回复 #1:
    因为是配合着高云 jQuery技术内幕来看的,所以就拿jQuery1.7.2版本来分析的
      

  3.   

    回复#2:那也就是说: 触发了DOMContentLoaded,再触发load事件时,就不会fire了,也就是不会执行回调函数了?
      

  4.   

    你可以把once 删了 测试下效果
      

  5.   

    试过了,主要是 once memory 都删了,也同样只执行一次