【问题标题】:Create a function like jQuery(document).ready创建一个类似 jQuery(document).ready 的函数
【发布时间】:2011-10-30 15:41:15
【问题描述】:

我该怎么做?

看来你可以有多个 jQuery 的 ready() 函数,它们都会在 DOM 加载时运行。

那么我怎样才能创建我自己的类似 ready() 的函数呢? :)

【问题讨论】:

标签: javascript jquery function


【解决方案1】:
function _addEvent(e, evt, handler){
    if(evt == "ready")
        evt = "DOMContentLoaded";

    if(typeof handler !== 'function')return;
    if (e.addEventListener)
        e.addEventListener(evt, handler, false);
    else if (e.attachEvent)
        e.attachEvent("on" + evt, handler);
    else
    {
        var oldHandler = e["on" + evt];   
        function newHandler(event){
            handler.call(e, event);
            if(typeof oldhandler === 'function')oldhandler.call(e, event);
        }
    }
}
var _events = ["ready", "click", "mousedown"]; //...
var _myLib = function(item){
    function eventWorker(item, event){
        this.add = function(handler){
            _addEvent(item, event, handler);
        };
    }
    for(var i=0;i<_events.length;i++)
        this[_events[i]] = (new eventWorker(item, _events[i])).add;
};
var MyLib = function(item){
    return new _myLib(item);
};

MyLib(document).ready(function(){alert("I am ready!");});

测试 => http://jsfiddle.net/vgraN/

【讨论】:

  • 那是编译好的coffeescript吗?
  • 不,或者我不知道,或者我不明白:) 我自己写的只是为了回答
【解决方案2】:

首先,您需要确定您需要该函数的用途 - 是否响应特定的浏览器事件?

jQuery 的$(document).ready(fn) 在内部使用一个数组来保存要在 DOM 加载时执行的函数。添加新的ready(fn) 调用会将函数fn 附加到数组中。当 DOM 已加载时(根据代码在哪个浏览器中执行以各种方式检测到),依次执行数组中的每个函数。在 DOM 加载后使用 ready(fn) 添加的任何函数都会立即执行。

总而言之,您可以使用数组来存储要在需要执行时执行的函数。

看看domready,它是来自 jQuery 的 ready(fn) 函数的独立端口,以了解如何实现它。

【讨论】:

    【解决方案3】:

    听起来您想创建一个函数数组并向其附加新的回调。

    【讨论】:

      【解决方案4】:

      跨浏览器不容易。

      如果您假设 DOMContentLoaded 事件存在,那么您可以制作

      var domready = (function () {
        var cbs = [];
        document.addEventListener("DOMContentLoaded", function () {
          cbs.forEach(function (f) {
            f();
          });
        });
      
        return function (cb) {
          cbs.push(cb);
        };
      })();
      

      您可以使用 window.onload 之类的其他后备方法和 jQuery 之类的 hackish 滚动检查。

      我建议使用domready 或阅读源代码。

      【讨论】:

      • 如果你有addEventListener,你实际上并不需要一个数组,但是,浏览器会为你做。
      • @minitech 嗯,听一次事件会更有效率。
      【解决方案5】:

      你想创建一个函数,当传递一个函数时,它会在特定时间调用该函数? (此外,它可以被多次调用。)如果是这样,我会这样做。 (基于 jQuery 代码。)

      var funcQueue = (function () {
          var funcList = [];
      
          function runAll() {
            var len = funcList.length, 
                index = 0;
      
            for (; index < len; index++)
               funcList[index].call();  // you can pass in a "this" parameter here.
      
          }
      
          function add(inFunc) {
             funcList.push(inFunc);
          }
      
      })();
      

      使用方法:

         funcQueue.add(function () { alert("one"); });
         funcQueue.add(function () { alert("two"); });
      
      
         funcQueue.runAll();  // should alert twice.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        • 2015-11-12
        • 1970-01-01
        • 1970-01-01
        • 2014-01-13
        • 2010-12-11
        • 1970-01-01
        相关资源
        最近更新 更多