在页面完全加载后执行函数

174

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

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

        newInvite();
        document.ag.src="b.jpg";
    }
</script>

但是这段代码不起作用。即使有些图像或元素正在加载,该函数仍然被调用。我想要的是在页面完全加载后调用该函数。


1
你能在 http://JSFiddle.net 上添加一个演示吗? - Some Guy
2
你能使用jQuery吗?如果可以的话,请尝试使用$(window).load() - Matt Hintzke
1
是的,您能解释一下哪里出了问题吗?您是否遇到了错误,或者可能在窗口重新绘制之前调用了“alert”函数(使其看起来像在加载之前调用)?代码看起来很好,强制用户下载大型库可能无法解决此问题,也不会使诊断变得更容易。 - Jeffrey Sweeney
1
你如何确定图片没有加载?我通常通过检查图片的 width 是否大于0来进行测试。 - Jeffrey Sweeney
1
这个回答解决了你的问题吗?如何让JavaScript在页面加载后执行? - T.Todua
显示剩余5条评论
16个回答

1

我倾向于使用以下模式来检查文档是否完成加载。该函数返回一个 Promise(如果需要支持 IE,请包含polyfill),一旦文档完成加载就会解决。它在底层使用setInterval,因为类似的setTimeout实现可能会导致非常深的堆栈。

function getDocReadyPromise()
{
  function promiseDocReady(resolve)
  {
    function checkDocReady()
    {
      if (document.readyState === "complete")
      {
        clearInterval(intervalDocReady);
        resolve();
      }
    }
    var intervalDocReady = setInterval(checkDocReady, 10);
  }
  return new Promise(promiseDocReady);
}

当然,如果您不必支持IE:

const getDocReadyPromise = () =>
{
  const promiseDocReady = (resolve) =>
  {
    const checkDocReady = () =>
      ((document.readyState === "complete") && (clearInterval(intervalDocReady) || resolve()));
    let intervalDocReady = setInterval(checkDocReady, 10);
  }
  return new Promise(promiseDocReady);
}

通过该函数,您可以执行以下操作:

getDocReadyPromise().then(whatIveBeenWaitingToDo);

0

我可以告诉你,我找到的最好的答案是在</body>命令之后放置一个“驱动程序”脚本。这是最简单的方法,可能比上面的一些解决方案更通用。

计划:我的页面上有一个表格。我将带有表格的页面写出并输出到浏览器,然后使用JS对其进行排序。用户可以通过单击列标题重新排序。

在表格结束后使用</tbody>命令,并结束正文后,我使用以下行来调用排序JS以按第3列对表格进行排序。我从网上获取了排序脚本,因此此处不再重复。至少在未来的一年中,您可以在static29.ILikeTheInternet.com上看到它的运作,包括JS。单击页面底部的“此处”。这将带出另一个带有表格和脚本的页面。您可以看到它快速地展示数据然后进行排序。我需要稍微加快一下速度,但现在基础已经建立。

</tbody></body><script type='text/javascript'>sortNum(3);</script></html>

制造者麦克


-1
如果您已经在使用jQuery,您可以尝试这个:
$(window).bind("load", function() {
   // code here
});

5
没有解释就毫无意义。 - Daniel W.

-2

call a function after complete page load set time out

setTimeout(function() {
   var val = $('.GridStyle tr:nth-child(2) td:nth-child(4)').text();
 for(var i, j = 0; i = ddl2.options[j]; j++) {
  if(i.text == val) {      
   ddl2.selectedIndex = i.index;
   break;
  }
 } 
}, 1000);


-4
尝试这个jQuery
$(function() {
 // Handler for .ready() called.
});

1
jQuery的ready不会执行OP请求的操作。当DOM加载时,ready会触发,而不是在元素加载后触发。load将在元素完成加载/渲染后触发。 - Jaime Torres

-6
请将您的脚本放在body标记完成后...它会起作用的...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接