You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.5 KiB
53 lines
1.5 KiB
export default function load(src, opts, cb) { |
|
var head = document.head || document.getElementsByTagName('head')[0]; |
|
var script = document.createElement('script'); |
|
if (typeof opts === 'function') { |
|
cb = opts; |
|
opts = {}; |
|
} |
|
opts = opts || {}; |
|
cb = cb || function () {}; |
|
script.type = opts.type || 'text/javascript'; |
|
script.charset = opts.charset || 'utf8'; |
|
script.async = 'async' in opts ? !!opts.async : true; |
|
script.src = src; |
|
if (opts.attrs) { |
|
setAttributes(script, opts.attrs); |
|
} |
|
if (opts.text) { |
|
script.text = '' + opts.text; |
|
} |
|
var onend = 'onload' in script ? stdOnEnd : ieOnEnd; |
|
onend(script, cb); |
|
// some good legacy browsers (firefox) fail the 'in' detection above |
|
// so as a fallback we always set onload |
|
// old IE will ignore this and new IE will set onload |
|
if (!script.onload) { |
|
stdOnEnd(script, cb); |
|
} |
|
head.appendChild(script); |
|
} |
|
function setAttributes(script, attrs) { |
|
for (var attr in attrs) { |
|
script.setAttribute(attr, attrs[attr]); |
|
} |
|
} |
|
function stdOnEnd(script, cb) { |
|
script.onload = function () { |
|
this.onerror = this.onload = null; |
|
cb(null, script); |
|
}; |
|
script.onerror = function () { |
|
// this.onload = null here is necessary |
|
// because even IE9 works not like others |
|
this.onerror = this.onload = null; |
|
cb(new Error('Failed to load ' + this.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 |
|
}; |
|
}
|
|
|