JavaScript的window.onload和jQuery的$(document).ready()方法之间有什么区别?

评论

没有jQuery的$(document).ready等效副本的可能副本

这里的大多数答案都是过时的。 jQuery当前实现$()。ready()的方式使其有时在window.onload之后触发。

备注:$(window).on('load',function(){});相当于jQuery的window.onload

#1 楼

ready事件是在HTML文档加载后发生的,而onload事件是在后来也加载了所有内容(例如图像)的情况下发生的。

onload事件是DOM中的标准事件,而ready事件是特定于jQuery的。 ready事件的目的是应在文档加载后尽早发生,以便为页面中的元素添加功能的代码不必等待所有内容加载。

评论


@baptx:你错了。 ready事件特定于jQuery。如果它在浏览器中可用,则使用DOMContentLoaded事件,否则它将模拟它。 DOM中没有完全等效的对象,因为并非所有浏览器都支持DOMContentLoaded事件。

–古法
2012年5月19日在21:45

好的,但是DOMContentLoaded存在相同的结果,也许您应该已经指定了

–baptx
2012年5月19日在21:51



@baptx:我认为这与问题无关,但我仍然没有。

–古法
2012年5月19日在22:07

为什么要投票?如果您不解释自己认为是错的是什么,那么它就无法改善答案。

–古法
2014年3月7日在12:53

没有诸如onload之类的事件。 onload是对象属性的名称,该属性存储在触发加载事件时要调用的函数。

–斯科特·马库斯(Scott Marcus)
16-3-13在15:22

#2 楼

window.onload是内置的JavaScript事件,但是由于其实现在浏览器(Firefox,Internet Explorer 6,Internet Explorer 8和Opera)之间存在细微的怪癖,因此jQuery提供了document.ready,它将这些抽象化,并在页面的DOM出现时立即触发准备就绪(不等待图像等)。

$(document).ready(请注意,它不是document.ready,它是未定义的)是一个jQuery函数,包装并为以下事件提供一致性:



document.ondomcontentready / document.ondomcontentloaded-一个新事件,该事件在加载文档的DOM时触发(可能要在加载图像等之前一段时间);再次,在Internet Explorer和世界其他地方与
window.onload(甚至在旧的浏览器中也实现了)稍有不同,q4312079q在整个页面加载(图像,样式等)时会触发


评论


这里有一个轻微的误解:窗口的加载事件在浏览器之间合理地一致地实现。 jQuery和其他库正在尝试解决的问题就是您提到的问题,即在加载所有依赖资源(例如图像和样式表)之前不会触发load事件,这可能是在完全加载DOM之后的很长时间,渲染并准备进行交互。 DOM准备就绪时,在大多数浏览器中触发的事件称为DOMContentLoaded,而不是DOMContentReady。

– Tim Down
2010-09-13在8:31

@Tim Down:这里的关键词很合理;至少有一些对象嗅探曾经是必需的,即使在onload情况下(FF / IE / Opera也有所不同)。至于DOMContentLoaded,则完全正确。编辑以澄清。

– Piskvor离开了建筑物
2010-09-13 8:44

您的嗅探对象是什么意思?

– Tim Down
2010-09-13 8:55

@Tim Down:我知道Opera拥有它,但是它的事件触发有点古怪(要可靠地触发,document.onload可用)。就window.onload而言:window.onload = fn1; window.onload = fn2; -只有fn2会在加载时被调用。一些免费的虚拟主机将自己的代码插入文档中,有时这会破坏页内代码。

– Piskvor离开了建筑物
2010-09-13 11:06

写“ document.ready”不正确吗? document对象没有ready方法,而jQuery对象则是从$(document)调用返回的。如果我是对的,请编辑此答案,因为这很令人困惑。

– A. Sallai
2014年3月6日在9:10

#3 楼

$(document).ready()是一个jQuery事件。 DOM准备就绪后,就会立即调用JQuery的$(document).ready()方法(这意味着浏览器已解析HTML并构建了DOM树)。这使您可以在准备好操作文档后立即运行代码。

例如,如果浏览器支持DOMContentLoaded事件(就像许多非IE浏览器一样),则它将在该事件上触发。 (请注意,DOMContentLoaded事件仅在IE9 +中添加到IE中。)

为此可以使用两种语法:

$( document ).ready(function() {
   console.log( "ready!" );
});


或简写版本:

$(function() {
   console.log( "ready!" );
});


$(document).ready()的要点:


它不会等待图像加载。
用于在DOM完全加载后执行JavaScript。将事件处理程序放在此处。
可以多次使用。
当收到“未定义$”时,将$替换为jQuery
如果要操作图像,则不使用。请改用$(window).load()

window.onload()是本机JavaScript函数。加载页面上的所有内容(包括DOM(文档对象模型),横幅广告和图像)后,将触发window.onload()事件。两者之间的另一个区别是,虽然我们可以有多个$(document).ready()函数,但我们只能有一个onload函数。

评论


重点:关于IE的讨论措辞不佳。在文档的readyState完成之前,并不是IE(8及更高版本)“无法安全启动”,而是IE缺少DOMContentLoaded事件。并非“安全”问题,而是IE 9中添加的IE中缺少的功能。

–ToolmakerSteve
2014年8月12日,0:36



您是正确的,因此我编辑了答案以反映您的评论和感谢!

–詹姆斯·迪克特(James Drinkard)
15年5月13日在22:42

您说“它将不等待图像加载。” JS最重要的是其他文件呢?通常在从另一个文件调用函数之前-我需要知道它是否已加载。

– Darius
2015年8月12日9:35



这完全是另一个主题,但是如果我理解您的要求,它是基于页面的结构方式,包括js文件的放置顺序。这是一个更详细的链接:ablogaboutcode.com/2011/06/14/…HTH,詹姆斯

–詹姆斯·迪克特(James Drinkard)
15年8月12日在14:34

为什么有人要多次使用$(document).ready()?

–乌斯曼
16年1月12日在19:34

#4 楼

当页面上的所有内容(包括DOM(文档对象模型)内容以及异步JavaScript,框架和图像)完全加载时,将触发Windows加载事件。您也可以使用body onload =。两者是相同的; window.onload = function(){}<body onload="func();">是使用同一事件的不同方式。

jQuery $document.ready函数事件的执行要比window.onload早一些,并且一旦将DOM(文档对象模型)加载到页面上便被调用。它不会等待图像和框架完全加载。

摘自以下文章:
$document.ready()window.onload()有何不同

评论


我认为这是最好的答案!

–陈浩宇
2015年11月8日在20:56

我可能会同意,如果没有逐字复制的话。

–凯文B
16 Jun 30'在18:28



#5 楼

提示:

始终使用window.addEventListener向窗口添加事件。因为这样,您可以在不同的事件处理程序中执行代码。

正确的代码:




 window.addEventListener('load', function () {
  alert('Hello!')
})

window.addEventListener('load', function () {
  alert('Bye!')
}) 





无效的代码:




 window.onload = function () {
  alert('Hello!') // it will not work!!!
}

window.onload = function () {
  alert('Bye!') 
} 





这是因为onload只是对象的属性,将被覆盖。

addEventListener相似,最好使用$(document).ready()而不是onload。

评论


这不能回答所问的问题。

–user4639281
18/12/13在3:49

#6 楼




 $(document).ready(function() {

    // Executes when the HTML document is loaded and the DOM is ready
    alert("Document is ready");
});

// .load() method deprecated from jQuery 1.8 onward
$(window).on("load", function() {

     // Executes when complete page is fully loaded, including
     // all frames, objects and images
     alert("Window is loaded");
}); 

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 




#7 楼

关于在Internet Explorer中使用$(document).ready()的警告。如果在加载整个文档之前中断了HTTP请求(例如,当页面正在流式传输到浏览器时,单击了另一个链接),IE将触发$(document).ready事件。

如果$(document).ready()事件中的任何代码引用DOM对象,则可能找不到这些对象,并且可能会发生Javascript错误。要么保护您对那些对象的引用,要么延迟将那些对象引用到window.load事件的代码。

我无法在其他浏览器(特别是Chrome和Firefox)中重现此问题。

评论


哪个版本的IE?我知道我应该关心兼容性,但是使用IE很难。使用document.ready仅用于JavaScript是否可以接受?

–莫妮卡
13年1月3日在20:04

IE6、7和8。请参阅:stackoverflow.com/questions/13185689/…

–詹姆斯·迪克特(James Drinkard)
13年2月12日在15:01

#8 楼

$(document).ready()是一个jQuery事件,当HTML文档已完全加载时发生,而window.onload事件则稍后发生,当所有内容(包括页面上的图像)都加载时。

window.onload也是纯JavaScript事件。在DOM中,而$(document).ready()事件是jQuery中的一种方法。

$(document).ready()通常是jQuery的包装程序,以确保所有已加载的元素都将在jQuery中使用...

查看jQuery源代码以了解其工作原理:

jQuery.ready.promise = function( obj ) {
    if ( !readyList ) {

        readyList = jQuery.Deferred();

        // Catch cases where $(document).ready() is called after the browser event has already occurred.
        // we once tried to use readyState "interactive" here, but it caused issues like the one
        // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
        if ( document.readyState === "complete" ) {
            // Handle it asynchronously to allow scripts the opportunity to delay ready
            setTimeout( jQuery.ready );

        // Standards-based browsers support DOMContentLoaded
        } else if ( document.addEventListener ) {
            // Use the handy event callback
            document.addEventListener( "DOMContentLoaded", completed, false );

            // A fallback to window.onload, that will always work
            window.addEventListener( "load", completed, false );

        // If IE event model is used
        } else {
            // Ensure firing before onload, maybe late but safe also for iframes
            document.attachEvent( "onreadystatechange", completed );

            // A fallback to window.onload, that will always work
            window.attachEvent( "onload", completed );

            // If IE and not a frame
            // continually check to see if the document is ready
            var top = false;

            try {
                top = window.frameElement == null && document.documentElement;
            } catch(e) {}

            if ( top && top.doScroll ) {
                (function doScrollCheck() {
                    if ( !jQuery.isReady ) {

                        try {
                            // Use the trick by Diego Perini
                            // http://javascript.nwbox.com/IEContentLoaded/
                            top.doScroll("left");
                        } catch(e) {
                            return setTimeout( doScrollCheck, 50 );
                        }

                        // detach all dom ready events
                        detach();

                        // and execute any waiting functions
                        jQuery.ready();
                    }
                })();
            }
        }
    }
    return readyList.promise( obj );
};
jQuery.fn.ready = function( fn ) {
    // Add the callback
    jQuery.ready.promise().done( fn );

    return this;
};


我还创建了下面的图像作为两者的快速参考:



#9 楼

事件

$(document).on('ready', handler)绑定到jQuery中的ready事件。加载DOM时将调用处理程序。图像之类的资产可能仍然缺失。如果文档在绑定时准备就绪,则永远不会调用它。 jQuery为此使用DOMContentLoaded-Event,如果不可用则对其进行仿真。现在已加载图像。尽管onload是一个原始HTML事件,但ready是由jQuery构建的。

函数

$(document).on('load', handler)实际上是一个承诺。如果在调用时准备好文档,则将立即调用该处理程序。否则它将绑定到$(document).ready(handler) -Event。

在jQuery 1.8之前,ready作为$(document).load(handler)的别名存在。

进一步阅读


计时
关于功能就绪的信息
示例
承诺
已删除的事件别名


评论


您能解释一下$(document).load(handler)的行为与绑定到load-event的行为相同。与$ .fn.ready不同,它不会立即通过?

– Nabeel Khan
16年1月27日,下午2:21

我认为您对$ .fn.load感到困惑,因为它不再充当事件绑定器。实际上,它自jquery 1.8起就已过时。我据此更新了

–摘要
16年1月27日,11:05

#10 楼

window.onload:一个正常的JavaScript事件。

document.ready:当整个HTML加载完毕后的特定jQuery事件。

#11 楼

当所有元素都放置到位时,将触发Document.ready(一个jQuery事件),并且可以在JavaScript代码中引用它们,但是不必加载内容。在加载HTML文档时执行Document.ready

$(document).ready(function() {

    // Code to be executed
    alert("Document is ready");
});


但是window.load将等待页面完全加载。这包括内部框架,图像等。

$(window).load(function() {

    //Fires when the page is loaded completely
    alert("window is loaded");
});


#12 楼

要记住的一件事(或者我应该说回想)是,您不能像使用onload那样堆叠ready。换句话说,jQuery magic在同一页面上允许多个ready,但是您不能使用onload做到这一点。

最后一个onload将推翻所有先前的onload s。


function addLoadEvent(func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = func;
    }
    else {
        window.onload = function() {
            if (oldonload) {
                oldonload();
            }
            func();
        }
    }
}

// Example use:
addLoadEvent(nameOfSomeFunctionToRunOnPageLoad);
addLoadEvent(function() {
  /* More code to run on page load */
});


#13 楼

当已加载HTML文档时,将发生document.ready事件,并且在所有内容(图像等)均已加载时,将始终在以后发生window.onload事件。

如果您要使用document.ready事件,则可以使用想要在渲染过程中“尽早”干预,而无需等待图像加载。
如果您需要在脚本“执行某些操作”之前准备好图像(或其他“内容”),则需要等到window.onload。例如,如果要实现“幻灯片放映”模式,并且需要根据图像大小执行计算,则可能要等到window.onload。否则,您可能会遇到一些随机问题,具体取决于图像加载的速度。您的脚本将与加载图像的线程同时运行。如果脚本足够长,或者服务器足够快,那么如果图像恰好及时到达,您可能不会注意到问题。但是最安全的做法是允许加载图像。

document.ready对于向用户显示一些“正在加载...”标志可能是一个不错的事件,并且在window.onload上,您可以完成任何操作脚本,其中需要加载资源,然后最终删除“ Loading ...”符号。

示例:-

// document ready events
$(document).ready(function(){
     alert("document is ready..");
})

// using JQuery
$(function(){
   alert("document is ready..");
})

// window on load event
function myFunction(){
  alert("window is loaded..");
}
window.onload = myFunction;


#14 楼

window.onload是JavaScript的内置函数。加载HTML页面时触发window.onloadwindow.onload只能写一次。

document.ready是jQuery库的功能。当HTML和HTML文件中包含的所有JavaScript代码,CSS和图像完全加载时,会触发document.ready
根据需要,可以多次写入document.ready

评论


“ window.onload是一个函数”是不正确的,因为@Илья-Зеленько演示了它是一个属性而不是一个函数。详细信息:developer.mozilla.org/zh-CN/docs/Web/API/GlobalEventHandlers/…而.ready()是一个函数,需要一个处理程序。

–vik
18年11月29日在19:16



#15 楼

当您说$(document).ready(f)时,您告诉脚本引擎执行以下操作:


获取对象文档并将其推送,因为它不在本地范围内,因此必须进行哈希表查找才能找到
找到对象$并选择它,因为它不在本地范围内,因此必须进行哈希表查找,这可能会或可能不会发生冲突。
在全局范围内找到对象f,这是另一个哈希表查找,或推入函数对象并对其进行初始化。
调用所选对象的ready,这涉及对所选对象的另一个哈希表查找以查找该方法并调用它。
完成。

在最佳情况下,这是2次哈希表查找,但这忽略了jQuery完成的繁重工作,其中$是所有对象的厨房接收器jQuery的可能输入,因此可能有另一个映射来调度查询以更正处理程序。

或者,您可以执行以下操作:
window.onload = function() {...}


它将在全局范围内找到对象窗口,如果对JavaScript进行了优化,它将知道自窗口以来未被更改,它已经具有选定的对象,因此无需执行任何操作。
将函数对象压入操作数堆栈。
通过执行哈希表查找来检查onload是否为属性

在最好的情况下,这需要一次哈希表查找,这是必需的,因为必须提取onload

理想情况下,jQuery会将其查询编译为可粘贴以执行jQuery想要的操作而无需运行时调度jQuery的字符串。这样,您可以选择像今天一样动态分配jquery。
jQuery将您的查询编译为纯JavaScript字符串,可以将其传递给eval以执行您想要的操作。
将结果2直接复制到您的代码中,并跳过eval的开销。


#16 楼

window.onload由DOM api提供,它说“在加载给定资源时触发load事件”。
”在文档加载过程结束时触发load事件。此时,所有对象文档中的所有内容都在DOM中,并且所有图像,脚本,链接和子框架均已加载完毕。“
DOM onload
但是在jQuery $(document).ready()中仅运行一次文档对象模型(DOM)页面已准备就绪,可以执行JavaScript代码。这不包括图像,脚本,iframe等。jquery ready事件
,因此jquery ready方法将比dom onload事件更早运行。