Javascript’de harici bir kodu global alanda çalıştırmak.
Bildiğiniz gibi eval fonksiyonu, gerekmedikçe kullanılmayacak cinsten bir fonksiyondur. Çünkü normal çalışan bir scriptten çok daha yavaş çalışır. Ama bazen olurki eval fonksiyonunu kullanmanız şart olur. Kullanmanız gereken yerlerden bir tanesi de şüphesiz, remote yüklenen, yani harici olarak yüklediğiniz scriptleri çalıştırırken eval fonksiyonunu kullanmaktır. Ama genelde eval fonksiyonunu, bir başka fonksiyon içinden çağırırsınız ve global etki alanında çalışmasını istersiniz.
Bu meselenin çözümünü ararken, her zamanki gibi çözümümüzün cross-browser olmasına dikkat ediyoruz. Dojo kütüphanesine göz gezdirdiğinizde, require fonksiyonunda dj_global.eval ifadesine rastlarsınız. dj_global, Dojo’da global etki alanına işaret eden bir nesnedir. Siz de bunun gibi bir şeyler yapmaya kalkdığınızda ilk başlarda IE’nin engeline takılacaksınız. Bunun yerine daha kalıcı bir yöntem bulmamız gerekiyor.
İlk akla gelen yöntem window.event ile kodu window etki alanında çalıştırmak olacaktır. Tabi her browser’a sahip olamadığımızdan bunun Safari gibi bir browser’da çalışmayacağını bilemezdik. Aynı şekilde IE’de bulunan bir fonksiyon, scripti global alanda çalıştırmak için tasarlanmıştır. Bunun için, browser’lara göre ayrı fonksiyonları kullanmamız gerekecek. Bunun için browser’ları ayırt eden bir fonksiyonunuz olduğunu varsayıyorum.
var execute = function(code)
{
if (window.execScript) //IE için
window.execScript(code);
else if (isSafari) //Safari için
var temp = code.replace(/\\/g,'\\\\').replace(/"/g,'\\"').replace(/\n/g,"\\n");
setTimeout('eval("' + temp + '");', 0);
else
eval.call(window, code);//diğerleri için
}IE’de global alanda script çalıştırabilmek için execScript fonksiyonunu kullanıyoruz. Bu fonksiyon standart olmadığından sadece IE’de çalışıyor. Aynı şekilde Safari’de global alanda kod çalıştırabilen tek fonksiyon setTimeout fonksiyonu. isSafari değişkeni sizin önceden hesapladığınız bir değişken olacaktır. navigator.userAgent‘ı kullanarak browser’ın Safari olup olmadığını algılatabilirsiniz. Bununla ilgili internet üzerinde bir çok örnek mevcuttur. setTimeout fonksiyonu Safari’ye özgü bir komut değildir ve IE’de de kullanılır. Bunun için if(isSafari) yerine if (setTimeout) gibi bir şey kullanamayız. Her neyse, browser’ı nasıl algılattığınız size kalmış.
Diğer browser’larda ise call fonksiyonu ile eval‘i window etki alanında çalıştırıyoruz. Dikkatinizi çekecek bir başka nokta ise, setTimeout fonksiyonunu direk olarak setTimeout(code, 0); şeklinde de çalıştırabilirdik. Ama özellikle eval fonksiyonunu kullanmamızın nedeni debuging’i kolaylaştırmak içindir.
Umarım işinize yarar. Kolay gelsin.




Eline sağlık Fatih. Ama ben bunu mikroişlemcide nasıl kullanacam
Neyse belki gün gelir kullanırız. Daha nice güzel makalelerini bekliyorum. Bu arada site yöneticilerinden Doğanbir ile ilgili bir gelişme var mı? Bu zaatı muhterem yurtdışına falan mı kaçtı? Neden sesi soluğu çıkmıyor. Yemek ısmarlayacak onun için mi korkuyor?
Javascript deyince acıktığını hisediyorsun herhalde
vesselam.
Dojo ile ilgili kısmı anlamadım ama verdiğin kod çalışıyor. Macim olmadığından safaride deneyemedim ama ie ve ff’de sorun yok. Sağol.
Arkadaşlar öncelikle, hayırlı günler diliyorum herkese kolay gelsin. Askerden yeni geldim ve uzun bir aradan sonra tekrar döndüm çok şükür işime.Ve bu siteyi yeni gördüm ve çok hoşuma gitti. Gerçekten güzel konulara değinmiş arkadaşların ellerine sağlık.
Ben javascriptte “replace” komutunun içinde kullanılan “/\\/”… bunları pek anlayamıyorum bilen arkadaş varsa güzel bir açıklama yapabilir mi.
Öncelikle hoş geldin.
replace içinde kullanılan regexp’dir. Yani regular expression. Google’dan bunun hakkında ve javascript’de kullanımı hakkında geniş izahat bulabilirsin.
Kolay Gelsin.