window.onload 与 <body onload=""/>

IT技术 javascript
2021-02-09 12:59:44

window.onload事件和标签onload事件到底有什么区别body我什么时候使用哪个以及应该如何正确完成?

6个回答

window.onload = myOnloadFunc并且<body onload="myOnloadFunc();">是使用相同事件的不同方式不过使用window.onload并不那么突兀——它会将您的 JavaScript 从 HTML 中提取出来。

所有常见的 JavaScript 库,Prototype、ExtJS、Dojo、JQuery、YUI 等都为文档加载时发生的事件提供了很好的包装器。您可以侦听窗口 onLoad 事件,并对此做出react,但在下载所有资源之前不会触发 onLoad,因此在获取最后一个大图像之前不会执行您的事件处理程序。在某些情况下,这正是您想要的,在其他情况下,您可能会发现在 DOM 准备就绪时进行侦听更为合适——此事件类似于 onLoad,但无需等待图像等下载即可触发。

@RichardTurner 您不需要使用库来更改上下文绑定。一个简单的 .bind() 调用做到这一点
2021-03-14 12:59:44
@Kloar 这些天你可以,是的,但你需要 MSIE9+。在我回答时更常见的较旧的 MSIE 上,您需要一个 polyfill。
2021-03-17 12:59:44
@Walkerneo:是的,绝对值得注意。当然,this如果需要,使用 JS 库可以覆盖引用的对象
2021-03-29 12:59:44
但是,应该指出的是,这是有区别的。内联 onload 事件将myOnloadFunc()在全局上下文中调用this将参考window)。通过 javascript 设置它会使它在元素的上下文中执行(this指的是触发事件的元素)。在这种特殊情况下,它不会有什么不同,但它会与其他元素。
2021-04-05 12:59:44

没有区别,但您不应该使用它们。

在许多浏览器中,window.onload直到所有图像都加载完毕才会触发事件,这不是您想要的。基于标准的浏览器有一个名为DOMContentLoadedwhich 更早触发的事件,但 IE 不支持(在撰写此答案时)。我建议使用支持跨浏览器 DOMContentLoaded 功能的 javascript 库,或者找到可以使用的编写良好的函数。jQuery 的$(document).ready(), 就是一个很好的例子。

DOMContentLoaded 现在被 IE9 及更高版本支持:developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
2021-03-21 12:59:44
现在的问题.. 如果 jQuery 对手头的项目来说太过分了怎么办?(不是敲 jQuery,自己使用它。只是有时只想要一个库中的一个特性..)
2021-03-29 12:59:44
当您说“不受 IE 支持”是普遍真理,还是仅适用于特定版本的 IE?自从您写下这个答案以来,浏览器世界发生了很多变化,也许是时候更新这个答案了?
2021-03-29 12:59:44
从未来报告,DOMContentLoaded 现在被所有主要浏览器支持:caniuse.com/#feat=domcontentloaded
2021-03-31 12:59:44
来自未来的问题......如果没有jquery怎么办?
2021-04-02 12:59:44

window.onload没有身体也能工作。创建只有脚本标签的页面并在浏览器中打开它。该页面不包含任何正文,但它仍然有效..

<script>
  function testSp()
  {
    alert("hit");
  }
  window.onload=testSp;
</script>
@Kissaki:标准 HTML 根本不需要正文标签!
2021-03-17 12:59:44
@Kissaki:html5 不再需要脚本类型(如果它是 javascript),您适合早期版本。
2021-03-22 12:59:44
XHTML1指定<!ELEMENT html (head, body)>[1] -和HTML401指定<!ELEMENT HTML O O (%html.content;)<!ENTITY % html.content "HEAD, BODY">以及[2]。html51 状态也A head element followed by a body element.适用于 html 内容。[3] w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/html51/semantics.html#the -html-element -- 所以我猜所有那些常见/使用中的 HTML 标准需要一个 body 标签。:)
2021-03-24 12:59:44
@Kissaki 那是 XHTML,而不是 HTML。根据其 SGML DTD,HTML 允许省略开始和结束正文标签,以及省略 html 和头标签。w3.org/TR/html401/struct/global.html#edef-BODY Start tag: optional, End tag: optional
2021-03-25 12:59:44
如果您确实添加了内容(应该在 body 标签中),那么没有 body 标签的 HTML 是无效的。您的脚本标签也缺少类型。永远不要依赖浏览器来修复不符合标准的代码!(因为浏览器在过去或将来可能会有所不同或根本不会这样做。)
2021-03-29 12:59:44

通常,我更喜欢使用<body onload=""> 事件。我认为尽可能将行为与内容分开会更干净。

也就是说,在某些情况下(对我来说通常很少见)使用 body onload 可以稍微提高速度。

我喜欢使用 Prototype,所以我通常在<head我的页面> 中放置这样的内容

document.observe("dom:loaded", function(){
  alert('The DOM is loaded!');
});

或者

Event.observe(window, 'load', function(){
  alert('Window onload');
});

以上是我在这里学到的技巧我非常喜欢在 HTML 之外附加事件处理程序的概念。

(编辑以更正代码中的拼写错误。)

在什么情况下它会更快,为什么?
2021-03-16 12:59:44
考虑到它是在 6 年前发布的,我对这个答案持保留态度。非常欢迎您更新它或发布您自己的改进答案。
2021-03-28 12:59:44
对于所有“我”(“我喜欢”,“我认为”),这个答案似乎非常主观。如果进一步缺乏任何客观和可验证的事实,则几乎可以支持这种印象。
2021-04-04 12:59:44

'一个客观问题的主观答案太多了。“不引人注目”的 JavaScript 是一种迷信,就像从不使用 goto 的旧规则一样。以可帮助您可靠地实现目标的方式编写代码,而不是根据某人的流行宗教信仰。

任何发现:

 <body onload="body_onload();">

过于分散注意力是过于自命不凡,并且没有明确他们的优先事项。

我通常将我的 JavaScript 代码放在一个单独的 .js 文件中,但我发现在 HTML 中挂钩事件处理程序没有任何麻烦,顺便说一下,这是有效的 HTML。

因此,因为您不费心去了解为什么推荐某些东西,所以您将这些推荐贴上了“时尚宗教信仰”的标签??
2021-03-15 12:59:44
在现代浏览器中抵御 XSS 攻击的一种很好的方法是使用内容安全策略禁用所有内联 javascript。这是不在 HTML 中使用 onload 属性的一个很好的理由。
2021-03-15 12:59:44
问题是“这两种方法之间有什么区别?”,以及对哪种方法更好的建议的请求。你的回答如何回答这个问题?
2021-03-22 12:59:44
在任何情况下,您在 1 个地方制作可应用于大量文件的module化解决方案都比将代码添加到每个大量文件本身要好得多。对于原始构建时间、代码组织目的、可读性和未来编辑来说,这更好。它并不流行,它实际上是 Java 和 C++ 等语言中存在的一个较旧的概念,Web 程序员现在将其视为更好的编码方式。
2021-03-29 12:59:44
编写不引人注目的 javascript 是有充分理由的。假设您有一个包含 100 个页面的 Web 应用程序,并且您使用了 <body onload="body_onload();"> 方法,而不是将其放入每个页面包含的 javascript 文件中。然后想象一下您出于某种原因需要更改该函数的名称。将事件放在包含的 javascript 文件中 1) 使更改变得更加简单,并且 2) 节省服务器资源,因为 javascript 文件可以缓存一年(在正确配置的服务器上),而不是一遍又一遍地下载相同的代码。
2021-04-08 12:59:44