aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Bosch2013-12-18 18:51:56 -0800
committerTobias Bosch2013-12-18 21:44:00 -0800
commit274a6734ef1fff543cc50388a0958d1988baeb57 (patch)
treefcf0b5d9646e6406c3cbb306be693cae590d13a2
parentf0e3dfd008b1fa5550298aba7f913d6ce0395bde (diff)
downloadangular.js-274a6734ef1fff543cc50388a0958d1988baeb57.tar.bz2
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.
-rw-r--r--src/Angular.js4
-rw-r--r--test/AngularSpec.js15
2 files changed, 18 insertions, 1 deletions
diff --git a/src/Angular.js b/src/Angular.js
index 88ea452b..386682a3 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 36d4926e..7fe65f4c 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 = "<p>" +
+ "<a name='x'>a</a>" +
+ "<a name='y'>b</a>" +
+ "<a name='x'>c</a>" +
+ "</p>";
+
+ 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,