From 1bdca93d708ce9441b26d00e564210755395edf7 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Mon, 18 Aug 2014 10:39:33 -0700 Subject: [PATCH] fix(jqLite): revert the #ready() optimization until jQuery does the same The change unfortunatelly makes us incompatible with jQuery which always falls back to onLoad. Not falling back to onLoad is a possible breaking change because if Angular was added to the document during DOMContentLoaded document.readyState at this point is 'interactive' which we'd need to add to our check, but more importantly if more scripts are added during DOMContentLoaded these won't be loaded before we bootstrap, which can cause angular modules not to be found during bootstrap. This load ordering issues is really just a cornercase that should be handled via manual bootstrap, but until jQuery has the same behavior we shouldn't do something else. --- src/jqLite.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/jqLite.js b/src/jqLite.js index 42c708f3..bf356532 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -454,11 +454,24 @@ function jqLiteRemove(element, keepData) { ////////////////////////////////////////// var JQLitePrototype = JQLite.prototype = { ready: function(fn) { - // check if document already is loaded + var fired = false; + + function trigger() { + if (fired) return; + fired = true; + fn(); + } + + // check if document is already loaded if (document.readyState === 'complete'){ - setTimeout(fn); + setTimeout(trigger); } else { - this.on('DOMContentLoaded', fn); + this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9 + // we can not use jqLite since we are not done loading and jQuery could be loaded later. + // jshint -W064 + JQLite(window).on('load', trigger); // fallback to window.onload for others + // jshint +W064 + this.on('DOMContentLoaded', trigger); } }, toString: function() {