我在“创业”事件中有点迷茫——有很多不同的事件,在DOM和各种框架(如jQuery)中被命名不同。所有可能的启动事件是什么?它们有什么区别?你能展示一个简单的时间线来说明这些事件的触发顺序吗?
我在“创业”事件中有点迷茫——有很多不同的事件,在DOM和各种框架(如jQuery)中被命名不同。所有可能的启动事件是什么?它们有什么区别?你能展示一个简单的时间线来说明这些事件的触发顺序吗?
参考:http://api.jquery.com/ready/
代码:
document.addEventListener("DOMContentLoaded", function (event) {
console.log("DOM fully loaded and parsed");
});
function load() {
console.log("load event detected!");
}
window.onload = load;
$(document).ready(function () {
console.log('ready');
});
$(window).load(function () {
console.log('loaded');
});
记录不同框架及其事件可能会很有趣:
这里是使用 jsFiddle 进行的测试系列。相同的 HTML,不同的框架,ms
的差异。
window.onload = function () {
var now = new Date().getTime() - time;
console.log(now, 'onload') // 14 ms
};
window.addEvent('load', function () {
var now = new Date().getTime() - time;
console.log(now, 'load') // 15 ms
});
window.addEvent('domready', function () {
var now = new Date().getTime() - time;
console.log(now, 'domready') // 1 ms
});
window.onload = function () {
var now = new Date().getTime() - time;
console.log(now, 'onload') // 20 ms
};
$(document).on('DOMContentLoaded', function () {
var now = new Date().getTime() - time;
console.log(now, 'DOMContentLoaded') // 10 ms
});
$(document).on('ready', function () {
var now = new Date().getTime() - time;
console.log(now, 'ready') // 20 ms
});
Dojo工具包
dojo.addOnLoad(function() {
//do stuff
});
YUI
YUI().use('*',function(Y) {
Y.on("domready", function() {
//do stuff
}, Y, "The DOMContentLoaded event fired. The DOM is now safe to modify via script.");
});
document.observe("dom:loaded", function() {
//do stuff
});
Sencha JS
Ext.onReady(function() {
//do stuff
});
>> function sample()
{
console.log('This is sample.');
$( document ).ready(function ()
{
console.log("Ready is working in all cases.")
});
}
undefined
最终结果是:
>> sample();
undefined
This is sample. debugger eval code:3:11
Ready is working in all cases. debugger eval code:7:13
>> sample();
undefined
This is sample. debugger eval code:3:11
Ready is working in all cases. debugger eval code:7:13
更好的做法是从您想要的功能和需要支持的浏览器的角度来思考。
在操作文档对象模型(DOM)之前,您必须确保HTML页面已经通过网络加载并解析为树形结构。一种解决方法是将所有代码写在HTML文件的末尾,在解析HTML后才会处理这些javascript代码。另一种较新的标准方法是监听DOMReady或DOMContentLoaded事件或ready事件,以确保处理程序只在DOM准备就绪后运行。
在DOM树构建完成后,浏览器将请求图像、音频、视频等资源。当所有这些资源都加载完毕时,将触发窗口的load事件,此时页面已准备好完全渲染。
因此,您应该考虑您的代码是否可以在DOM树准备就绪时执行,或者您是否需要加载所有内容才能运行代码。如果本地JavaScript实现的DOM ready未覆盖您需要支持的所有浏览器,则可以使用jQuery DOMready,这也是其存在的原因。