2009-03-03 25 views
2

Bunun için basitleştirilmiş olabilir kod parçası vardır: IE dışındaki tüm tarayıcılardaIE, harici javascript işlevlerini çağırırken başarısız oluyor?

var s='' ; 

s += "<"+"script type=\"text/javascript\" src=\"http://somehost.com/scripts/FooFunctions.js\">\n"; 
s += "<"+"/script>" ; 
s += "<"+"script type=\"text/javascript\">\n"; 
s += "FooFunction(42, 'i love cats');\n"; 
s += "<"+"/script>" ; 

document.write(s) ; 

, bu beklediğiniz gibi çalıştırır - somehost.com/scripts/FooFunctions.js işten fonksiyonları beklendiği gibi .

Internet Explorer'da bu başarısız olur. Googling bu zor görünüyor. Ara sıra post ile aynı problemi buldum ama çözüm yok.

(Orada dış dosya javascript bu şekilde gelen dahil edilmesi gerektiğini geçerli bir nedendir ve pgae bir <script src="http://somehost.com/scripts/FooFunctions.js"> bunun takılı olması olamayacağını.)

Açık olmak gerekirse, soru: Yukarıdaki kod parçasını Internet Explorer'da olduğu gibi nasıl yapabilirim? FireFox?

cevap

2

bu deneyin, IE

komut yüklenmeden önce IE FooFunction aradığını gibi görünüyor

function addJsFile(jsFileLocation){ 
    var script=document.createElement('script'); 
    script.type='text/javascript'; 
    script.src=jsFileLocation; 
    document.getElementsByTagName("head")[0].appendChild(script); 
} 
addJsFile("http://code.jquery.com/jquery-latest.pack.js"); 
setTimeout(function(){alert(jQuery);},1000); 
+0

Tam olarak emin değil, ancak bu muhtemelen DOM iğnesi tarafından komut dosyası eklenmesi (burada ne yapıyorsunuz) komut dosyası yüklemelerini paralelleştirmediği için çalışır - bunlar seri olarak yüklenir. Bu nedenle, uyarıya() ulaştığınızda kullanılabilir olduğu garanti edilir. –

+0

Aslında bu yöntemi zaten denedim ve sorunu çözmek için görünmüyordu, ancak tekrar deneyeceğim. – mozboz

0

çalışır. Bunu, bir saniyenin komut dosyasının yüklenmesi için yeterli zaman olduğunu varsayarak, setTimeout("FooFunction(42, 'i love cats')", 1000); kullanarak test edebilirsiniz, bu çağrı başarılı olacaktır.

ne zaman komut dosyası yükler bir geri verecektir komut dosyaları, yüklemek için jQuery gibi bir çerçeve kullanamıyorsanız, sen FooFunction

+0

IE'de, ne zaman yüklendiğini öğrenmek için betik etiketine bir onreadystatechange işleyicisi (AJAX benzeri) ekleyebilirsiniz. – some

0

As kontrol setInterval ile kendi kesmek mümkün olabilir document.write çağrısı tamamlandığında, ikinci betik etiketinde işlevi çalıştıracaktır. Harici komut dosyasının henüz yüklü olup olmadığına bakılmaksızın. Bu sadece bir IE sorunu olmamalı, tüm tarayıcıları etkilemelidir. Harici komut dosyası önbelleğe sahip olduğundan, diğer tarayıcıları etkilemediğinden emin misiniz? Önbelleğinizi temizledikten ve başka bir tarayıcıda tekrar denediğinizde ne olur?

Her halükarda, ideal bir dünyada, betik etiketinde sadece .onload kullanabilmeniz gerekir, ancak IE6'da komut dosyalarında tetiklenmeyen onload ile ilgili sorunların olduğundan emin olduğumdan% 99 eminim. Bunun yerine pencere elemanındaki yük. Bu olay, yukarıdaki gibi harici js dosyaları dahil olmak üzere tüm betikler indirilinceye kadar tetiklenmeyecektir.

İlgili konular