Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 61b3354

Browse files
committed
fix(ngAria.ngClick): preventDefault on space/enter only on non-interactive elements
Fixes #16664 Closes #16680
1 parent 1dcba9c commit 61b3354

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

src/ngAria/aria.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -389,8 +389,12 @@ ngAriaModule.directive('ngShow', ['$aria', function($aria) {
389389
var keyCode = event.which || event.keyCode;
390390

391391
if (keyCode === 13 || keyCode === 32) {
392-
// Prevent the default browser behavior (e.g. scrolling when pressing spacebar).
393-
event.preventDefault();
392+
// If the event is triggered on a non-interactive element ...
393+
if (nodeBlackList.indexOf(event.target.nodeName) === -1) {
394+
// ... prevent the default browser behavior (e.g. scrolling when pressing spacebar)
395+
// See https://github.com/angular/angular.js/issues/16664
396+
event.preventDefault();
397+
}
394398
scope.$apply(callback);
395399
}
396400

test/ngAria/ariaSpec.js

+29
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
'use strict';
22

3+
/* globals nodeBlackList false */
4+
35
describe('$aria', function() {
46
var scope, $compile, element;
57

@@ -952,6 +954,33 @@ describe('$aria', function() {
952954
expect(clickEvents).toEqual(['div(true)', 'li(true)', 'div(true)', 'li(true)']);
953955
});
954956

957+
they('should not prevent default keyboard action if an interactive $type element' +
958+
'is nested inside ng-click', nodeBlackList, function(elementType) {
959+
function createHTML(type) {
960+
return '<' + type + '></' + type + '>';
961+
}
962+
963+
compileElement(
964+
'<section>' +
965+
'<div ng-click="onClick($event)">' + createHTML(elementType) + '</div>' +
966+
'</section>');
967+
968+
var divElement = element.find('div');
969+
var interactiveElement = element.find(elementType);
970+
971+
// Use browserTrigger because it supports event bubbling
972+
// 13 Enter
973+
browserTrigger(interactiveElement, 'keydown', {cancelable: true, bubbles: true, keyCode: 13});
974+
expect(clickEvents).toEqual([elementType.toLowerCase() + '(false)']);
975+
976+
clickEvents = [];
977+
978+
// 32 Space
979+
browserTrigger(interactiveElement, 'keydown', {cancelable: true, bubbles: true, keyCode: 32});
980+
expect(clickEvents).toEqual([elementType.toLowerCase() + '(false)']);
981+
}
982+
);
983+
955984
it('should trigger a click in browsers that provide `event.which` instead of `event.keyCode`',
956985
function() {
957986
compileElement(

0 commit comments

Comments
 (0)