Skip to content

Commit 5fb3347

Browse files
author
Ethan Cohen
committed
Use onBlur instead of onChange
1 parent 4f75afd commit 5fb3347

File tree

3 files changed

+79
-1
lines changed

3 files changed

+79
-1
lines changed

index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ module.exports = {
44
rules: {
55
'img-uses-alt': require('./lib/rules/img-uses-alt'),
66
'onClick-uses-role': require('./lib/rules/onClick-uses-role'),
7-
'mouseEvents-require-keyEvents': require('./lib/rules/mouseEvents-require-keyEvents')
7+
'mouseEvents-require-keyEvents': require('./lib/rules/mouseEvents-require-keyEvents'),
8+
'use-onblur-not-onchange': require('./lib/rules/use-onblur-not-onchange')
89
},
910
configs: {
1011
recommended: {

lib/rules/use-onblur-not-onchange.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* @fileoverview Enforce usage of onBlur over onChange for accessibility.
3+
* @author Ethan Cohen
4+
*/
5+
'use strict';
6+
7+
// ------------------------------------------------------------------------------
8+
// Rule Definition
9+
// ------------------------------------------------------------------------------
10+
11+
var hasAttribute = require('../hasAttribute');
12+
13+
module.exports = function(context) {
14+
15+
return {
16+
JSXOpeningElement: function(node) {
17+
var hasOnChange = hasAttribute(node.attributes, 'onChange');
18+
var hasOnBlur = hasAttribute(node.attributes, 'onBlur');
19+
20+
if (Boolean(hasOnChange) === true && hasOnBlur === false) {
21+
context.report({
22+
node: node,
23+
message: 'onBlur must be used instead of onchange, unless absolutely necessary and it ' +
24+
'causes no negative consequences for keyboard only or screen reader users.'
25+
});
26+
}
27+
}
28+
};
29+
};
30+
31+
module.exports.schema = [{
32+
type: 'object'
33+
}];
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* @fileoverview Enforce img tags use alt attribute.
3+
* @author Ethan Cohen
4+
*/
5+
6+
'use strict';
7+
8+
// -----------------------------------------------------------------------------
9+
// Requirements
10+
// -----------------------------------------------------------------------------
11+
12+
var rule = require('../../../lib/rules/use-onblur-not-onchange');
13+
var RuleTester = require('eslint').RuleTester;
14+
15+
var parserOptions = {
16+
ecmaVersion: 6,
17+
ecmaFeatures: {
18+
jsx: true
19+
}
20+
};
21+
22+
// -----------------------------------------------------------------------------
23+
// Tests
24+
// -----------------------------------------------------------------------------
25+
26+
var ruleTester = new RuleTester();
27+
28+
var expectedError = {
29+
message: 'onBlur must be used instead of onchange, unless absolutely necessary and it ' +
30+
'causes no negative consequences for keyboard only or screen reader users.',
31+
type: 'JSXOpeningElement'
32+
};
33+
34+
ruleTester.run('use-onblur-not-onchange', rule, {
35+
valid: [
36+
{code: '<div onBlur={() => {}} />;', parserOptions: parserOptions},
37+
{code: '<div />;', parserOptions: parserOptions},
38+
{code: '<div onBlur={() => {}} onChange={() => {}} />;', parserOptions: parserOptions}
39+
],
40+
invalid: [
41+
{code: '<div onChange={() => {}} />;', errors: [expectedError], parserOptions: parserOptions},
42+
{code: '<input onChange={() => {}} />', errors: [expectedError], parserOptions: parserOptions}
43+
]
44+
});

0 commit comments

Comments
 (0)