在<body>部分中通过javascript为body.onload添加事件处理程序

Dan*_*mer 34 html javascript javascript-events onload-event

我们希望在文档中包含Google Maps API的地图.文档告诉我们用一个由body的onload()事件调用的函数初始化地图.

通常的打电话方式:

<body onload="initialize_map();">
Run Code Online (Sandbox Code Playgroud)

这对我们来说不起作用,因为我们正在使用Template :: Toolkit,并且<body>标签已经包含在我们的包装器中.简而言之:<body>当我们的javascript代码开始运行时,标签已经打印出来了.

我试过这样的东西,但它只适用于onclick,而不是onload.我猜这是因为javascript代码位于<body>标签本身之下.

var body = document.getElementsByTagName("body")[0];

body.addEventListener("load", init(), false);

function init() {
        alert("it works!");
};
Run Code Online (Sandbox Code Playgroud)

任何帮助如何启动谷歌地图地图赞赏!

epa*_*llo 44

body.addEventListener("load", init(), false);
Run Code Online (Sandbox Code Playgroud)

那个init()说现在运行这个函数并将它返回的任何内容分配给load事件.

你想要的是分配对函数的引用,而不是结果.所以你需要删除().

body.addEventListener("load", init, false);
Run Code Online (Sandbox Code Playgroud)

你也应该使用window.onload而不是body.onload

addEventListener大多数浏览器都支持IE 8以外的版本.

  • 对于IE,它将是`attachEvent`.quirksmode.org非常好地描述了它:http://quirksmode.org/js/events_advanced.html (2认同)

Jac*_*zen 36

您应该使用以下代码(适用于所有较新的浏览器):

window.addEventListener('DOMContentLoaded', init, false);
Run Code Online (Sandbox Code Playgroud)

  • @Luke你应该将该事件绑定到窗口:`window.addEventListener('load',init,false);` (4认同)
  • 为什么这不起作用?`document.addEventListener('load', init, false);` (2认同)

Mar*_*des 18

正如@epascarello提到的W3C标准浏览器,你应该使用:

body.addEventListener("load", init, false);
Run Code Online (Sandbox Code Playgroud)

但是,如果您希望它在IE <9上工作,您可以使用:

var prefix = window.addEventListener ? "" : "on";
var eventName = window.addEventListener ? "addEventListener" : "attachEvent";
document.body[eventName](prefix + "load", init, false);
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要一行:

document.body[window.addEventListener ? 'addEventListener' : 'attachEvent'](
    window.addEventListener ? "load" : "onload", init, false);
Run Code Online (Sandbox Code Playgroud)

注意:这里我通过文档直接引用了body元素,节省了对第一行的需求.

此外,如果你正在使用jQuery,并且你想要使用DOM ready事件而不是身体load,那么答案可能更短......

$(init);
Run Code Online (Sandbox Code Playgroud)


Dan*_*mer 8

由于我们已经使用jQuery进行图形化的糖果功能,我们最终使用了这个.像这样的代码

$(document).ready(function() {
    // any code goes here
    init();
});
Run Code Online (Sandbox Code Playgroud)

做了我们想要的一切,并关注浏览器不兼容性.

  • 甚至更简单的是`$(init);` (11认同)