我开发Joomla网站/组件/模块和插件,有时需要使用在页面加载时触发事件的JavaScript。大多数情况下,可以使用window.onload
函数实现。
我的问题是:
- 这是触发页面加载时JavaScript事件的最佳方法吗?还是有更好/更新的方法?
- 如果这是触发页面加载上事件的唯一方法,那么如何确保由不同脚本运行的多个事件能够顺利执行?
我开发Joomla网站/组件/模块和插件,有时需要使用在页面加载时触发事件的JavaScript。大多数情况下,可以使用window.onload
函数实现。
我的问题是:
window.onload = function(){};
可以运行,但你可能已经注意到,它只允许你指定一个监听器。
我认为更好/更新的方法是使用框架,或者仅使用本地addEventListener
和attachEvent
(为IE)方法的简单实现,这样还可以删除事件的监听器。
以下是跨浏览器的实现:
// Cross-browser implementation of element.addEventListener()
function listen(evnt, elem, func) {
if (elem.addEventListener) // W3C DOM
elem.addEventListener(evnt,func,false);
else if (elem.attachEvent) { // IE DOM
var r = elem.attachEvent("on"+evnt, func);
return r;
}
else window.alert('I\'m sorry Dave, I\'m afraid I can\'t do that.');
}
// Use: listen("event name", elem, func);
对于window.onload情况,请使用:listen("load", window, function() { });
编辑 我想通过添加其他人指出的宝贵信息来扩展我的答案。
这涉及到DOMContentLoaded
(Mozilla,Opera和webkit夜间版目前支持此)和onreadystatechange
(用于IE)事件,可以应用于document对象以了解何时可以操纵文档(而无需等待所有图像/样式表等加载)。
有很多“hacky”实现来跨浏览器支持这一点,因此我强烈建议使用框架来实现此功能。
在多次创建时,window.onload 事件会被覆盖。要追加函数,请使用 window.addEventListener(W3C标准)或 window.attachEvent(适用于IE)。使用以下代码可以运行。
if (window.addEventListener) // W3C standard
{
window.addEventListener('load', myFunction, false); // NB **not** 'onload'
}
else if (window.attachEvent) // Microsoft
{
window.attachEvent('onload', myFunction);
}
Joomla带有MooTools,因此您会发现使用MooTools库来编写附加代码最为方便。MooTools带有一个自定义事件domready,当页面加载和文档树解析完成时会触发该事件。
window.addEvent( domready, function() { code to execute on load here } );
关于MooTools的更多信息可以在这里找到。Joomla 1.5目前使用MT1.1,而Joomla 1.6 alpha版本将包含MT1.2。
function load(){
*code*
}
window[ addEventListener ? 'addEventListener' : 'attachEvent' ]
( addEventListener ? 'load' : 'onload', function(){} )
onload
函数,而且如果某些脚本在您使用之前定义了它before,那么这种方法足够好以处理它... 剩下的唯一问题是,如果页面加载几个未使用 window.addLoad()
函数的脚本,则是他们的问题:)。由于我总是在文档底部包含jQuery/bootstrap JS文件,并且无法访问文档中的$
,因此我开发了一个微小的“init”插件,这是我在页面顶部包含的唯一JS脚本:
window.init = new function() {
var list = [];
this.push = function(callback) {
if (typeof window.jQuery !== "undefined") {
callback();
} else {
list.push(callback);
}
};
this.run = function() {
if (typeof window.jQuery !== "undefined") {
for(var i in list) {
try {
list[i]();
} catch (ex) {
console.error(ex);
}
}
list = [];
}
};
if (window.addEventListener) {
window.addEventListener("load", this.run, false);
} else if (window.attachEvent) {
window.attachEvent("onload", this.run);
} else {
if (window.onload && window.onload !== this.run) {
this.push(window.onload);
}
window.onload = this.run;
}
};
init.push(function() {
$('[name="date"]').datepicker({
endDate: '0d',
format: 'yyyy-mm-dd',
autoclose: true
}).on('hide', function() {
// $.ajax
});
$('[name="keyword_id"]').select2();
});
.ready()
函数:http://api.jquery.com/ready/ - James McCormack