From 74eb17d7c8232f72f134bf2546f10fed7234d276 Mon Sep 17 00:00:00 2001 From: Mike Calvanese Date: Fri, 6 Feb 2015 12:26:54 -0500 Subject: [PATCH] fix(ngTouch): check undefined tagName for SVG event target When target click element is an SVG, event.target.tagName and event.target.blur are undefined in Chrome v40 on iOS 8.1.3 --- src/ngTouch/directive/ngClick.js | 8 +++++--- src/ngTouch/touch.js | 3 +++ test/ngTouch/directive/ngClickSpec.js | 12 ++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/ngTouch/directive/ngClick.js b/src/ngTouch/directive/ngClick.js index 48dd3f374767..f352c252f443 100644 --- a/src/ngTouch/directive/ngClick.js +++ b/src/ngTouch/directive/ngClick.js @@ -1,6 +1,8 @@ 'use strict'; -/* global ngTouch: false */ +/* global ngTouch: false, + nodeName_: false +*/ /** * @ngdoc directive @@ -142,7 +144,7 @@ ngTouch.directive('ngClick', ['$parse', '$timeout', '$rootElement', lastLabelClickCoordinates = null; } // remember label click coordinates to prevent click busting of trigger click event on input - if (event.target.tagName.toLowerCase() === 'label') { + if (nodeName_(event.target) === 'label') { lastLabelClickCoordinates = [x, y]; } @@ -158,7 +160,7 @@ ngTouch.directive('ngClick', ['$parse', '$timeout', '$rootElement', event.preventDefault(); // Blur focused form elements - event.target && event.target.blur(); + event.target && event.target.blur && event.target.blur(); } diff --git a/src/ngTouch/touch.js b/src/ngTouch/touch.js index dac7900001b9..8191ff0b753a 100644 --- a/src/ngTouch/touch.js +++ b/src/ngTouch/touch.js @@ -22,3 +22,6 @@ /* global -ngTouch */ var ngTouch = angular.module('ngTouch', []); +function nodeName_(element) { + return angular.lowercase(element.nodeName || (element[0] && element[0].nodeName)); +} diff --git a/test/ngTouch/directive/ngClickSpec.js b/test/ngTouch/directive/ngClickSpec.js index d792c8b753ee..179b0248ff21 100644 --- a/test/ngTouch/directive/ngClickSpec.js +++ b/test/ngTouch/directive/ngClickSpec.js @@ -171,6 +171,18 @@ describe('ngClick (touch)', function() { expect($rootScope.tapped).toBe(true); })); + it('should click when target element is an SVG', inject( + function($rootScope, $compile, $rootElement) { + element = $compile('')($rootScope); + $rootElement.append(element); + $rootScope.$digest(); + + browserTrigger(element, 'touchstart'); + browserTrigger(element, 'touchend'); + browserTrigger(element, 'click', {x:1, y:1}); + + expect($rootScope.tapped).toEqual(true); + })); describe('the clickbuster', function() { var element1, element2;