Internet Explorer ve Hayatımıza Kazandırdıkları: 80004004

Murat Demirten

Bugün karşılaştığım oldukça can sıkıcı bir Internet Explorer problemini ve çözümünü hızlıca yazmak istiyorum. Çok genel bir hata olduğu için internette çözüm bulmak da pek olası değil, umarım birilerinin işine yarar.

Internet Explorer’ı fanatizm perspektifinden bakarak eleştirenlerden olduğum söylenemez ama bu browser yüzünden harcanan zamanı ve toplam enerjiyi hesaba kattığımızda acaba küresel ısınmada buna düşen pay ne kadardır diye düşünüyor insan bazen…

Rails projelerinde kullandığımız metin bilgi giriş alanlarındaki otomatik tamamlama özelliğini, biraz daha yetenekli bir javascript ile değiştirmek için çalışmaya başladım. http://www.devbridge.com/projects/autocomplete adresindeki autocomplete.js tam da ihtiyacım olan şeydi, indirip kullanmaya başladım. Her şey güzeldi.. ta ki Explorer ile sayfayı test edene kadar:

80004004

Sadece hata kodu olarak: 80004004 numarasını ekrana basıyor ve daha sonra genel “operation failed” sayfasını ekrana getiriyordu. Biraz araştırdıktan sonra bu hata numarasının WINERROR.H dosyasında tanımlı, genel “OPERATION FAILED” hatasına karşılık geldiğini öğrendim.

Eğer 80004004 hatasını aldıysanız, bu noktadan sonra Explorer içerisindeki Javascript debugger da devrede olamıyor, sayfanın Javascript’inde hata var denmediği için de problemi bulmanız iyice zor hale geliyor.

Biraz incelemeden sonra problemin, document.body.appendChild(); fonksiyonunun kullanılmasından kaynaklandığını farkettim. Internet Explorer, bir doküman tam olarak yüklenmeden, javascript içerisinden body elementine appendChild() ile yeni elemanlar eklenmesinden pek hoşlanmıyormuş. 80004004 genel bir işletim sistemi hata mesajı olduğundan, internette yaptığım aramalarda tamamen birbiriyle alakasız sorunlar ve çözüm yöntemleri gördüm. Problemin temelinde yatan sıkıntı ise, yukarıda bahsettiğim, sayfa yüklenmeden body.appendChild() metodunun kullanılıyor olması.

Buradan hareketle çözümlerden ilki, sayfa yüklendikten sonra appendChild() yöntemini kullanmak. Bunun için pek çok farklı yöntem mevcut, ben Prototype javascript kütüphanesi içerisindeki dom:loaded event’ini kullandım:

 

 

function loadAC1()
{ new Autocomplete(’copyright_owner’,
{ serviceUrl:’/resim/autocomplete_copyright_owner’,
minChars:2}); } Event.observe(document, ‘dom:loaded’, loadAC1, false);

 

Bu yöntemle, ‘dom:loaded’ event’i geldiğinde loadAC1 fonksiyonu çağırılıyor ve sorun ortadan kalkıyor. ‘dom:loaded’ event’ini kullanmanın window.onload event’ine fonksiyonu register etme yöntemine göre avantajı, sadece html’in yüklenmesi bittiğinde ‘dom:loaded’ event’inin oluşuyor olmasıdır. ‘window.onload’ ise css ve resim dosyaları da yüklendikten sonra tetiklendiği için bir miktar zaman kaybı oluşabilir.

İkinci çözüm yaklaşımı ise,

bloğunu bir taşıyıcı eleman içerisine alıp, document.body.appenChild() kullanmak yerine, document.getElementById(”container”).appendChild() yöntemini kullanmak şeklinde olabilir. <p>Javascript konusunda uzman değilim, belki daha kısa yöntemler de olabilir ancak çözüme giden her yöntemde, ya işlemin sayfa yüklendikten sonra çalışmasını garanti etmek, ya da body yerine, taşıyıcı bir bloka appendChild() ile yeni html kodu eklenmesini sağlamak gerekiyor.