jQuery ile Laz İşi Ajax Push

Özellikle Friendfeed, Twitter, FaceBook gibi sosyal ağlarda sayfa yenilenmeden verilerin güncellendiğini biliyoruz. Bu tür bir durumu gerçekleştirmek için akla ilk gelen yöntem ajax ile verinin bulunduğu yeri belirli zaman aralıklarında yenilemek geliyor, fakat veri trafiğinin çok üst düzey olduğu bu sistemlerde sürekli yenileme yapmak aşırı kaynak tüketimine hatta sistemin durmasına sebep olur. Bu işi şüphesiz en iyi yapan site FriendFeed, o kadar iyi yaptılar ki FaceBook bu siteyi ve geliştiricilerini satın aldı :) Neyse oralara daha fazla girmeden konumuza dönelim.

Bundan epey zaman önce Facebook’ un davranışlarını epeyce inceliyordum, özellikle sayfa sabitken verilerin güncellenmesi aklımı resmen alıyordu. Bir gün farkettim ki akıllı Facebook mühendisleri kullanıcı deneyimlerini o kadar iyi gözlemlemişler ki bu işi şu şekilde çözmüşler Window Focus ! Kullanıcı sayfada kaldığı sürece sağa sola tıklamıyor olabilir. Bu durum farklı sekmelere yada farklı sayfalara gidip tekrar gelmeyeceği anlamına gelmiyor ! Javascript ile pencerenin focus olayını kullanarak basit bir şekilde sanki veriler anlık güncelleniyor hissini kullanıcı üzerinde yaratabiliriz.

Index sayfamızdaki kodlarımız.

<script type="text/javascript">
    var focus = false;
    $(document).ready(function () {

        $(window).bind('focus', function () {
            getData();
        });

        // ie
        $(document).bind('focusin', function () {
            getData();
        });

    });

    function getData() {
        if (focus) {
            focus = false;
        }
        else {
            focus = true;
            $.ajax({
                url: "/home/getData/" + $("#grid ul li:last").attr("id"),
                dataType: 'json',
                success: function (data) {
                    if (data.length > 0) {
                        for (var i = 0; i < data.length; i++) {
                            $("#grid ul").append("<li id=\"" + data[i]["id"] + "\"><strong>" + data[i]["adSoyad"] + "</strong> " + data[i]["icerik"] + "</li>");
                            $("#grid ul li:last").fadeOut().fadeIn();
                        }
                    }
                }
            });
        }
    }
</script>

Gördüğünüz gibi sadece pencere aktif olunduğunda bir ajax sorgusu yapıyor, varsa güncel verileri alıyor ve kullanıyoruz. Burada ajax isteğimizi yaparken ekranda ki son kaydın id sinide gönderiyoruz ki veritabanından sorgulama yaparken o id den büyükleri yani güncelleri bulabilelim.

Sonuç olarak; kullanıcı sekmeler arasında dolaşırken bizim sitemizin bulunduğu sekmeye her gelmesinde veriler aynı FaceBook’ da ki gibi güncellenmiş olacak. Burada ben olayın mantığını basitçe anlatmak istedim. Bu yöntemi iyileştirmek ve geliştirmek de mümkün ;)

Demo için, buradan kayıt girebilir, şuradan da olayı görüntüleyebilirsiniz. Projenin çalışır halini buradan indirebilirsiniz.

  • http://blog.theylmz.com Emre YILMAZ

    Öncesinden bi kaç yerde muhabbetine denk gelmiştim, fakat basit olarak mantığı iyi anlatmışsın. Anladım yani sağolasın :) [ben anladıysam sağlam yazıyosun]
    saygılar.

    • apoStyLEE

      Teşekkürler :)

  • qa

    Çok güzel bir makale.

  • http://.. yns.emre

    güzel yazı olmuş kardeşim eline sağlık..

  • Nevzat

    efferüm kardiş, ben de jquery’ci olucam banane banane :)

    • apoStyLEE

      saol abi, olmadığın hata :)

  • http://www.bthayat.net Hasan Civelek

    Evvela yazı için teşekkür ederiz, elinize sağlık.

    Facebook’un sayfa sabitken verileri hangi durumlara göre çektiğini pek incelemedim fakat FriendFeed’inkine ofisce kafa patlatmis ve Google’a sormadan bunu nasil yapariz diye bir iki saat bocalamistik. Bilinen teknolojilerden biri olmak zorundaydi. Sayfaya hic dokunmadan baska bir browserda güncelleme yapildiginda dokunmadigimiz sayfa da güncelleniyordu, hatta ayni anda kac makinede o sayfayi acmissak hepsi guncelleniyordu. Sonunda utana sıkıla Google’a sorduk ve cok basit bir cevap oldugunu ogrendik.

    Friendfeed’de her sayfada ajax ile bir url cagriliyor fakat o url cevap vermiyor ta ki sunucuda bir degisiklik olana kadar. url cagrisi sonlanip bir cikti geldiginde bu kez o degisikligi getirecek ajax cagrisi yapiliyor ve degisiklik sayfaya yansitiliyor. isin esprisi kisaca bu.

    Biraz acarsak: FF’de bir postun yayinlandigi sayfada oldugumuzu kabul edelim. bu sayfa cagrildiginda bir ajax kodu http://friendfeed.com/degisiklikvarmi.php?durum=1234 diye bir url’den cikti almaya calisiyor. Fakat degisiklikvarmi.php icerisindeki kod bir while donugusu oldugundan hemen cevap vermiyor. degisiklikvarmi.php sayfasi durum=1234 parametresi ile cagriliyor ki “suanda durum 1234, eger sendeki durum bu degerden buyukse bir sey oldu demektir bana hemen durumu citlat” diyebilsin. while dongusu belli bir delay’la bu islemi tekrarlayip mevcut durumu bu cagrilirken bildirilen durumla karsilastiriyor ve degistigi an donguyu kirip requesti sonlandiriyor ve “durum degisti” diye bagiriyor. durumu kontrol eden ilk ajax’imiz da sonlanmis olup “aha durum degismis” diye algiliyor ve yeni ajax istegi gonderip sondegisiklikler.php gibi bir adrese “eee son degisiklikleri ver bakalim” diyor ve son degisiklikleri alip html olarak sayfaya ekliyor. insallah aciklayici olmustur :)))

  • http://www.bthayat.net Hasan Civelek

    Daha sonra tekrar -bu kez durum bilgisi guncellenmis olarak- http://friendfeed.com/degisiklikvarmi.php?durum=1235 adresini dinlemeye koyuluyor ve senaryo baştan işliyor.. mutlu son

  • yasin kuyu

    facebook ve friendfeedin kullandığı: http://www.tornadoweb.org/

  • webadmn

    cok begendim makalenizi :)

  • Alp Yılmaz

    teşekkürler gayet güzel bilgi. Peki online yazışma tarzı sistemlerde mantık nasıldır? çevrimiçi sohbetinde örneğin. onda da sürekli kontrol etmiyordur sanırım sunucuyu. çünkü sunucuyu yoracaktır bu dediğiniz gibi. asenkron bir bağlantı olması gerekiyor sanırım. javascript ile bu nasıl mümkün oluyor? bilginiz var mı? veya örnek vs?

    • apoStyLEE

      Chat icin direk node.js yi inceleye bilisiniz ;)