Home > Javascript | Web Programlama > Javascript’de harici bir kodu global alanda çalıştırmak.

Javascript’de harici bir kodu global alanda çalıştırmak.

Posted on 22 Şubat 2007 | 5 Yorum

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.

» Tags: , , , , ,

5 Yorum

  • At 2007.02.22 09:29, Mustafa KUTLU said:

    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?

    • At 2007.02.22 14:03, Fatih Tolga Ata said:

      Javascript deyince acıktığını hisediyorsun herhalde :)
      vesselam.

      • At 2007.02.25 20:22, mehmet said:

        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.

        • At 2007.10.19 11:21, özkan danacı said:

          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.

          • At 2007.10.19 14:33, Fatih Tolga Ata said:

            Ö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.

            (Required)
            (Required, will not be published)

            Switch to our mobile site