Skip to content

Latest commit

 

History

History
76 lines (53 loc) · 2.81 KB

prefer-add-event-listener.md

File metadata and controls

76 lines (53 loc) · 2.81 KB

Prefer .addEventListener() and .removeEventListener() over on-functions

💼 This rule is enabled in the ✅ recommended config.

🔧 This rule is automatically fixable by the --fix CLI option.

Enforces the use of .addEventListener() and .removeEventListener() over their on-function counterparts. For example, foo.addEventListener('click', handler); is preferred over foo.onclick = handler; for HTML DOM Events. There are numerous advantages of using addEventListener. Some of these advantages include registering unlimited event handlers and optionally having the event handler invoked only once.

In most cases, it is safe to replace the on-function with the corresponding addEventListener counterpart, which is why this rule contains a fixer that swaps it automatically for you. For example, you might be assigning some static functionality to a UI button when the page first loads, and in this context, the functionality of the two would be equivalent.

However, if you are assigning a listener in a dynamic context, then this rule's auto-fixer will make your code bugged. This is because the on assignment replaces the current listener, but the addEventListener adds an additional listener in addition to the ones that are already assigned. For example, if you are dynamically updating the functionality of a button as new data comes in, then using addEventListener would not work, since it would cause N functions to be invoked for every previous data state. In this context, you should probably disable this lint rule and use the on form, since removing existing event listeners is not possible.

Fail

foo.onclick = () => {};
foo.onkeydown = () => {};
foo.bar.onclick = onClick;
foo.onclick = null;

Pass

foo.addEventListener('click', () => {});
foo.addEventListener('keydown', () => {});
foo.bar.addEventListener('click', onClick);
foo.removeEventListener('click', onClick);

Options

excludedPackages

"unicorn/prefer-add-event-listener": [
	"error", {
		"excludedPackages": [
			"koa",
			"sax"
		]
	}
]

This option lets you specify a list of packages that disable the rule when imported. By default, koa and sax are listed.

With koa, this would still pass:

const Koa = require('koa');
const app = new Koa();

app.onerror = () => {};