为什么现在有更多人使用脚本来分配事件处理程序vs从html元素中分配事件?

Bab*_*ker 3 html javascript

作为一个学习者,我喜欢看很多源代码.自从我在一年前开始学习JavaScript以来,我注意到人们不使用传统事件处理程序的趋势onclick="doSomething()",但是越来越多地使用像document.getElementById("someId").onclick = function(){..some code..};

这种趋势背后的原因是什么?

SLa*_*aks 14

在Javascript中分配处理程序会将所有代码放在一个位置,而不是将其分散到整个HTML中.
这有助于将内容与脚本分开,就像CSS有助于将内容与样式分开一样.

它也更快,因为浏览器不需要为每个处理程序属性启动Javascript解析器.

这是Unobtrusive Javascript的一个例子.

  • _ <主观> _这是初学者Web开发人员与经验丰富的专业人员之间的区别._ </主观> _ (3认同)
  • @Pointy:琐碎的页面是一个案例.另一个问题是,一旦元素被渲染,行为就与元素相关联,例如在一个大的页面中,其中有一些元素在开始附近有脚本行为.它们在使用事件处理程序属性呈现时可以是交互式的,如果等到DOM加载以创建事件处理程序,它们就不能成为事件处理程序属性. (3认同)
  • @SLaks:我不同意你关于将新手与专业人士分开的评论.在某些情况下,使用事件处理程序属性是完全合适的,并且可以说比使用脚本分配处理程序更可取.经验丰富的专业人员了解问题并使用适当的方法. (2认同)
  • @SLaks:是的.然后你已经实现了什么呢?那不过是一个关注点的分离:你仍然在HTML(脚本中)中分配了一个事件处理程序,只是做得更冗长,效率更低. (2认同)

T.J*_*der 5

其他答案没有涉及到这个,所以:

您的示例onclick甚至在JavaScript代码中使用(反射)属性:

document.getElemenbyId("someId").onclick = function(){..some code..};
Run Code Online (Sandbox Code Playgroud)

...对我来说,没有使用属性而忽略了这样做的主要原因之一:和别人玩得很好.DOM2附加处理程序的方式(addEventListener或者attachEvent在IE [IE9上addEventListener最终有标准]):

document.getElementById("someId").addEventListener("click", function() { ... }, false);
// or
document.getElementById("someId").attachEvent("onclick", function() { ... });
Run Code Online (Sandbox Code Playgroud)

... 是非独占的  - 可以同时附加多个处理程序.然而,如果您分配给onclick,那么您将踢掉任何先前的处理程序并接管.

对我来说,这个"玩得很好"的东西是一个很大的卖点.好吧,那并保持代码和标记分开,但在其他答案中已经很好地涵盖了.