完成页面加载后执行函数

Nee*_*mar 99 html javascript image

我在页面加载后使用以下代码执行一些语句.

 <script type="text/javascript">
    window.onload = function () { 

        newInvite();
        document.ag.src="b.jpg";
    }
</script>
Run Code Online (Sandbox Code Playgroud)

但是这段代码不能正常工作.即使正在加载某些图像或元素,也会调用该函数.我想要的是调用页面完全加载的功能.

Shr*_*har 147

这可能适合你:

document.addEventListener('DOMContentLoaded', function() {
   // your code here
}, false);
Run Code Online (Sandbox Code Playgroud)

或者如果你对jquery的安慰,

$(document).ready(function(){
// your code
});
Run Code Online (Sandbox Code Playgroud)

$(document).ready()在DOMContentLoaded上触发,但是在浏览器中不会一致地触发此事件.这就是jQuery最有可能实现一些重要的解决方法来支持所有浏览器的原因.这将使得使用普通Javascript"完全"模拟行为变得非常困难(当然不是不可能的).

正如Jeffrey Sweeney和J Torres建议的那样,我认为setTimeout在解决下面这个函数之前更好地拥有一个函数:

setTimeout(function(){
 //your code here
}, 3000);
Run Code Online (Sandbox Code Playgroud)

  • jQuery的`ready`将不会执行OP请求的内容.`ready`在DOM加载时触发,而不是在元素加载后触发.元素完成加载/渲染后,`load`将触发. (12认同)
  • `setTimeout`是个坏主意.它依赖于3秒内的页面加载(或*n*秒,具体取决于您选择的值.)如果加载时间较长,则无法正常工作,如果页面加载速度较快,则必须无故等待. (9认同)
  • @shreedhar或者他可以使用正确的工具(`load`). (3认同)
  • @ChristianMatthew 其 [useCapture](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener) 如果为 true,则 useCapture 表示用户希望启动捕获。启动捕获后,指定类型的所有事件将被分派到注册的侦听器,然后再分派到 DOM 树中它下面的任何 EventTarget。通过树向上冒泡的事件不会触发指定使用捕获的侦听器。有关详细说明,请参阅 [DOM Level 3 Events](https://www.w3.org/TR/DOM-Level-3-Events/#event-flow)。 (2认同)

T.T*_*dua 42

A)使用普通的javascript:

document.addEventListener('readystatechange', event => {

    if (event.target.readyState === "interactive") {   //same as:  ..addEventListener("DOMContentLoaded".. and   jQuery.ready
        alert("All HTML DOM elements are accessible");
    }

    if (event.target.readyState === "complete") {
        alert("Now external resources are loaded too, like css,src etc... ");
    }

});
Run Code Online (Sandbox Code Playgroud)

B)使用jQuery:

$(function(){
    alert("hello");
});
Run Code Online (Sandbox Code Playgroud)

C)不要使用以下方法(使用ready标志):

document.onreadystatechange = function(){ alert("Hi"); }
Run Code Online (Sandbox Code Playgroud)

因为它会覆盖其他同类声明.

  • 这个是否支持跨浏览器 (2认同)

Jai*_*res 32

如果你可以使用jQuery,请查看load.然后,您可以将您的函数设置为在元素完成加载后运行.

例如,考虑一个包含简单图像的页面:

<img src="book.png" alt="Book" id="book" />
Run Code Online (Sandbox Code Playgroud)

事件处理程序可以绑定到图像:

$('#book').load(function() {
  // Handler for .load() called.
});
Run Code Online (Sandbox Code Playgroud)

如果需要加载当前窗口中的所有元素,则可以使用

$(window).load(function () {
  // run code
});
Run Code Online (Sandbox Code Playgroud)

  • 从JQuery v1.8开始,不推荐使用.load.[源(http://api.jquery.com/category/version/1.8/) (4认同)
  • jQuery `load` 方法不是只是使用 Javascript 将函数绑定到 load 事件吗?这与 OP 已经在做的事情有什么不同? (2认同)

Han*_*nif 23

我有点混淆你的意思是页面加载完成,"DOM加载"还是"内容加载"?在html页面中,load可以在两个类型事件之后触发事件.

  1. DOM加载:确保整个DOM树加载开始结束.但不能确保加载参考内容.假设您通过img标签添加了图像,因此此事件可确保所有已img加载但未正确加载图像.要获得此活动,您应该写下以下方式:

    document.addEventListener('DOMContentLoaded', function() {
       // your code here
    }, false);
    
    Run Code Online (Sandbox Code Playgroud)

    或者使用jQuery:

    $(document).ready(function(){
    // your code
    });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在DOM和内容加载之后:这也表示DOM和内容加载.它将确保不仅img标记它还将确保加载所有图像或其他相关内容.要获得此活动,您应该写下以下方式:

    window.addEventListener('load', function() {...})
    
    Run Code Online (Sandbox Code Playgroud)

    或者使用jQuery:

    $(window).on('load', function() {
     console.log('All assets are loaded')
    })
    
    Run Code Online (Sandbox Code Playgroud)

  • 这是唯一给出OP的非jQuery解决方案的答案,并有明确的解释 (2认同)

use*_*682 11

如果你想在你的html页面中调用js函数,请使用onload事件.当用户代理完成加载窗口或FRAMESET中的所有帧时,会发生onload事件.此属性可以与BODY和FRAMESET元素一起使用.

<body onload="callFunction();">
....
</body>
Run Code Online (Sandbox Code Playgroud)


Rya*_*ker 8

据我所知,你最好的选择是使用

window.addEventListener('load', function() {
    console.log('All assets loaded')
});
Run Code Online (Sandbox Code Playgroud)

使用DOMContentLoaded事件的 #1 答案是倒退,因为 DOM 将在所有资产加载之前加载。

其他答案推荐setTimeout我强烈反对,因为它完全取决于客户端的设备性能和网络连接速度。如果某人网络速度较慢和/或 CPU 速度较慢,则页面可能需要几秒到几十秒才能加载,因此您无法预测需要多长时间setTimeout

至于readystatechange,它会在任何readyState更改时触发,根据MDN仍将在load事件发生之前。

完全的

状态指示加载事件即将触发。


tsv*_*iko 7

这样你就可以处理这两种情况 - 如果页面已经加载了:

document.onreadystatechange = function(){
    if (document.readyState === "complete") {
       myFunction();
    }
    else {
       window.onload = function () {
          myFunction();
       };
    };
}
Run Code Online (Sandbox Code Playgroud)


小智 5

你可以这样尝试而不使用jquery

window.addEventListener("load", afterLoaded,false);
function afterLoaded(){
alert("after load")
}
Run Code Online (Sandbox Code Playgroud)