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;
}
(+1) Dobre pytanie. –