|
@@ -0,0 +1,39 @@
|
|
|
+const dynamicLoadScript = (src, callback) => {
|
|
|
+ const existingScript = document.getElementById(src)
|
|
|
+ const cb = callback || function() {}
|
|
|
+
|
|
|
+ if (!existingScript) {
|
|
|
+ const script = document.createElement('script')
|
|
|
+ script.src = src // src url for the third-party library being loaded.
|
|
|
+ script.id = src
|
|
|
+ document.body.appendChild(script)
|
|
|
+
|
|
|
+ const onEnd = 'onload' in script ? stdOnEnd : ieOnEnd
|
|
|
+ onEnd(script, cb)
|
|
|
+ }
|
|
|
+
|
|
|
+ if (existingScript && cb) cb(null, existingScript)
|
|
|
+
|
|
|
+ function stdOnEnd(script, cb) {
|
|
|
+ script.onload = function() {
|
|
|
+ // this.onload = null here is necessary
|
|
|
+ // because even IE9 works not like others
|
|
|
+ this.onerror = this.onload = null
|
|
|
+ cb(null, script)
|
|
|
+ }
|
|
|
+ script.onerror = function() {
|
|
|
+ this.onerror = this.onload = null
|
|
|
+ cb(new Error('Failed to load ' + src), script)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function ieOnEnd(script, cb) {
|
|
|
+ script.onreadystatechange = function() {
|
|
|
+ if (this.readyState !== 'complete' && this.readyState !== 'loaded') return
|
|
|
+ this.onreadystatechange = null
|
|
|
+ cb(null, script) // there is no way to catch loading errors in IE8
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+export default dynamicLoadScript
|