Je souhaite inclure de manière dynamique une balise de script dans une page Web, mais je n'ai aucun contrôle sur sa source, donc src = "source.js" peut ressembler à ceci.
document.write('<script type="text/javascript">')
document.write('alert("hello world")')
document.write('</script>')
document.write('<p>goodbye world</p>')
Maintenant, mettant habituellement
<script type="text/javascript" src="source.js"></script>
dans la tête fonctionne bien mais est-il possible d'ajouter source.js de façon dynamique en utilisant quelque chose comme innerHTML?
var my_awesome_script = document.createElement('script');
my_awesome_script.setAttribute('src','http://example.com/site.js');
document.head.appendChild(my_awesome_script);
Vous pouvez utiliser la fonction document.createElement()
comme ceci:
function addScript( src ) {
var s = document.createElement( 'script' );
s.setAttribute( 'src', src );
document.body.appendChild( s );
}
Il y a la fonction onload
, qui pourrait être appelée une fois le script chargé:
function addScript( src,callback) {
var s = document.createElement( 'script' );
s.setAttribute( 'src', src );
s.onload=callback;
document.body.appendChild( s );
}
un joli petit script que j'ai écrit pour charger plusieurs scripts:
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);
}
};
usage:
scriptLoader(['a.js','b.js'], function() {
// use code from a.js or b.js
});
Vous pouvez essayer de suivre l'extrait de code.
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(){});
la seule façon de faire est de remplacer document.write
par votre propre fonction qui ajoutera des éléments au bas de votre page. C'est assez simple avec jQuery:
document.write = function(htmlToWrite) {
$(htmlToWrite).appendTo('body');
}
Si html arrive dans document.write en morceaux comme dans l'exemple de la question, vous devrez mettre en mémoire tampon les segments htmlToWrite
. Peut-être quelque chose comme ça:
document.write = (function() {
var buffer = "";
var timer;
return function(htmlPieceToWrite) {
buffer += htmlPieceToWrite;
clearTimeout(timer);
timer = setTimeout(function() {
$(buffer).appendTo('body');
buffer = "";
}, 0)
}
})()
Eh bien, il existe de nombreuses façons d'inclure du javascript dynamique. J'utilise celui-ci pour de nombreux projets.
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);
Vous pouvez appeler créer une fonction universelle qui peut vous aider à charger autant de fichiers javascript que nécessaire. Il y a un tutoriel complet à ce sujet ici.
Je l'ai essayé en ajoutant récursivement chaque script
Note Si vos scripts dépendent les uns des autres, la position devra être synchronisée.
La dépendance majeure doit figurer en dernier dans array pour que les scripts initiaux puissent l'utiliser
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])