【发布时间】:2010-08-23 08:26:53
【问题描述】:
我希望在 js 开发者社区中我们可以就此达成共识:
我们应该在我们的 HTML 文档 inside 还是 outside 声明或 onclick、onkeyup... 等事件?
1) 我更喜欢将它们分开。真的。 2) 我也知道 HTML5 在游戏中添加了一些新的交互元素...
问候, 内存
【问题讨论】:
标签: javascript events placement
我希望在 js 开发者社区中我们可以就此达成共识:
我们应该在我们的 HTML 文档 inside 还是 outside 声明或 onclick、onkeyup... 等事件?
1) 我更喜欢将它们分开。真的。 2) 我也知道 HTML5 在游戏中添加了一些新的交互元素...
问候, 内存
【问题讨论】:
标签: javascript events placement
考虑阅读Unobtrusive JavaScript 和jQuery。
【讨论】:
至少十年来,内联编写事件处理程序一直是一个非常糟糕的主意。
即使访问像“element.onkeyup”这样的属性也是一个非常糟糕的主意。
使用监听器。更好的框架。
编辑:这就是 Tim Down 的评论荒谬的原因:
如果任何编程决策的基本原理都是以“如果您知道您只需要...”开头,那么不要这样做。严重地。
“所有可编写脚本的浏览器”实际上是指 IE5.5+ FF2+ Safari 3+ Opera 9+。这涵盖了 99% 以上的网络用户,并且所有这些浏览器都支持事件侦听器。与访问事件处理程序属性相比,事件侦听器具有主要优势 - 最大的优势是任何事件都可以有多个侦听器。在现代 Javascript 编程中,这种情况一直都在发生。仅仅因为你可以就使用过时的事件处理系统来特殊化你的代码是一个糟糕的想法,对真正好的想法怀有敌意,比如使用库和编写不显眼的、一致的代码。
return false; 是一种完全违反直觉和反语义的方式,表示“停止在 DOM 树上/下冒泡/传播此事件”。你知道什么是直觉吗?库代码中的常用表达式,例如 event.stop()。
【讨论】:
element 上只需要一个事件处理程序,那么element.onkeyup 就是要走的路。首先,它适用于所有可编写脚本的浏览器,并且在所有浏览器中的工作方式完全相同(除了从哪里获取事件对象)。其次,防止事件默认行为的机制在所有浏览器中都是简单的return false;。
return false不代表你说的。这意味着“不执行默认浏览器操作”。
理想情况下,如果您可以定义事件代码并将这些事件附加到单独 JS 文件中的匹配元素。尽可能分离 JS 和 HTML。
【讨论】:
当前流行的观点是一切都必须不显眼,这意味着someElement.onclick = function(e) { ... }; 等事件处理程序属性被广泛反对,<input type="button" onclick="doSomething()"> 等事件处理程序属性被彻底摒弃。事实上,两者都有有效的用途。
将行为(例如脚本化事件处理程序)与内容分开的愿望是很自然的,也是主要考虑因素,但不应是唯一考虑因素。如下总结所示,创建事件处理程序的三种方法各有优缺点,在特定情况下,行为和内容的分离可能不是最重要的问题。
总之,对于给定的任务,请使用适合您需求的最简单的方法。
myElement.onclick = function(e) { alert("Clicked"); };
这些对于将事件处理程序分配给您在脚本中创建的元素特别有用,并且肯定只需要一个侦听器。
window.event,其他浏览器中的函数参数)return false 防止默认浏览器行为的普遍支持方法
<input type="button" value="test" onclick="alert('Clicked');">
当元素在文档完成加载之前响应事件很重要时,这是唯一有效的方法(请参阅 http://peter.michaux.ca/articles/the-window-onload-problem-still 对此进行更长时间的讨论)。此外,这是添加事件处理程序的最简单方法。
return false 防止默认浏览器行为的普遍支持方法
myElement.addEventListener("click", function(e) { alert("Clicked"); }, false);
这是唯一允许您将多个侦听器附加到特定对象上的特定事件的方法。 addEventListener 在 DOM Level 2 Events specification 中标准化。
addEventListener 是一个现代标准,在 IE 9 中得到支持,这意味着当前所有主流浏览器都将在 IE 9 发布时支持attachEvent 不完全等同于addEventListener
【讨论】:
this 的监听器函数以及如何将 Event 对象传递给监听器函数。两者都很容易解决,但您需要了解它们。