From 283e93072cfe0030b1f692528b9db51db5690699 Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Wed, 18 Dec 2013 18:51:56 -0800 Subject: [PATCH] fix(forEach): allow looping over result of querySelectorAll in IE8 In IE8 the result object of calling `node.querySelectorAll` does not have a `hasOwnPropery` function. However, it should be usable with `forEach`. Related to #5400. --- src/Angular.js | 4 +++- test/AngularSpec.js | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Angular.js b/src/Angular.js index 88ea452b3749..386682a325e7 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -213,7 +213,9 @@ function forEach(obj, iterator, context) { if (obj) { if (isFunction(obj)){ for (key in obj) { - if (key != 'prototype' && key != 'length' && key != 'name' && obj.hasOwnProperty(key)) { + // Need to check if hasOwnProperty exists, + // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function + if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) { iterator.call(context, obj[key], key); } } diff --git a/test/AngularSpec.js b/test/AngularSpec.js index 36d4926e709b..7fe65f4c8051 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -504,6 +504,21 @@ describe('angular', function() { expect(log).toEqual(['0:a', '1:c']); }); + if (document.querySelectorAll) { + it('should handle the result of querySelectorAll in IE8 as it has no hasOwnProperty function', function() { + document.body.innerHTML = "

" + + "a" + + "b" + + "c" + + "

"; + + var htmlCollection = document.querySelectorAll('[name="x"]'), + log = []; + + forEach(htmlCollection, function(value, key) { log.push(key + ':' + value.innerHTML)}); + expect(log).toEqual(['0:a', '1:c']); + }); + } it('should handle arguments objects like arrays', function() { var args,