fix(ngAria.ngClick): preventDefault on space/enter only on non-interactive elements

Fixes #16664
Closes #16680
This commit is contained in:
Martin Staffa
2018-09-06 15:53:33 +02:00
committed by GitHub
parent c42cadd4ed
commit 8082d5eae0
2 changed files with 35 additions and 2 deletions
+6 -2
View File
@@ -389,8 +389,12 @@ ngAriaModule.directive('ngShow', ['$aria', function($aria) {
var keyCode = event.which || event.keyCode;
if (keyCode === 13 || keyCode === 32) {
// Prevent the default browser behavior (e.g. scrolling when pressing spacebar).
event.preventDefault();
// If the event is triggered on a non-interactive element ...
if (nodeBlackList.indexOf(event.target.nodeName) === -1) {
// ... prevent the default browser behavior (e.g. scrolling when pressing spacebar)
// See https://github.com/angular/angular.js/issues/16664
event.preventDefault();
}
scope.$apply(callback);
}
+29
View File
@@ -1,5 +1,7 @@
'use strict';
/* globals nodeBlackList false */
describe('$aria', function() {
var scope, $compile, element;
@@ -952,6 +954,33 @@ describe('$aria', function() {
expect(clickEvents).toEqual(['div(true)', 'li(true)', 'div(true)', 'li(true)']);
});
they('should not prevent default keyboard action if an interactive $type element' +
'is nested inside ng-click', nodeBlackList, function(elementType) {
function createHTML(type) {
return '<' + type + '></' + type + '>';
}
compileElement(
'<section>' +
'<div ng-click="onClick($event)">' + createHTML(elementType) + '</div>' +
'</section>');
var divElement = element.find('div');
var interactiveElement = element.find(elementType);
// Use browserTrigger because it supports event bubbling
// 13 Enter
browserTrigger(interactiveElement, 'keydown', {cancelable: true, bubbles: true, keyCode: 13});
expect(clickEvents).toEqual([elementType.toLowerCase() + '(false)']);
clickEvents = [];
// 32 Space
browserTrigger(interactiveElement, 'keydown', {cancelable: true, bubbles: true, keyCode: 32});
expect(clickEvents).toEqual([elementType.toLowerCase() + '(false)']);
}
);
it('should trigger a click in browsers that provide `event.which` instead of `event.keyCode`',
function() {
compileElement(