创建一个像jQuery(document).ready这样的函数

时间:2011-10-30 15:41:15

标签: javascript jquery function

我该怎么做?

似乎你可以拥有多个jQuery的ready()函数,并且它们都将在加载DOM时运行。

那么如何创建自己的ready()函数呢? :)

5 个答案:

答案 0 :(得分:3)

首先,您需要确定您需要该功能的内容 - 它是否响应特定的浏览器事件?

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

总之,只要需要执行它们,就可以使用数组存储要执行的函数。

查看domready,jQuery的ready(fn)函数的独立端口,以获取有关如何进行此操作的一些想法。

答案 1 :(得分:3)

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!");});

测试=&gt; http://jsfiddle.net/vgraN/

答案 2 :(得分:2)

听起来你想要创建一系列函数并向它添加新的回调。

答案 3 :(得分:2)

跨浏览器并不容易。

如果您认为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或阅读来源。

答案 4 :(得分:1)

你想创建一个函数,当传递函数时会在特定时间调用该函数吗? (此外,它可以多次调用。)如果是这样,我就是这样做的。 (基于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.