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

Commit 4be80ae

Browse files
committed
fix(ngAria.ngClick): restrict preventDefault on space / enter to non-interactive elements
Fixes #16664
1 parent 837e519 commit 4be80ae

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

src/ngAria/aria.js

Lines changed: 6 additions & 2 deletions
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+
// Prevent the default browser behavior (e.g. scrolling when pressing spacebar) ...
393+
if (nodeBlackList.indexOf(event.target.nodeName) === -1) {
394+
// ... but only when the event is triggered by a non-interactive element
395+
// See https://github.com/angular/angular.js/issues/16664
396+
event.preventDefault();
397+
}
394398
scope.$apply(callback);
395399
}
396400

test/ngAria/ariaSpec.js

Lines changed: 30 additions & 0 deletions
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,34 @@ 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+
var html = '<' + type + '>';
961+
962+
if (type === 'INPUT' || 'TYPE' === 'A') {
963+
return html;
964+
}
965+
966+
return html + '</' + type + '>';
967+
}
968+
969+
compileElement(
970+
'<section>' +
971+
'<div ng-click="onClick($event)">' + createHTML(elementType) + '</div>' +
972+
'</section>');
973+
974+
var divElement = element.find('div');
975+
var interactiveElement = element.find(elementType);
976+
977+
// Use browserTrigger because it supports event bubbling
978+
browserTrigger(interactiveElement, 'keydown', {cancelable: true, bubbles: true, keyCode: 13});
979+
browserTrigger(interactiveElement, 'keydown', {cancelable: true, bubbles: true, keyCode: 32});
980+
981+
expect(clickEvents).toEqual([elementType.toLowerCase() + '(false)', elementType.toLowerCase() + '(false)']);
982+
}
983+
);
984+
955985
it('should trigger a click in browsers that provide `event.which` instead of `event.keyCode`',
956986
function() {
957987
compileElement(

0 commit comments

Comments
 (0)