diff --git a/src/ng/animate.js b/src/ng/animate.js index e105de1ab28f..f71c2de4f6d4 100644 --- a/src/ng/animate.js +++ b/src/ng/animate.js @@ -2,6 +2,7 @@ var $animateMinErr = minErr('$animate'); var ELEMENT_NODE = 1; +var TEXT_NODE = 3; function mergeClasses(a,b) { if (!a && !b) return ''; @@ -12,10 +13,10 @@ function mergeClasses(a,b) { return a + ' ' + b; } -function extractElementNode(element) { +function extractNonCommentNode(element) { for (var i = 0; i < element.length; i++) { var elm = element[i]; - if (elm.nodeType === ELEMENT_NODE) { + if (elm.nodeType === ELEMENT_NODE || elm.nodeType === TEXT_NODE) { return elm; } } @@ -241,7 +242,7 @@ var $AnimateProvider = ['$provide', function($provide) { // from the dom sometime before this code runs then let's // just stick to using the parent element as the anchor if (afterElement) { - var afterNode = extractElementNode(afterElement); + var afterNode = extractNonCommentNode(afterElement); if (afterNode && !afterNode.parentNode && !afterNode.previousElementSibling) { afterElement = null; } diff --git a/src/ngAnimate/.jshintrc b/src/ngAnimate/.jshintrc index ff0fac6abb0b..2e63cae6f73d 100644 --- a/src/ngAnimate/.jshintrc +++ b/src/ngAnimate/.jshintrc @@ -36,6 +36,6 @@ "packageStyles": false, "removeFromArray": false, "stripCommentsFromElement": false, - "extractElementNode": false + "extractNonCommentNode": false } } diff --git a/src/ngAnimate/animateQueue.js b/src/ngAnimate/animateQueue.js index 00dd4e3e62db..08aba08c7ca8 100644 --- a/src/ngAnimate/animateQueue.js +++ b/src/ngAnimate/animateQueue.js @@ -142,7 +142,7 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) { return { on: function(event, container, callback) { - var node = extractElementNode(container); + var node = extractNonCommentNode(container); callbackRegistry[event] = callbackRegistry[event] || []; callbackRegistry[event].push({ node: node, @@ -159,7 +159,7 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) { : filterFromRegistry(entries, container, callback); function filterFromRegistry(list, matchContainer, matchCallback) { - var containerNode = extractElementNode(matchContainer); + var containerNode = extractNonCommentNode(matchContainer); return list.filter(function(entry) { var isMatch = entry.node === containerNode && (!matchCallback || entry.callback === matchCallback); diff --git a/src/ngAnimate/shared.js b/src/ngAnimate/shared.js index bfa5a80c5916..14e55b7a6c38 100644 --- a/src/ngAnimate/shared.js +++ b/src/ngAnimate/shared.js @@ -14,6 +14,7 @@ var isFunction = angular.isFunction; var isElement = angular.isElement; var ELEMENT_NODE = 1; +var TEXT_NODE = 3; var COMMENT_NODE = 8; var NG_ANIMATE_CHILDREN_DATA = '$$ngAnimateChildren'; @@ -72,7 +73,7 @@ function removeFromArray(arr, val) { } function stripCommentsFromElement(element) { - if (element.nodeType === ELEMENT_NODE) { + if (element.nodeType === ELEMENT_NODE || element.nodeType === TEXT_NODE) { return jqLite(element); } if (element.length === 0) return []; @@ -81,17 +82,17 @@ function stripCommentsFromElement(element) { // is the only element within the jqLite wrapper. // (it's important that we retain the element instance.) if (element.length === 1) { - return element[0].nodeType === ELEMENT_NODE && element; + return (element[0].nodeType === ELEMENT_NODE || element[0].nodeType === TEXT_NODE) && element; } else { - return jqLite(extractElementNode(element)); + return jqLite(extractNonCommentNode(element)); } } -function extractElementNode(element) { +function extractNonCommentNode(element) { if (!element[0]) return element; for (var i = 0; i < element.length; i++) { var elm = element[i]; - if (elm.nodeType == ELEMENT_NODE) { + if (elm.nodeType === ELEMENT_NODE || elm.nodeType === TEXT_NODE) { return elm; } } diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js index cf4d4fefd45a..a6520a1e2cb4 100644 --- a/test/ngAnimate/animateSpec.js +++ b/test/ngAnimate/animateSpec.js @@ -129,6 +129,20 @@ describe("animations", function() { }; })); + it('should animate text nodes', function() { + module(function($animateProvider) { + $animateProvider.classNameFilter(/only-allow-this-animation/); + }); + inject(function($animate, $rootScope, $compile) { + var newWrapper = angular.element('new text'); + $compile(newWrapper.contents())($rootScope); + var oldContents = element.contents(); + var newContents = newWrapper.contents(); + $animate.enter(newContents, element); + $animate.leave(oldContents); + }); + }); + it('should animate only the specified CSS className matched within $animateProvider.classNameFilter', function() { module(function($animateProvider) { $animateProvider.classNameFilter(/only-allow-this-animation/);