我该怎么做?
似乎你可以拥有多个jQuery的ready()函数,并且它们都将在加载DOM时运行。
那么如何创建自己的ready()函数呢? :)
答案 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.