From edd877d6ad2d39d82204b0700a451980e8652bf8 Mon Sep 17 00:00:00 2001 From: Ben March Date: Tue, 12 Jan 2016 11:47:48 -0500 Subject: [PATCH] Added IE8 support to script loading (also fixes quirky behavior in IE9 and IE10) --- angular-load.js | 2 +- angular-load.min.js | 2 +- angular-load.min.js.map | 2 +- tests.js | 15 +++++++++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/angular-load.js b/angular-load.js index 7ab5929..56403ed 100644 --- a/angular-load.js +++ b/angular-load.js @@ -16,7 +16,7 @@ var element = createElement(url); element.onload = element.onreadystatechange = function (e) { - if (element.readyState && element.readyState !== 'complete') { + if (element.readyState && element.readyState !== 'complete' && element.readyState !== 'loaded') { return; } diff --git a/angular-load.min.js b/angular-load.min.js index fab9504..c739a73 100644 --- a/angular-load.min.js +++ b/angular-load.min.js @@ -1,2 +1,2 @@ -!function(){"use strict";angular.module("angularLoad",[]).service("angularLoad",["$document","$q","$timeout",function(a,b,c){function d(a){var d={};return function(e){if("undefined"==typeof d[e]){var f=b.defer(),g=a(e);g.onload=g.onreadystatechange=function(a){g.readyState&&"complete"!==g.readyState||c(function(){f.resolve(a)})},g.onerror=function(a){c(function(){f.reject(a)})},d[e]=f.promise}return d[e]}}var e=a[0];this.loadScript=d(function(a){var b=e.createElement("script");return b.src=a,e.body.appendChild(b),b}),this.loadCSS=d(function(a){var b=e.createElement("link");return b.rel="stylesheet",b.type="text/css",b.href=a,e.head.appendChild(b),b})}])}(); +!function(){"use strict";angular.module("angularLoad",[]).service("angularLoad",["$document","$q","$timeout",function(a,b,c){function d(a){var d={};return function(e){if("undefined"==typeof d[e]){var f=b.defer(),g=a(e);g.onload=g.onreadystatechange=function(a){g.readyState&&"complete"!==g.readyState&&"loaded"!==g.readyState||c(function(){f.resolve(a)})},g.onerror=function(a){c(function(){f.reject(a)})},d[e]=f.promise}return d[e]}}var e=a[0];this.loadScript=d(function(a){var b=e.createElement("script");return b.src=a,e.body.appendChild(b),b}),this.loadCSS=d(function(a){var b=e.createElement("link");return b.rel="stylesheet",b.type="text/css",b.href=a,e.head.appendChild(b),b})}])}(); //# sourceMappingURL=angular-load.min.js.map \ No newline at end of file diff --git a/angular-load.min.js.map b/angular-load.min.js.map index 0425c41..78ff43a 100644 --- a/angular-load.min.js.map +++ b/angular-load.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-load.min.js","sources":["angular-load.js"],"names":["angular","module","service","$document","$q","$timeout","loader","createElement","promises","url","deferred","defer","element","onload","onreadystatechange","e","readyState","resolve","onerror","reject","promise","document","this","loadScript","src","script","body","appendChild","loadCSS","href","style","rel","type","head"],"mappings":"CAEA,WACC,YAEAA,SAAQC,OAAO,kBACbC,QAAQ,eAAgB,YAAa,KAAM,WAAY,SAAUC,EAAWC,EAAIC,GAGhF,QAASC,GAAOC,GACf,GAAIC,KAEJ,OAAO,UAASC,GACf,GAA6B,mBAAlBD,GAASC,GAAsB,CACzC,GAAIC,GAAWN,EAAGO,QACdC,EAAUL,EAAcE,EAE5BG,GAAQC,OAASD,EAAQE,mBAAqB,SAAUC,GACnDH,EAAQI,YAAqC,aAAvBJ,EAAQI,YAIlCX,EAAS,WACRK,EAASO,QAAQF,MAGnBH,EAAQM,QAAU,SAAUH,GAC3BV,EAAS,WACRK,EAASS,OAAOJ,MAIlBP,EAASC,GAAOC,EAASU,QAG1B,MAAOZ,GAASC,IA5BlB,GAAIY,GAAWlB,EAAU,EAqCzBmB,MAAKC,WAAajB,EAAO,SAAUkB,GAClC,GAAIC,GAASJ,EAASd,cAAc,SAKpC,OAHAkB,GAAOD,IAAMA,EAEbH,EAASK,KAAKC,YAAYF,GACnBA,IAQRH,KAAKM,QAAUtB,EAAO,SAAUuB,GAC/B,GAAIC,GAAQT,EAASd,cAAc,OAOnC,OALAuB,GAAMC,IAAM,aACZD,EAAME,KAAO,WACbF,EAAMD,KAAOA,EAEbR,EAASY,KAAKN,YAAYG,GACnBA"} \ No newline at end of file +{"version":3,"sources":["angular-load.js"],"names":["angular","module","service","$document","$q","$timeout","loader","createElement","promises","url","deferred","defer","element","onload","onreadystatechange","e","readyState","resolve","onerror","reject","promise","document","this","loadScript","src","script","body","appendChild","loadCSS","href","style","rel","type","head"],"mappings":"CAEA,WACC,YAEAA,SAAQC,OAAO,kBACbC,QAAQ,eAAgB,YAAa,KAAM,WAAY,SAAUC,EAAWC,EAAIC,GAGhF,QAASC,GAAOC,GACf,GAAIC,KAEJ,OAAO,UAASC,GACf,GAA6B,mBAAlBD,GAASC,GAAsB,CACzC,GAAIC,GAAWN,EAAGO,QACdC,EAAUL,EAAcE,EAE5BG,GAAQC,OAASD,EAAQE,mBAAqB,SAAUC,GACnDH,EAAQI,YAAqC,aAAvBJ,EAAQI,YAAoD,WAAvBJ,EAAQI,YAIvEX,EAAS,WACRK,EAASO,QAAQF,MAGnBH,EAAQM,QAAU,SAAUH,GAC3BV,EAAS,WACRK,EAASS,OAAOJ,MAIlBP,EAASC,GAAOC,EAASU,QAG1B,MAAOZ,GAASC,IA5BlB,GAAIY,GAAWlB,EAAU,EAqCzBmB,MAAKC,WAAajB,EAAO,SAAUkB,GAClC,GAAIC,GAASJ,EAASd,cAAc,SAKpC,OAHAkB,GAAOD,IAAMA,EAEbH,EAASK,KAAKC,YAAYF,GACnBA,IAQRH,KAAKM,QAAUtB,EAAO,SAAUuB,GAC/B,GAAIC,GAAQT,EAASd,cAAc,OAOnC,OALAuB,GAAMC,IAAM,aACZD,EAAME,KAAO,WACbF,EAAMD,KAAOA,EAEbR,EAASY,KAAKN,YAAYG,GACnBA","file":"angular-load.min.js"} \ No newline at end of file diff --git a/tests.js b/tests.js index aeaf105..83fcaf3 100644 --- a/tests.js +++ b/tests.js @@ -64,6 +64,21 @@ describe('service angularLoad', function () { expect(resolved).toBeTruthy(); }); + it('should resolve the returned promise as soon as the script has finished loading when `onreadystatechange` callback is fired in IE8', function() { + var resolved = false; + angularLoad.loadScript('https://www.test.org/somescript.js').then(function() { + resolved = true; + }); + var scriptElement = mockDocument.body.appendChild.calls.mostRecent().args[0]; + scriptElement.readyState = 'loading'; + scriptElement.onreadystatechange({}); + expect(resolved).toBeFalsy(); + scriptElement.readyState = 'loaded'; + scriptElement.onreadystatechange({}); + $timeout.flush(); + expect(resolved).toBeTruthy(); + }); + it('should reject the returned promise if the script failed to load', function() { var rejected = false; angularLoad.loadScript('https://www.test.org/somescript.js').catch(function() {