JavaScript -调用带有或不带有父元素的函数
JavaScript - Calling a function with and without parens
取以下代码:
HTML<button id="button>click me</button>
JS - VERSION 1
window.onload = init;
function init() {
console.log('init called');
var button = document.getElementById('button');
button.onclick = buttonClickHandler;
}
function buttonClickHandler() {
console.log('button clicked');
}
vs相同的HTML
JS - VERSION 2
window.onload = init();
在这两种情况下,'init called'立即出现在控制台中,但在第二种情况下,它后面跟着一个错误,说明button为null。
这里有两件事在起作用。1)在版本1中,它等待DOM加载;2)在版本2中,它发生在DOM加载之前,或者看起来是这样。
我的问题。请尽可能清楚地解释版本1和版本2中发生的事情。window.onload = init
和window.onload = init()
的专业术语是什么?也请解释每个版本的行为。为什么1等,而2不等?
脚本需要放在按钮元素之前,例如在头部:http://jsfiddle.net/XMEjr/1/
版本1设置init
函数为window.onload
事件时调用的函数。函数不会在该行被调用;它只是作为一个值赋值给一个属性。
Version 2将init
函数的结果设置为window.onload
事件上调用的结果。这就是()
带来的差异。
显然init
函数在onload
被触发之前被调用(以获得该结果并将其设置为onload
处理程序)。因此,该函数启动时,未能通过button
id找到元素(因为DOM尚未准备好),因此getElementById
返回null。然后尝试访问null
的onclick
属性以错误停止它。
在第二个你正在分配的onload调用init的结果:)
window.onload="init()"
在这种情况下,您正在分配一个字符串,该字符串在DOM就绪时进行评估。
如果你这样做
window.onload=init
你正在给一个函数分配一个引用。然后,当DOM准备好时,调用函数
但是如果你这样做了:
window.onload=init()
你可以做
function init() { alert ("this is called before onload, dom is not ready, button doesnt exist"); return init2; }
function init2() { alert ("this is called on load, dom is ready, button and everything in the body is now created"); }
希望你明白。
顺便说一下,这种情况下可以这样做:
window.onload=init()
function init() {
if (IS_IPHONE) return init_iphone;
if (IS_ANDROID) return init_android;
if (IS_WINDOWS) return init_not_supported;
}
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 在函数中添加数组元素的数值
- 如何在DOM元素上按类型构建此函数
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- 如何计算每个元素's的高度,并将这些值用作函数中的变量
- Rails/Javascript链接到用于切换多个元素的函数
- 如何在HTML元素上创建函数,而不是将元素作为参数传递
- jQuery在元素的上下文中运行函数
- 如何在模板聚合物中使用元素函数
- Append元素在运行两次函数后不显示
- 当元素可见时,jQuery滚动函数会触发一次
- 如何将一个函数附加到一个不存在的元素上
- 带有事件的触发元素函数
- 是否可以从另一个元素访问元素函数?聚合物1.0
- 单击的元素函数参数的值错误
- 为什么不在DOM元素函数上应用工作呢?
- 未定义的错误:创建带有返回HTML元素函数的对象
- node . js,节点.IO -使用"each"迭代元素函数停止服务器
- 将循环变量作为元素函数中的参数传递
- 动态添加的元素函数调用不工作