2012-10-29 13 views
78

Chcę dynamicznie dołączać znacznik skryptu na stronie internetowej, ale nie mam kontroli nad jego src, więc src = "source.js" może wyglądać tak.Dynamicznie dodawaj znacznik skryptu z src, który może zawierać document.write

document.write('<script type="text/javascript">') 
document.write('alert("hello world")') 
document.write('</script>') 
document.write('<p>goodbye world</p>') 

Teraz zwykle oddanie

<script type="text/javascript" src="source.js"></script> 

w głowie działa dobrze, ale czy jest jakiś inny sposób mogę dodać source.js dynamicznie przy użyciu coś jak innerHTML?

jsfiddle of what i've tried

+2

po godzinach zmaga postscribe jest rozwiązaniem! [https://github.com/krux/postscribe/](https://github.com/krux/postscribe/) –

+0

Możliwy duplikat [async loading javascript with document.write] (http://stackoverflow.com/ pytania/13003644/async-loading-javascript-with-document-write) –

Odpowiedz

108
var my_awesome_script = document.createElement('script'); 

my_awesome_script.setAttribute('src','http://example.com/site.js'); 

document.head.appendChild(my_awesome_script); 
49

Można użyć funkcji document.createElement() takiego:

function addScript(src) { 
    var s = document.createElement('script'); 
    s.setAttribute('src', src); 
    document.body.appendChild(s); 
} 
+0

Jak byś to zrobił asynchronicznie? –

+0

@mobile bloke: s.async = true; – axlotl

+0

s.setAttribute ('src', src); może być s.src = src (myślę?) Wiem, że to nie jest pcg – Brandito

35

There Is onload funkcję, która ma zostać wykonana kiedy Script obciążenia Pomyślnie:

function addScript(src,callback) { 
    var s = document.createElement('script'); 
    s.setAttribute('src', src); 
    s.onload=callback; 
    document.body.appendChild(s); 
} 
7

miły mały skrypt napisałem, aby załadować wiele skryptów:

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); 
    } 
}; 

Wykorzystanie:

scriptLoader(['a.js','b.js'], function() { 
    // use code from a.js or b.js 
}); 
+0

Niestety ... znalazłem lepszy, który zezwala na zależności http://stackoverflow.com/a/1867135/678780 – EliSherer

0

jedynym sposobem, aby to zrobić, to wymienić document.write z własnej funkcji, która dołączy elementy na dole strony. Jest to dość proste z jQuery:

document.write = function(htmlToWrite) { 
    $(htmlToWrite).appendTo('body'); 
} 

Jeśli masz html przyjście do document.write w kawałkach takich jak np zapytania trzeba buforować segmenty htmlToWrite. Może coś takiego:

document.write = (function() { 
    var buffer = ""; 
    var timer; 
    return function(htmlPieceToWrite) { 
    buffer += htmlPieceToWrite; 
    clearTimeout(timer); 
    timer = setTimeout(function() { 
     $(buffer).appendTo('body'); 
     buffer = ""; 
    }, 0) 
    } 
})() 
0

Możesz wypróbować następujący fragment kodu.

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 
}); 
Powiązane problemy