我正在寻找绑定javascript事件的最合适有效的方法;特别是onload事件(我希望在页面和所有元素如图像加载之后发生事件)。我知道有很简单的方法可以在jQuery中执行此操作,但我希望使用更高效的原始javascript 方法。
答案 0 :(得分:34)
有两种不同的方法可以做到这一点。只有一个会起作用;哪一个取决于浏览器。这是一个使用两者的实用方法:
function bindEvent(element, type, handler) {
if(element.addEventListener) {
element.addEventListener(type, handler, false);
} else {
element.attachEvent('on'+type, handler);
}
}
在你的情况下:
bindEvent(window, 'load', function() {
// all elements such as images are loaded here
});
答案 1 :(得分:18)
我知道你只问过如何绑定事件。但是Ooooo男孩的乐趣并没有就此结束。获得这个正确的跨浏览器还有很多东西,而不仅仅是初始绑定。
@ d。的答案对于您正在寻找的load
window
事件的特定情况就足够了。但它可能会让新手读者对您的代码产生错误的“正确”感。仅仅因为你绑定了这个事件并不意味着你要注意将它标准化。你可能更好只是修复window.onload
:
window.onload = (function(onload) {
return function(event) {
onload && onload(event);
// now do your thing here
}
}(window.onload))
但是对于事件绑定的一般情况,@ d。的答案远远不能让人感到沮丧。关于它唯一正确的做法是使用特征检测而不是浏览器检测。
不要在这里进行过多的咆哮,但JavaScript事件绑定可能是 #1使用JavaScript库的原因。我不关心它是哪一个,其他人一遍又一遍地解决了这个问题。以下是处理器函数内的自酿实现中的问题:
event
对象本身?this
始终指向window
对象?relatedTarget
,例如blur
)currentTarget
)keydown
事件中获得奇怪的字符代码?列表继续......
在这些日子里推销自己的唯一理由是学习。那没关系。不过,请阅读PPK的Intro to browser events。看看jQuery source。看看Prototype source。你不会后悔的。
答案 2 :(得分:4)
像这样的东西
window.onload = (function(onload) {
return function(event) {
onload && onload(event);
$(".loading-overlay .spinner").fadeOut(300),
$(".loading-overlay").fadeOut(300);
$("body").css({
overflow: "auto",
height: "auto",
position: "relative"
})
}
}(window.onload));
答案 3 :(得分:2)
window.onload = function() {
// ...
};