javascript - Jquery初始化困惑

标签 javascript jquery

现在,无论出于何种原因,原作者在初始化时做了一些事情,我不太明白。在我看来,这段代码是多余的:

            if (document.addEventListener) {
              document.addEventListener('DOMContentLoaded', init, false);
            }
            (function() {
              /*@cc_on
              try {
                document.body.doScroll('up');
                return init();
              } catch(e) {}
              /*@if (false) @*/
              if (/loaded|complete/.test(document.readyState)) return init();
              /*@end @*/
              if (!init.done) setTimeout(arguments.callee, 30);
            })();
            if (window.addEventListener) {
              window.addEventListener('load', init, false);
            } else if (window.attachEvent) {
              window.attachEvent('onload', init);
            }

            function init()
            {
                if (arguments.callee.done) return;
                arguments.callee.done = true;
                // do your thing
                //[...]
            }

这样做的目的是什么?还是废话?

最佳答案

代码确保 init() 函数被调用。

它将 init 函数绑定(bind)到事件监听器,这些事件监听器在加载 DOM 或页面时触发。

如果这些事件已经由readyState确定触发,那么它会直接调用init,否则它会每3​​0毫秒检查一次readyState。

        // Call init function when DOM is loaded
        if (document.addEventListener) {
          document.addEventListener('DOMContentLoaded', init, false);
        }

        // Immediately invoked function expression that calls init
        // function if doScroll method does not throw error.
        (function() {

          try {
            document.body.doScroll('up');
            return init();
          } catch(e) {}

          // Call init function if DOMContentLoaded event has already been
          // fired or if page is already loaded.
          if (/loaded|complete/.test(document.readyState)) return init();

          // arguments.callee is a reference to it's executing function
          // which is this immediately invoked function expression.
          // It will keep calling it every 30 milliseconds while init
          // has not been called yet.
          if (!init.done) setTimeout(arguments.callee, 30);
        })();


        // Call init function when window is loaded.
        // `load` event is fired after DOMContentReady, when
        // everything has loaded in the page.
        if (window.addEventListener) {
          window.addEventListener('load', init, false);

        // Same as above but for IE versions 8 or less
        } else if (window.attachEvent) {
          window.attachEvent('onload', init);
        }

        function init() {
            // If init has been called then immediately return.
            if (arguments.callee.done) return;

            // Set flag on itself to indicate that it init been called.
            arguments.callee.done = true;
            // do your thing
            //[...]
        }

关于javascript - Jquery初始化困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35591139/

相关文章:

javascript - Angularjs - 隐藏表格行

javascript - jquery this.id 不工作

javascript - 我们如何从 Javascript File 对象知道文件的内容?

javascript - 动态改变图像上的文本颜色

javascript - 在 jQuery 中使用页面 Url

javascript - 将 JSON 字符串加载到 highcharts 中的饼图中

相当于 PHP 的 strstr() 函数的 JavaScript 或 jQuery

javascript - Stripe.setPublishableKey 不是函数错误?

jQuery 循环 : How to change transition effect on a running slideshow

javascript - 如何以较少的 'clunky' 方式在 2 个 div 之间淡入淡出/混合