Ich möchte ein Skript-Tag dynamisch in eine Webseite einfügen, habe aber keine Kontrolle über dessen Quellcode, so dass src = "source.js" möglicherweise so aussieht.
document.write('<script type="text/javascript">')
document.write('alert("hello world")')
document.write('</script>')
document.write('<p>goodbye world</p>')
Jetzt gewöhnlich setzen
<script type="text/javascript" src="source.js"></script>
im Kopf funktioniert gut, aber gibt es eine andere Möglichkeit, source.js dynamisch mit so etwas wie innerHTML hinzuzufügen?
var my_awesome_script = document.createElement('script');
my_awesome_script.setAttribute('src','http://example.com/site.js');
document.head.appendChild(my_awesome_script);
Sie können die Funktion document.createElement()
folgendermaßen verwenden:
function addScript( src ) {
var s = document.createElement( 'script' );
s.setAttribute( 'src', src );
document.body.appendChild( s );
}
Es gibt die Funktion onload
, die aufgerufen werden kann, wenn das Skript erfolgreich geladen wurde:
function addScript( src,callback) {
var s = document.createElement( 'script' );
s.setAttribute( 'src', src );
s.onload=callback;
document.body.appendChild( s );
}
ein nettes kleines Skript, das ich geschrieben habe, um mehrere Skripte zu laden:
function scriptLoader(scripts, callback) {
var count = scripts.length;
function urlCallback(url) {
return function () {
console.log(url + ' was loaded (' + --count + ' more scripts remaining).');
if (count < 1) {
callback();
}
};
}
function loadScript(url) {
var s = document.createElement('script');
s.setAttribute('src', url);
s.onload = urlCallback(url);
document.head.appendChild(s);
}
for (var script of scripts) {
loadScript(script);
}
};
verwendungszweck:
scriptLoader(['a.js','b.js'], function() {
// use code from a.js or b.js
});
Sie können versuchen, den folgenden Codeausschnitt zu verwenden.
function addScript(attribute, text, callback) {
var s = document.createElement('script');
for (var attr in attribute) {
s.setAttribute(attr, attribute[attr] ? attribute[attr] : null)
}
s.innerHTML = text;
s.onload = callback;
document.body.appendChild(s);
}
addScript({
src: 'https://www.google.com',
type: 'text/javascript',
async: null
}, '<div>innerHTML</div>', function(){});
die einzige Möglichkeit, dies zu tun, besteht darin, document.write
durch Ihre eigene Funktion zu ersetzen, die Elemente am Ende Ihrer Seite anfügt. Mit jQuery ist das ganz einfach:
document.write = function(htmlToWrite) {
$(htmlToWrite).appendTo('body');
}
Wenn Sie HTML-Code haben, der wie im Beispiel für eine Frage in die Datei document.write eingeht, müssen Sie die Segmente htmlToWrite
puffern. Vielleicht so etwas:
document.write = (function() {
var buffer = "";
var timer;
return function(htmlPieceToWrite) {
buffer += htmlPieceToWrite;
clearTimeout(timer);
timer = setTimeout(function() {
$(buffer).appendTo('body');
buffer = "";
}, 0)
}
})()
Nun, es gibt mehrere Möglichkeiten, wie Sie dynamisches Javascript einbinden können. Ich verwende dieses für viele Projekte.
var script = document.createElement("script")
script.type = "text/javascript";
//Chrome,Firefox, Opera, Safari 3+
script.onload = function(){
console.log("Script is loaded");
};
script.src = "file1.js";
document.getElementsByTagName("head")[0].appendChild(script);
Sie können create eine universelle Funktion aufrufen, mit der Sie beliebig viele Javascript-Dateien laden können. Hier finden Sie eine vollständige Anleitung dazu.
Ich habe es versucht, indem ich jedes Skript rekursiv angehängt habe
Hinweis Wenn Ihre Skripte nacheinander abhängen, muss die Position synchron sein.
Die Hauptabhängigkeit sollte im Array last sein, damit sie von den ersten Skripten verwendet werden kann
const scripts = ['https://www.gstatic.com/firebasejs/6.2.0/firebase-storage.js', 'https://www.gstatic.com/firebasejs/6.2.0/firebase-firestore.js', 'https://www.gstatic.com/firebasejs/6.2.0/firebase-app.js']
let count = 0
const recursivelyAddScript = (script, cb) => {
const el = document.createElement('script')
el.src = script
if(count < scripts.length) {
count ++
el.onload = recursivelyAddScript(scripts[count])
document.body.appendChild(el)
} else {
console.log('All script loaded')
return
}
}
recursivelyAddScript(scripts[count])