6 Şubat Çarşamba ´08   —   11 Yorum

Ajax Nedir?


Ajax aslında modern tarayıcıların desteklediği XMLHttpRequest özelliğini kullanarak sayfa yenilemeden istek yapıp cevap almamızı sağlayan birşeydir.

XMLHttpRequest hakkında bilgi için buraya tıklayın.

Çoğu sitede görmeye alışık olduğumuz birşey haline gelmeye başladı aslında ajax. Çünkü web 2.0 uygulamalarının neredeyse ana çatısını oluşturuyor. Web 2.0 yazılımları 2.0 yapan şey aslında kullanıcı etkileşimi ve bu etkileşimden kastımız aslında bir web uygulamasının sanki masaüstü uygulaması gibi çalışması. Bu da aslında Sunucu-Kullanıcı istek-cevap ilişkisini sayfa yenilemeden yani kullanıcı için hazırladığınız ARAYÜZü yenilemeden birçok işi yapmaktan geçiyor. Tabiki bunu da XMLHttpRequest'i kolay hale getirip kullanmamızı sağlayan ajax kütüphaneleri yapıyor.

İnternette çok sayıda ajax kütüphanesine rastlayabilirsiniz, genellikle 3-5 satır kod ile istek ve cevabı işleyebiliyor. Fakat bu sitede mootools odaklı gittiğim için bu dökümanda mootools ile ajax eklentisini kullanmayı göreceğiz. Diğer kütüphaneleri de kullanarak farkı görebilirsiniz.


Mootools ve ajax


http://mootools.net/ adresinden mootools'u ajax seçeneği ile derleyerek indirmelisiniz. Sayfa başında mootools.js dosyasını include edin. Basitçe ajax isteği için kod bloğu şöyle :
new Ajax('icerik_alinacak_dosya.php', {
  method: 'get',
  update: $('icerik_basilacak_element_id')
}).request();
Çoğu mootools eklentisi, nesnesindeki gibi zorunlu kısımlar nesneye ilk parametrelerde veriliyor. Sonra da bir ayar dizesi (nesne olarak)
şeklinde 2. parametre belirleniyor.

Burada ilk parametre string olarak istek yapılacak url, yani istek yapılacak dosya adı. Bir php dosyası veya html dosyası veya dışarıda bir web sayfası urlsi olabilir. Ayar dizesindeki parametrelerden önemli olanların açıklamaları da şöyle :
data            Gönderilecek url parametreleri. Aşağıda açıklamasını yapacağım.

method          İstek methodu, get veya post olabilir.

update          Cevap geldiği zaman içeriğin yerleştirileceği html nesnesi adresi

onComplete      Cevap geldiği zaman işletilecek javascript kodu, fonksiyon olarak
                belirtilmesi gerekiyor ve fonksiyonun ilk parametresi cevap dönen
                içeriği string olarak fonksiyona sokar.

evalScripts     XMLHttpRequest ve çoğu diğer ajax kütüphanelerindeki ana sorun,
                cevap gelen içerik içerisinde eğer bir javascript kod bloğu veya
                dosya include varsa Normalde bu kısımlar çalıştırılmaz.
                Bu popüler bir sorundur, bu parametreye true değeri vererek
                bu sorunu aşabilirsiniz (Mootools'u seviyorum).
Şimdi bu parametreleri örneklerle açıklama çalışacağım. Önce bir bağlantıyı (link) ajax ile çağırıp dönen içeriği ekranda bir bölüme yazdıralım.
...
<a href="#" onClick="ajax_istek('hakkinda.html');">Hakkında</a>
<a href="#" onClick="ajax_istek('iletisim.html');">iletişim</a>
...
<div id="icerik"></div>
...
Bu sayfamız olsun. Linke tıklantığında ajax_istek fonksiyonunu url parametresiyle çağırıyor görüldüğü gibi. Ayrıca icerik kimlikli bir div var. İçeriği buraya basacağız.
function ajax_istek(hedef){
  new Ajax(hedef, {
    update: $('icerik')
  }).request();
}
Basit bir ajax isteği gördüğünüz gibi. Şimdi bunu biraz geliştirelim ve linke tıklandığında sayfa içeriği "Yükleniyor" olsun, içerik geldiğinde de zaten yükleniyor kalkacak.
function ajax_istek(hedef){
  $('icerik').setHTML('Yükleniyor');
  new Ajax(hedef, {
    update: $('icerik')
  }).request();
}
Biraz daha geliştirip yüklenme işlemi bittiğinde birşeyler yaptıralım.
function ajax_istek(hedef){
  $('icerik').setHTML('Yükleniyor');
  new Ajax(hedef, {
    update: $('icerik'),
    onComplete: function(){
      alert("Sayfa Yüklendi");
    }
  }).request();
}
Örneğin burada alert yerine sayfanın bir köşesinde bu uyarıyı gösterip gizletebilirsiniz, Ya da içeriği basmayıp bir işlem yaptırabilirsiniz. Bunu örneklemek için işe biraz form katacağım. mfyz.com'da üye kayıt sayfasında kullanıcı adı kontrol mekanizmasını anlatacağım. Kayıt formuna girdiğinizde kullanıcı adı seçip yazdıktan sonra bilgi giriş kutusundan çıktığınızda (yani başka bir nesenye odaklandığınızda) otomatik olarak kullanıcı adının veritabanında olup olmadığını sorgulayıp cevabı geliyor ve ona göre kutu yeşil veya kırmızı oluyor farkında iseniz.
<input type="text" id="kadi" onBlur="kullanici_adi_kontrol_et(this.value);">
şeklinde bir inputum var ve onBlur olayına yani kutudan odak gittiğinde bir fonksiyon çağırıyorum.
function kullanici_adi_kontrol_et(kadi){

  // kullanici adini veritabanindan kontrol
  // edecek php dosyasina sorgulatiyorum
  new Ajax('kullanici_adi_kontrol.php', {
    method : 'get',
    data: 'kadi = ' + kadi,
    onComplete: function(cevap){
      if(cevap == 'OK'){
        // kullanici adi giris kutusunun kenrlığını yeşil yapalım
        $('kadi').setStyles({
          'border' : '1px solid green'
        });
      }else{
        // kullanici adi giris kutusunun kenrlığını kırmızı yapalım
        $('kadi').setStyles({
          'border' : '1px solid red'
        });
        // ve gelen hatayi basalim
        alert(cevap);
      }
    }
  }).request();

}
Bakın burada 2 parametreyi örnekledim. Birisi data parametresi diğeri de update kullanmak zorunda olmadığımız. Ayrıca onComplete'de tanımladığımız fonksiyonun ilk parametresi yani cevap değişkeni ajax ile dönen içeriği alıyor.

Yukarıda yaptırdığım işlem özetle şöyle: kullanici_adi_kontrol.php dosyası get methodu ile gelen kadi değişkenindeki string'i veritabanında aratıyor. Eğer yoksa ekrana sadece "OK" basıyor. Eğer başka bir hata varsa hatayı basıyor. Mesela kullanıcı adında geçersiz karakterler var veya veritabanında o kullanıcı mevcut. Yani hata varsa "OK" dışında birşeyler oluyor. PHP hatası da olabilir.

onComplete'da cevap değişkenini kontrol ettiriyorum. Eğer "OK" string'i ise kullanıcı adı yok yani ekrana başarı sinyali vermem gerek. Ben de etkileşimli olması için bilgi giriş kutusunun çerçevesini yeşil yapıyorum. Mootools ile css özniteliklerini değiştiriyorum. Eğer OK değilse bir hata vardır. Çerçeveyi kırmızı yapıp cevap değişkenini yani dönen hatayı ekrana yazdırıyorum alert ile.

Bu istekleri ve cevap işleme tekniklerini uygulamanıza göre geliştireceksiniz, Zaten burada o istek-cevap ilişkisinin boyutu önemli değil. Yani çok büyük istekler de yapabilirsiniz çok küçük de.


Formları otomatik ajax ile post etmek


Mootools'da çok güzel bir özellik daha var. Formunuzu çok pratik bir şekilde ajax ile göndermek.
<form id="bilgi_formu" action="kayit.php" method="post">
  Ad : <input type="text" name="ad"><br>
  Soyad : <input type="text" name="soyad"><br>
  <input type="submit" value="Gönder">
</form>
böyle bir formunuz olduğunu varsayalım. Oldukça basit yani. Gönder butonuna basıldığında normal şekilde kayit.php dosyasina post methodu ile 2 değişken gidiyor biliyorsunuz. kayit.php'de de bu değişkenleri işliyorsunuz.
$('bilgi_formu').send();
kodu sayesinde formu ajax ile gönderebilirsiniz. Gideceği url, methodu ve datası otomatik olarak bulunup gönderiliyor. Örnek kullanımını da şu kodlar özetleyebilirim :
<form id="bilgi_formu" action="kayit.php" method="post">
  Ad : <input type="text" name="ad"><br>
  Soyad : <input type="text" name="soyad"><br>
  <input type="button" onClick="gonder()" value="Gönder">
</form>

<script>
function gonder(){
  $('bilgi_formu').send({
    onComplete: function(){
      alert("Başarıyla gönderildi");
    }
  });
}
</script>
Gördüğünüz gibi submit yerine buton kullanarak bir fonksiyon çağırıyorum. ajax için kullandığımız send fonksiyonunun ilk parametresi ajax için kullandığımız ayar dizesi oluyor. Yani update ile gelen içeriği biryere yazdırabilir veya ajax için uyguladığımız taklaları burada da attırabilirsiniz.


Mootools ajax dökümantasyonu :http://docs.mootools.net/Remote/Ajax.js
Ajax Demoları :http://demos.mootools.net/Ajax
http://demos.mootools.net/Ajax.Form
Not : Nesnelere olay ekleyip bu işleri yaptırmak daha kolaydır. Mesela form ajax ile post etmek için submiti butona çevirmek ilkel bir mantıktır. Forma doğrudan onSubmit olayı ile kural belirleyerek yaparız aslında bu işlemleri. Fakat dökümanda daha fazla kafa karışıklığı yaratmaması için doğrudan fonksiyon çağırtıp işlem yaptırdım.
Hazırlayan : Mehmet Fatih YILDIZ
20 Ağustos Pazar ´06   —   4 Yorum

XMLHttpRequest Nedir?

XMLHttpRequest Microsoft'un bize kazandırdığı ender nimetlerden birisidir. Eskiden bi zamanlar ypaılmış tarih zırvalıklarına gerek olduğunu düşünmüyorum.

İlk önce Internet Explorer'ın bir ActiveX denetimi mi obje si midir nedir öyle çalışıyormuş ve XML ile tarayıcı yenilemeden url bazlı iletişim saplıyormuş. Tam yapılış amacını da bilmiyorum. Fakat daha sonra geliştirilmiş ve bazı web uygulamalarında kullanılmaya başlanmış. Ardından da Mozilla ve KHTML (Konqueror, Safari) gibi browser'lar da xmlhttprequest desteği sağlamaya başlamışlar. Tabi biz XMLHttpRequest olarak tanımadık bunu, birkaç (ne kadar bilmiyorum ama hatırladığım kadarıyla 5-6) sene kadar kullanıldıktan sonra AJAX denilen bir kod adıyla xmlhttprequest objesini kullanan bir kütüphane geliştirildi. Evet biz bu nesneyi ajax, sajax gibi adlarla tanıdık. Geliştiriciler için kolay (bence daha zor) javascript kütüphaneleri geliştirildikten sonra çok kısa sürede popüler kullanılan şeyler oldular.

Benim XMLHttpRequest ile maceram ise çook yeni, herhalde 5-6 ay olmuştur bununla tanışalı. Ajax kütüphanesi ilk çıktığında aşırı antipatik karşılamıştım. Duyduğum şeyler de zaten bu şeyin yeni olmadığı konusuydu, sonraki araştırmamda zaten bunu öğrendim. Sayfa yenilenmeden işlem yapmayı ben iframe'ler ile hallediyordum daha önceleri fakat xmlhttprequest sayesinde daha kompleks kodlar yazabiliyorum.

Tam olarak ne işe yapar?

Bu nesne söylediğim gibi ilk başta XML kodları şeklinde haberleştiriyormuş tarayıcı ile sunucuyu. Ama daha sonra plain text aktarımı da katılmış ve günümüzde biz genellikle sade metin transferi kullanıyoruz. Tabiki sade metin ile yapamadığımız bazı şeyleri XML transferi ile daha rahat çözebiliyoruz.

Tam olarak, sayfa yenilenmeden içerik alımı veya veri gönderimi yapmamızı sağlar. Şu an en yaygın bilinen proje olarak gmail'in arabirimini örnek verebilirim. Gmail'de mesaj kutularınız arasında veya mesaj formlarında sayfanız yenilenmez bildiğiniz gibi. Sadece gerekli içerik alınıp gerekli forma sokulup ekrana yerleştirilir. Aynı şekilde bir mesaj gönderdiğinizde de sonuç, sayfa yenilenmeden ekrana gelir “Mesaj gönderildi” veya hata mesajları.

Neden kullanmalıyız?

En önemli artısı, sayfa yenilenmediği için değişken olmayan diğer kısımların hem sunucuda yeniden işlenip sunucuyu yorması engellenir; hem de kullanıcıda tekrar yüklenmediğinden bant genişliği boşa harcanmaz, aynı zamanda kullanıcı tarafında sayfalarda daha hızlı işlem yapılır.
Sayfayı yenilenmeden içeriğimizi alıyor olmamız, web uygulamamıza bir masaüstü uygulama görünümü katar. Kurumsal projelerde bu tarz artılar her zaman iyidir. Çünkü web uygulamalarının tek sıkıntısı, hızlı ve pratik çalışamıyor olmanızdır. Yani kurumsal amaçla çalışan bir yazılım masaüstündeki yazılımlar gibi pratik kullanılan şeyler olmalıdır.

Sorunlar neler? (Eksiler/Dezavantajlar)

Böyle bir nesneyle yazılmış kütüphane kullanmak çyle çok daha rahat bişey değil. Tabiki bazı sorunlar var.
Türkçe karakter sorunu, eğer içerik aldığınız sayfa içinde hangi karakter seti ayarlıysa ona göre gelir. Bunun çözümü için içeriği aldığınız sayfa'ya ya HTML etiketi ile karakter seti ayarlaması belirtmeniz gerek. Ya da herhangi bir web programlama dili kullanıyorsanız onun sayfa başlık bilgisi fonksiyonlarını/methodlarını kullanarak karakter seti ayarlamanız gerekecektir. Mesela php için;
<?php
header("Content-Type:text-html;charset:utf-8");
?>
ile sayfa başlık bilgisini (header) ayarlayabilirsiniz. Böylece Türkçe karakter problemini çözmüş olursunuz. (Eğer iso kullanıyorsanız ona göre ayarlayın)

İkinci sorun ise iç sayfalara koyduğunuz javascript kod bloklarıdır.
-- İÇERİK --

<script>
  document.write('Selam');
  alert('Merhaba');
  // ...
</script>

-- İÇERİK --
şeklinde tanımladığınız tüm kodlar ignore edilmiş olacaktır.
Bu sorunların hepsini kolayca çözmek ve daha pratik ajax kullanmak istiyorsanız mootools kullanmanızı öneririm.
Hazırlayan : Mehmet Fatih YILDIZ

Popüler Etiketler

php pear mdb2 prepare execute mysql mssql pgsql konsol terminal subversion svn seo search optimization meta mfyz pharma hack wordpress google blog gimp job facebook api opengraph fql icon ikon grafik download firefox banner calendar logo db database service free twitter statistics istatistik insanlar css3 browsers support apple iphone ipad screen iOS webkit web app app music language mootools jquery linux login chart osx applications rss lifestream parse xml html framework dokuman portfolio örnek kod optimizasyon compile nedir open source lisans share oyun ui ux form htaccess apache route router mod_rewrite javascript ipucu js date tarih session mail newsletter subscription css radio style less export mobile itunes internet explorer ajax xmlhttprequest wanda wireless code windows fstab ntfs sql analyse procedure injection social network developer widget kitap ubuntu workspace textarea zaman xhtml digital html5 development table compiler macosx on-the-fly auth server sosyal medya http ie browser media url integration plugin ios app store store in-app purchase purchase verification storekit itunes connect imza signature doritos tytz startups kontrol yapıları if switch generator while kurulum input tool tebrik editor coding box git version control deployment select player license graph button proje regex ide phpstorm jetbrains sitemap connect spam query nasıl object howto diff kampanya ruffles design icons www subdomain redirect crossdomain cache link laptop notebook internet cookie cms bootstrap assets