内联事件处理程序是否被认为是一种不良做法?
例如:<button onclick=someFunction()>Click me!</button>
如果是这样的话,使用内联事件处理程序的缺点是什么?
内联事件处理程序是否被认为是一种不良做法?
例如:<button onclick=someFunction()>Click me!</button>
如果是这样的话,使用内联事件处理程序的缺点是什么?
这是一个糟糕的主意,因为...
最佳实践建议在内容、样式和脚本之间进行明确的分离。在HTML中混合使用内联JavaScript(或CSS)与此不一致。
你只能绑定每个元素的每种事件类型的一个事件,使用on*
风格的事件,所以你不能有两个onclick
事件处理程序,例如。
如果事件在内联中指定,JS将作为字符串指定(属性值始终为字符串),并在事件触发时进行评估。评估是有害的。
由内联事件处理程序表示的函数必须是全局的(或至少是全局可访问的),这在现在很少见;代码通常是命名空间化的,或者封装在模块中(感谢@Sebastian Simon)。
如果你正在使用内容安全策略(CSP),则必须(不明智地)扩展其允许评估内联JavaScript。
简而言之,通过专用的addEventListener
API或通过jQuery等方式集中处理事件。
[2021年编辑]
这些天,响应式框架在某种程度上扭转了这一趋势;在响应式框架中,事件通常被指定为属性,例如在Vue中:<p v-on:click='foo'>Hello</p>
foo
是当前组件数据对象的一个方法。onclick
等。 - Sebastian SimononClick="handler1() || handler2()....|| handlern()"
的方法来解决问题。https://jsfiddle.net/ageck0bh/。 - adnanmuttalebv-on:click
不是一个属性,而是一个指令,在底层它将使用 addEventListener
。https://vuejs.org/v2/guide/events.html#Listening-to-Events - Colinon*
属性依赖于全局作用域,因此您必须将函数设置为全局属性,从而破坏了模块的一部分目的,特别是封装的好处。 - Sebastian Simonscript-src
中指定'unsafe-inline'
或'unsafe-hashes'
,否则会阻止它们。 - CheddarLizzardaddEventListener
,因此符合最佳实践:https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#inline_event_handlers_%E2%80%94_dont_use_these - Colin