Создайте функцию наподобие jQuery (документ) .ready - PullRequest
2 голосов
/ 30 октября 2011

Как я могу это сделать?

Похоже, у вас может быть несколько функций jQuery ready (), и все они будут работать при загрузке DOM.

Так как я могу создать свою собственную функцию, похожую на ready ()? :)

Ответы [ 5 ]

3 голосов
/ 30 октября 2011
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!");});

Test => http://jsfiddle.net/vgraN/

3 голосов
/ 30 октября 2011

Во-первых, вам нужно определить, для чего вам нужна функция - она ​​должна реагировать на определенное событие браузера?

$(document).ready(fn) в jQuery использует массив для хранения функций, выполняемых, когдаDOM загрузил.Добавление нового вызова ready(fn) добавляет функцию fn к массиву.Когда DOM загружен (что определяется различными способами в зависимости от того, в каком браузере выполняется код), каждая функция в свою очередь выполняется в массиве.Любые функции, добавленные с помощью ready(fn) после загрузки DOM, выполняются немедленно.

Таким образом, вы можете использовать массив для хранения функций, которые будут выполняться в любое время.

Взгляните на domready , автономный порт функции ready(fn) от jQuery, чтобы получить некоторые идеи о том, как это сделать.

2 голосов
/ 30 октября 2011

Нелегко сделать кросс-браузер.

Если вы предполагаете, что событие DOMContentLoaded существует, вы можете просто сделать

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

  return function (cb) {
    cbs.push(cb);
  };
})();

Вы можете использовать другие запасные варианты, например window.onload и хакерскийПроверка прокрутки, как это делает jQuery.

Я бы порекомендовал либо использовать domready , либо читать источник.

2 голосов
/ 30 октября 2011

Звучит так, будто вы хотите создать массив функций и добавить к нему новые обратные вызовы.

1 голос
/ 30 октября 2011

Вы хотите создать функцию, которая при передаче функции будет вызывать эту функцию в определенное время?(Кроме того, его можно вызывать несколько раз.) Если это так, я бы так и сделал.(На основе кода 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...