2009-07-01 11 views
10

Próbuję zrobić następujące (używam biblioteki prototyp):Dlaczego nie mogę dodać ciąg zawierający znacznik skryptu innerHTML w IE

var div = document.createElement('div'); 
div.innerHTML = '<script src="somescript.js"></script>'; 
$('banner').insert(div); 

w IE, div.innerHTML Właściwość jest zawsze równa "" po ustawieniu właściwości w drugim wierszu.

Ten fragment znajduje się wewnątrz funkcji, która nadpisuje document.write() w zewnętrznym skrypcie dostawcy, dlatego właśnie robię to w ten sposób, zamiast tworzyć element skryptu i dołączać go bezpośrednio do elementu div.

Każda pomoc będzie naprawdę doceniona, to daje mi siwe włosy!

+0

(+1) Dobre pytanie. –

Odpowiedz

6

można spróbować zrobić coś takiego zamiast:

function loadScript(src) { 
     var script = document.createElement("script"); 
     script.type = "text/javascript"; 
     document.getElementsByTagName("head")[0].appendChild(script); 
     script.src = src; 
} 

czy

.. 
div.innerHTML = "<script src=\"somescript.js\"></script>"; 
.. 
+4

+1 dla pierwszej opcji. –

+0

Ja również wolę pierwszą. Jest znacznie czystszy i nadaje się do wielokrotnego użytku. Drugi był tylko sugestią "spróbuj-to", jeśli nie chce skorzystać z 1. podejścia :) – Juri

+0

Mam niejasne przekonanie, że problem PO jest w rzeczywistości funkcją bezpieczeństwa w pracy, a twoją pierwszą odpowiedzią jest tutaj konwencjonalna (i nieblokujące!). – annakata

1

Czy próbowałeś dodać wbudowany JS zamiast ładowania pliku .js? Zrobiłem to w przeszłości i to działało dobrze dla mnie. Nie jestem pewien, czy to nadal działałoby z ostatnimi przeglądarkami/błędami bezpieczeństwa.

HTH.

7

Tag skrypt jest prawdopodobnie zarządzający powinien być interpretowany w sposób niezależny. Wypróbuj:

div.innerHTML = '<scr' + 'ipt src="somescript.js"></scr' + 'ipt>'; 
+0

Jest to częsty problem z używaniem znaczników skryptów w kodzie i bardzo prawdopodobny problem tutaj. – jcoder

+0

To jest interesujące. Czy możesz rozwinąć? – bitsprint

+0

+1 To brzmi dla mnie jak problem. – RedFilter

11

Ten też mnie znudził. Okazuje się, że IE nie zezwala na wstawianie JS bezpośrednio przez innerHTML, chyba że dodasz właściwość "odroczyć" (patrz drugi link poniżej). Ta właściwość jest unikalna dla IE i najwyraźniej pozwala IE odroczyć wykonanie dowolnego JS do czasu załadowania innych znaczników. Ostrzeżenie, chociaż ... jeśli umieścisz dwa znaczniki skryptu (tak jak ja), nie ma żadnej gwarancji, która z nich zostanie wykonana jako pierwsza, ponieważ skrypty wydają się być ładowane asynchronicznie. To powinno być problemem tylko wtedy, gdy twoje skrypty są zależne od siebie nawzajem (tak jak moje były).

Istnieje również dodatkowe zastrzeżenie ... musisz wstawić nie-skryptowe znaczniki w tym samym czasie, w którym wstawiasz skrypt. Nie mogłem samodzielnie wstawić znaczników skryptów z lub bez właściwości "odroczyć". Na koniec znaczniki skryptów muszą być umieszczone po wstawieniu wszystkich innych znaczników poza skryptami. W przeciwnym razie znaczniki skryptu są usuwane z wstawionego kodu HTML.

Oto kilka odnośników:

MS innerHTML referencyjne:

http://msdn.microsoft.com/en-us/library/ms533897%28v=vs.85%29.aspx

MS Defer nieruchomości Numer referencyjny:

http://msdn.microsoft.com/en-us/library/ms533719%28v=vs.85%29.aspx

przykładem Script Insert poprzez kod (tak, to faktycznie działa):

http://samples.msdn.microsoft.com/workshop/samples/author/dhtml/refs/insertScript_2.htm

mojego kodu testu:

// I downloaded the MS example file above and tweaked their script a bit, 
// resulting in this. Using the proper approach to the defer property 
// (namely: defer="defer") did not provide me with consistent results, so 
// sticking with 'DEFER' may be necessary. 
// Note: Try moving the 'sHTML' variable to the end of the script string. 
function insertScript2() 
{ 
    var sHTML="<input type=button onclick=" + "go2()" + " value='Click Me'><BR>"; 
    var sScript = sHTML + "<SCRIPT DEFER type='text/javascript'> function go2(){ alert('Hello from inserted script.') } </SCRIPT" + ">"; 
    ScriptDiv.innerHTML = sScript; 
} 
Powiązane problemy