JQuery kutuphanesinin diger kutuphanelerle beraber kullanilmasi. Mesela Prototype.

by oozturk 10. March 2010 18:55

Merhaba,

JQuery kutuphanesi bildiginiz uzere jQuery(...) yerine $(...) seklinde de kullanilabiliyor. Diger kutuphanelerden bazilari da yine jQuery gibi $(...) seklinde kullanilabiliyorlar. Bu sebeple jQuery kutuphanesini, diger kutuphanelerle beraber kullanmaya calistigimizda bir cakisma soz konusu oluyor.

Soz gelimi Prototype kutuphanesi ele alalim. Prototype'da $(...) seklinde kullaniliyor. Bu sebeple jQuery ile beraber kullanilacagi zaman problem olusuyor.

Mesela Lightbox, prototype kutuphanesini kullaniyor oldugundan oturu, Lightbox kullandigim bir sayfada jQuery de kullanmaya basladigimda sorun yasadim.

 

Ancak onlemenin bir yolu var.

<script type="text/javascript" src="prototype.js"></script>

<script type="text/javascript" src="jQuery.js"></script>

 

seklinde her ikisini de sayfaya ekledikten sonra

<script type="text/javascript">

jQuery.noConflict();

</script>

Komutunu calistirirsak sorun cozulur. Bu sayede jQuery'yi $(...) seklinde cagirilmasi durumu biter ve jQuery(...) seklinde kullanabilir kalir. Prototype ise $(...) seklinde kullanilabilmeye devam eder.

Tabii bu degisiklikten sonra jQuery'yi $(...) cagirdigimiz satirlari (Mesela: $("div")... ) jQuery(...) seklinde duzeltmemiz gerekir.

 

Bu kadar.

Tags: , , , , ,

Javascript

Javascript ile resim galerisi nasıl yapılır?

by oozturk 3. July 2009 06:13

Google'da bu konuyu aradığınızda birçok kişinin bu konuda bedava kodlar yazıp dağıttığını görürsünüz. Ben de yazmaya üşendim ve google'da aradım. Sanırım en başarılısı lightbox 2.

Hem tek tek resim gösteriminde hem de galeri gösteriminde gayet başarılı ve kullanması çok kolay. Yalnızca html kodunuzda birkaç saniye sürecek değişiklik yapıyorsunuz ve çalışmaya başlıyor. Tavsiye ederim.

Lightbox2'ın kendi sayfasına buradan ulaşabilrsiniz.

Tags: , ,

Javascript

XmlHttpRequest nedir, nasıl kullanılır? JSON kullansak bir sakıncası olur mu? Nasıl kullanmalı bu JSON'ı?

by oozturk 23. February 2009 05:08

Selamlar,

XmlHttpRequest; Microsoft'un dünyaya (bayağı bir zaman oldu ama) dinamik internet sayfalarını armağan etme yoludur. Bu özellikten vaz geçmek istediğiniz anda, statik sayfalara geri dönmüş oluyorsunuz. Asenkron ya da senkron olarak yüklenmiş olan sayfada dinamik içerik hazırlamaya yarar. Ajax dediğimiz dünya zaten bu komut üstüne kurulmuştur desek yerinde bir tespit olur. Eğer javascript ile istemci (client) tarafında sunucudan (server) dinamik olarak içerik almak ve işleyip kullanıcıya sunmak istiyorsak bukomutu kullanmak isteriz.

Bildiğimiz ve hergün acı olarak tecrübe ettiğimiz gibi internet için çok sayıda standart var ama hiç standart yok! Ne demek bu? Biri birşey yaratıyor, başkaları alternatiflerini üretiyor sonra içlerinden bir ya da birkaçı tutuyor ve internet standardı olma yolna giriyor, sonra üretenler aralarında konuşup bunu standart haline getiriyorlar ama bu seferde hepsinin yoğurt yeme stili farklı oluyor. Çok uzattım ama ne yazık ki bu komut için de bu olay geçerli. Eğer XmlHttpRequest kullanmak istiyorsanız, Javascript ile bu komutu bir nesne gibi yaratmanız gerekiyor ve her tarayıcıda (browser) bu işlem farklı oluyor. Microsoft bunu daha önceden ActiveX nesnesi olarak tanıtmıştı mesela...

Aşağıdaki kod ile XmlHttpRequest nesnenizi tanımlayabilirsiniz:

<script type="text/javascript" language="javascript">
    var xmlhttp = false;

    function getHttpRequestObj()
    {
        try
        {
            //bir deneyelim bakalim
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e)
        {
            try
            {
                //simdi guncel IE implementasyonu deneyelim
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e)
            {
                xmlhttp = false;
            }
        }
       
        if(!xmlhttp && typeof XmlHttpRequest!= 'undefined')
        {
            //Eh, artik mozilla tabanli bir tarayici kullaniyoruzdur
            //o zaman ona gore bir nesne tanimlayalim
            xmlhttp = new XmlHttpRequest();
        }
    }
</script>

 

Şimdi bu script ile sayfa içerisinde kullanabileceğimiz xmlhttp adında bir XmlHttpRequest nesnemiz oldu. Artık bununla istediğimiz gibi text, xml ya da json tabanlı içerikler alabilir ve işleyebiliriz. İşin doğrusu benim favorim JSon, çünkü xml'den de text'den de çok daha verimli ve performanslı. Üstüne üstlük geri dönen değer direk olarak javascript nesnesi olarak kullanılabiliyor yani bir daha işlemeye gerek kalmıyor.

 

Bir örnek vereyim. Bir sayfanızda, sayfanızla aynı klasörde bulunan bir txt dosyasından içerik almak ve göstermek istiyorsunuz diyelim:

getHttpRequestObj();

if(xmlhttp)
{
    xmlhttp.open("GET", "Deneme.txt", true);
    xmlhttp.onreadystatechange = function()
    {
        if(xmlhttp.readystate == 4)
        {
            alert(xmlhttp.responseText);
        }
    }
    xmlhttp.send(null);
}

 

Yukarıdaki örnekte, sayfamızla aynı klasörde bulunan Deneme.txt adlı dosyamızı çağırdık ve içeriğini mesaj kutusuyla gösterdik. Bunu yaparken bazı şeyler yaptık,onları da açıklayayım.

Öncelikle xmlhttp.onreadystate - function()... diye bir komut yazdık. Bu resmen bir event'i handle etmekti. Yani tanımlamış olduğumuz bir başka fonksiyon varsa onu da gösterebilirdik bu event için. Ayrıca xmlhttp.readystate diye bir değişkenin değerinin 4 olup olmadığına baktık, bu da xmlhttp nesnesinin durumunu kontrol etmek içindi. Tahmin ettiğiniz üzere 4 değeri 'tamamlandı' anlamına geliyor.

Diğer durumlarda şöyle:

0 - Henüz hazırlanmadı (Uninitialized)

1 -  Yükleniyor (Loading)

2 - Yüklendi (Loaded)

3 - Etkileşimli (Interactive)

4 - Tamamlandı (Complete)

 

Evet, şu anda bu kod çalışır durumda. Ama henüz gerçek dünyada kullanılabilecek düzeyde değil. Neden mi? Mesela bazen bazı kaynaklara ulaşmakta problemler yaşanır, bu durum için herhangi bir önlem almadık bu kodda. Bunu da ekleyelim şimdi:

if(xmlhttp)
{
    xmlhttp.open("GET", "Deneme.txt", true);
    xmlhttp.onreadystatechange = function()
    {
        if(xmlhttp.readystate == 4)
        {
            if(xmlhttp.status == 200)
            {
                alert(xmlhttp.responseText);
            }
            else
            {
                alert("Aman Allahim! Problem Oldu...");
            }
        }
    }
    xmlhttp.send(null);
}

 

Evet, burada xmlhttp.status == 200 diye bir kontrol eklemiş olduk, bu da tahmin ettiğiniz gibi http için status değeridir. Misal, eğer dosya bulunamamış olsaydı 404 değerini alacaktık, ya da sunucu hatası olsaydı 500 alacaktık. Bunlar için de kontroller ekleyebilirsiniz.

 

Esasen kendi sitenizde barındırdığınız ve kontrol etmiş olduğunuz şeylere erişim sorunu yaşamazsınız ancak dışarıdaki bir kaynağa erişmeye çalışırken bu tür durumlar için dikkat etmek gerekir (Bence içeride de olsa dikkat etmekte yarar var, çünkü bazen bir içeriği değiştirirken ya da bir şeyin yerini değiştirirken nerelerde kullanıldığını unutabiliriz).

Tabi bu örnekte kullandığımız gibi sadece text dosyaları için kullanılmıyor bu komut, yukarıda da belirttiğim gibi xml gibi içeriklerde kullanılabilir ki sadece dosya olarak da kullanılmıyor, misal bir web servis de kullanabilirdik.

 

Düşünelim. Bir web servisimiz olsa, içinde veritabanımızdan bir liste çeksek ve xml olarak fonksiyondan geri döndürsek, bunu da xmlhttp nesnemizle belirli zaman aralıklarıyla çekip çekip kontrol etsek? Evet, bu yapılan birşey ve kullanım alanlarından biri. Bu gibi durumlarda en yukarılarda da yazdığım gibi xml yerine JSon tavsiye ediyorum, çünkü xmlden çok daha az yer tutuyor bu da veriyi daha çabuk elde etmek, kullanılan bant genişliğini düşürmek gibi anlamlara geldiği gibi ayrıca bir de JSon tipini XML gibi işlemek zorunda kalmadan eval komutuyla direk olarak bir javascript değişkenine atayıp kullanabiliyoruz. Evet işte bu gerçekten süper bir durum. Örnek vereyim.

Bir dosyamız olsun yine (Örnek kolay olsun diye böyle yapıyorum), adı da Deneme2.txt olsun. İçine de aşağıdaki gibi birşey yazalım.

{ "Results": {
    "toplam_kitap" : "2",
    "kitap" : [
    {
        "Yayinevi" : "Ayrinti",
        "Tur" : "Yeralti Edebiyati",
        "Fiyat" : "10"
    },
    {
        "Yayinevi" : "Can",
        "Tur" : "Dunya Klasigi",
        "Fiyat" : "7"
    }
         ]
          }
}

 

Bu dosyayı kaydedelim. Ve aşağıdaki kodu html kodumuza yazalım:

<script type="text/javascript" language="javascript">
    var xmlhttp = false;

    function getHttpRequestObj()
    {
        try
        {
            //bir deneyelim bakalim
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e)
        {
            try
            {
                //simdi guncel IE implementasyonu deneyelim
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e)
            {
                xmlhttp = false;
            }
        }
       
        if(!xmlhttp && typeof XmlHttpRequest!= 'undefined')
        {
            //Eh, artik mozilla tabanli bir tarayici kullaniyoruzdur
            //o zaman ona gore bir nesne tanimlayalim
            xmlhttp = new XmlHttpRequest();
        }
    }

    getHttpRequestObj();

    function CallBack()
    {
        if(xmlhttp)
        {
            xmlhttp.open("GET", "Deneme2.txt", true);
            xmlhttp.onreadystatechange = function()
            {
                if(xmlhttp.readystate == 4)
                {
                    if(cmlhttp.status == 200)
                    {
                        eval("var objResults = " + xmlhttp.responseText);
                        var displayText;
                        for(var i=0; i < objResults.Results.kitap.length; i++)
                        {
                            displayText += objResults.Results.kitap[i].Yayinevi + " " +
                                    objResults.Results.kitap[i].Tur + ", " +
                                    objResults.Results.kitap[i].Fiyat + "TL<br/>";
                        }
                        alert(displayText);
                    }
                    else
                    {
                        alert("Aman Allahim! Problem Oldu...");
                    }
                }
            }
            xmlhttp.send(null);
        }
    }
    CallBack();
</script>

 

Evet, işte bu kadar basit. Tabii biz burada Deneme2.txt diye bir dosya yarattık ve elimizle doldurduk ama dediğim gibi bu örneğin maksadı XmlHttpRequest'i göstermekti bu sebeple diğer detaylarla boğmak istemedim yazıyı. Normalde bir web servis hazırlamak ve geri dönecek değeri JSon tipine parse etmek gerekecekti. Bunlar için de aşağıda kısayollar vereceğim.

 

Bütün bunların yanı sıra birkaç detay daha vermek istiyorum. Mesela hazırladığımız Deneme2.txt dosyasının formatı JSon ama bu JSon da '{' ya da '[' ne anlama geliyor?

Object(s): '{}' ile başlayıp bitiyorlar.

Object Member(s):  Bunlar name - value eşlemesi olarak yer alıyorlar. Name ve value arasında ':'kullanılıyor ve diğer üyeler arasında ise ',' kullanılıyor

Array(s): Bunlar string, number, object, array veya literal value (true, false) ya da null olabiliyorlar.

String(s): Bildiğimiz string.

 

Bunun yanı sıra  bir de XmlHttpRequest nesnesinin metodları (methods) ve özelliklerinden (properties) de bahsetmek istiyorum.

Methods:

- abort()

     İsteği iptal eder.

- getAllResponseHeaders()

     Bütün Http Header değerlerini getirir.

- getResponseHeader()

     Belirtilen Http Header değerini getirir.

- open()

     İstek nesnesini belirtilen metod, url ve güvenlik bilgileriyle yapılandırır. (Yukarıda hep tek parametreli olarak kullandık ancak ilk parametrede açılacak kaynağı belirttikten sonra kullanıcı adı ve şifre de belirtebilir ve güvenlik için giriş yapabilirdik).

- send()

     Sunucuya bi istek gönderip cevap alır.

- setRequestHeader()

     Bir Http header'ın değerini değiştirir.

 

Properties

- onReadyStateChange (Okuma / Yazma)

      ReadyState değiştiğinde tetiklenecek olan event için kullanılacak olan fonksiyonu değiştirir.

- readyState (Okuma)

     Nesnenin mevcut durumunu alır.

- responseBody (Okuma)

     Http response için kullanılabilecek özelliklerden biri.

- responseStream (Okuma)

     Http response için kullanılabilecek özelliklerden biri.

- responseText (Okuma)

     Response body, string formatında.

- responseXML (Okuma)

     Response body, xml formatında.

- status (Okuma)

     İstek için geri dönen durum değeri (200 = OK, 404 = Yok, 500 = server hatası, ...)

- statusText (Okuma)

     İstek için geri dönen durumun text'ini döndürür.

 

Şimdilik bu kadar. Bu konuda daha çok yazı yazmaya ve örnekler vermeye çalışacağım.

Bu konularda bakımlası gereken bazı siteler:

http://www.json.org

http://www.json.com

http://blogs.techrepublic.com.com/security/?p=426

Tags: , , , , ,

Web Service | Ajax | Html | Javascript | Json

RegEx ile E-Posta uygunluk kontrolü için kod

by oozturk 20. February 2009 09:11

Bugünlerde bir e-posta'nın düzgün yazılıp yazılmadığını kontrol etmek hayli güç. Hergün yeni domain uzantıları çıkıyor ve bu ve bunun gibi sebeplerle farklı yapılarda e-posta hesapları mevcut. Bunları javascript ile kontrol etmek istiyorsak regex kullanmamız gerektiğini Javascript, web service, ajax ve membership kullanarak kullanıcı adı ya da e-posta uygunluk ya da kullanılabilirlik kontrolü isimli yazımda da belirtmiştim ve detaylı olarak nasıl yapılabileceğini yazmıştım.

Ancak o yazımda regex için kullandığım uygunluk kontrolü yazısı biraz eski, bu sebeple yenisini burada veriyorum.

/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i

 

 yukarıda ki kodu mesela

var regexf = /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i

şeklinde kullanabilirsiniz.

Tags: , , , , ,

Html | Javascript

Tarayıcılarda (Browser) kullanılabilir yükseklik (height) ve genişlik (width) nasıl öğrenilebilir?

by oozturk 17. February 2009 05:43

Hepimiz elbette ki farklı tarayıcılar (browser) kullanıyoruz. Bu sebeple bir web sitesi hazırlarken zaten bu tarayıcılara özgü değişkenleri kullanıyoruz. Eğer kullanıcının kullandığı tarayıcısında ne kadar yere sahip olduğunuzun sizin için önemi varsa ve bu değerleri nasıl alabileceğinizi bilmiyorsanız hiç internette aramaya kalkmayın gerçekten onlarca yerde yazıyor ancak sıkılana kadar bakacağınız yerlerdeki örneklerin hepsi ya fazla eksik* ya da yanlış çalışıyor. Onlarca yere baktıktan sonra kendi kodumu kendim yazmaya karar verdim, aşağıdaki kodu IE7, IE8 Beta, FireFox 3.0.6 ve Opera 9.63'de denedim ve evet çalışıyor.

Aşağıda bulacağınız örnekte yalnızca height değerlerini verdiğim halde aynı işlemi width için de kullanabilirsiniz netice de.

   functıon GetHeight()

  {

       var winHt;

        if (navigator.appName.indexOf("Netscape") != -1)  {
            winHt = window.innerHeight;
        }
        else
        {
            winHt = document.documentElement.clientHeight;
        }
        if(!winHt)
            winHt = document.body.clientHeight;

     return winHt;

  }

 

Bu örnekte scrollbarlarında olduğu yerler dahil olarak kullanıcının tarayıcısının toolbarlar çıkarıldıktan sonra kalan kullanılabilir alanını görebilirsiniz. Buna birçok durumda ihtiyacınız olacaktır zaten.

Scrollbarları da hesaba katmak için elde ettiğiniz değerlerin ortalama olarak 16 - 20 arasında eksik almanız gerekiyor. Misal yukarıdaki örnekte 650 height değeri aldıysanız IE için 20, Firefox için 16 olan scrolbar ebadını çıkartmanız durumunda 634 - 630 değerlerini kullanabilirsiniz.

* Mutlaka benim verdiğim örnek de eksik kalacaktır ama şimdilik çalışıyor.

Tags: , , , , , ,

Javascript | Html

Javascript, web service, ajax ve membership kullanarak kullanıcı adı ya da e-posta uygunluk ya da kullanılabilirlik kontrolü

by oozturk 9. January 2009 05:22

Birçok alanda kullanıcının doldurduğu alanları kontrol etmek isteriz. Misal olarak kullanıcının bir web sitesine kayıt olmak istemesi durumunda, bu kullanıcı adının ya da belirtilen e-posta adresinin daha önce sisteme kayıt edilmiş olup olmadığını kontrol etmek ve buna göre kullanıcıyı yönlendirmek isteriz. Bu gibi durumlarda server side kontrol etmek çok da istenen bir durum olmaz, çünkü sayfanın tekrar çalıştırılması anlamına geldiği için yavaşlık olur ve hatta kullanıcının o esnada doldurduğu bazı alanlar da silinebilir. En doğru yöntem javascript vasıtasıyla web service ve ajax kullanarak client side bu işi çözmek gözüküyor.

Bir örnek ile kullanımını anlatmaya çalışacağım. Mesela senaryomuzda bir websitesinin kayıt işlemi için kullanıcı e-posta adresini belirtiyor olsun, bu e-posta adresi sisteme kayıtlı mı bunu belirlemek isteyelim. Tabi bir de girilen e-posta adresi doğrumu ona da bakalım. E-posta adresinin format'ının doğru olup olmadığının kontrolü sayesinde web service'imizide gereksiz zamanlarda çağırmamıza gerek kalmadığı için site trafiğini de azaltabiliriz.

1. adım: Bir web service ekleyelim projemize, mesela UserService.asmx olsun ve aşağıdakine benzer bir  koda sahip olmamız gerekiyor. Burada dikkat edilecek husus [System.Web.Script.Services.ScriptService] satırının kesinlikle eklenmiş olması, yoksa ajax ya da script vasıtasıyla çağırılmasına izin verilmez.

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using System.Web.Security;

[WebService(Namespace = "http://www.tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class UserServices : System.Web.Services.WebService {

    public UserServices () {

    }

    [WebMethod]
    public bool IsUsernameAvailable(string CheckFor) {
        if (Membership.GetUser(CheckFor, false) == null)
            return true;
        else
            return false;
    }
}

3. adım: Bir sayfa yaratalım. Mesela default.aspx olsun.

4. adım: Bu sayfaya bir ScriptManager ya da ToolkitScriptManager ekleyelim.

5. adım: Eklediğimiz ScriptManager'ın services özelliğine yarattığımız web service'i ekleyelim. Ekledikten sonra aşağıdakine benzer bir kod elde edilmiş olması gerekiyor.

<cc1:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
   <Services>
      <asp:ServiceReference Path="~/services/UserServices.asmx" />
   </Services>
</cc1:ToolkitScriptManager>

6. adım: Sayfamıza bir TextBox ekleyelim  adını txtEmail koyalım ve bir Label koyalım adını da lblErr koyalım.

7. adım: Sayfamızın Page_Load event'ine aşağıdaki kodu koyalım.

txtEmail.Attributes.Add("onkeyup", "checkName()");

8. adım: Sayfamızın koduna aşağıdaki javascript'i ekleyelim.

    <script type="text/javascript">
        function checkName() {
            var eml = document.getElementById(<% ="\'" + txtEmail.ClientID + "\'" %>);
            var regexf  =  /(^[a-z]([a-z_\.]*)@([a-z_\.]*)([.][a-z]{3})$)|(^[a-z]([a-z_\.]*)@([a-z_\.]*)(\.[a-z]{3})(\.[a-z]{2})*$)/i;

            if(regexf.test(eml.value))
            {
                UserServices.IsUsernameAvailable(eml.value, onIsAvailableCompleted);
            }
        }
        function onIsAvailableCompleted(result) {
            if(result != null)
            {
                alert(result);
                var lblErr = document.getElementById(<% ="\'" + lblErr.ClientID + "\'" %>);
                if(result)
                {
                    lblErr.innerText = 'E-postaniz kontrol edildi.';
                    lblErr.style.color='green';
                    }
                else
                {
                    lblErr.innerText = 'Bu kullanici zaten mevcut, baska bir kullanici deneyin.';
                    lblErr.style.color='red';
                    }
            }
        }

    </script>

 Bu kadar. checkName fonksiyonu içine yazdığımız regexf değişkeni e-posta için validator olarak kullanılıyor ve txtEmail içine kullanıcının yazmış olduğu yazının format'ını kontrol ediyor, eğer doğru bir e-posta formatındaysa o zaman web service'in IsUsernameAvailable fonksiyonunu çağırıp lblErr içine gerekli yazıyı yazıyor. Bu örnek geliştirilebilir tabii. Misal olarak eğer doğru ve kullanılabilir bir e-posta adresi belirtilmemiş ise submit butonunun enabled değeri false olarak işaretlenebilir ve formun submit edilmesi engellenebilir.

Bu tür işlerin istemci tarafında çözülmesi hem performans hem de trafik açısından daha doğru oluyor.

Düzeltme: Bu yazıdaki RegEx kodu eski kaldı bu sebeple RegEx ile E-Posta uygunluk kontrolü için kod başlığıyla yazdığım yazıyı okumanızı tavsiye ederim. Merak etmeyin kısa tuttum ve kodu hemen görebilirsiniz orada.

Öyle işte.

CustomFieldValidator Javascript ile istemci tarafında nasıl kullanılır?

by oozturk 6. January 2009 03:29

Hazırlanan sistemlerin hemen hemen hepsinin kullanıcı hareketleri için hazırlanan fonksiyonlarında doğru doldurulması gereken alanları vardır. Bu alanların doğru doldurulduğunun kontrol edilmesi, hem güvenlik hem de tutarlılık açısından oldukça önemlidir. İstemcilerin girişlerini sürekli kontrol etmek bu sebeple gerekir. Hem server performansını bu tür işlerle düşürmek hem de istemci'nin çok beklemesi istenen bir durum değildir. Bu sebeple asp.net kontrollerinden olan CustomFieldValidator'ın da istemci tarafında çalışabilme özelliği vardır.

 Bu özellik javascript ile kullanılabilir. Bunun için de hazırlanan javascript'in adı CustomFieldValidator'ın ClientValidationFunction değerine yazılır. Tabii bu kontrolün bağlı olduğu javascript ile iletişimi için hazırlanan fonksiyonun parametreleri önemlidir. Hazırlanan fonksiyonun 2 adet değişkeni olmalıdır. Birincisi source'tur. Source, CustomFieldValidator'ın kendisidir. İkincisi de arguments'dir. Arguments; iki özelliği olan bir nesnedir. Bu özellikler; Value ve IsValid'dir. Value; kontrol edilen nesnenin değeridir, IsValid ise hazırlanan fonksiyonun içindeki kontrollerin neticesinde Validator'a dönülen hata var ya da yok değeridir. Aşağıda bu duruma örnek javascript kodu bulunuyor.

<script language="javascript">

       function ClientValidate(source, arguments)
       {
          // cift rakam mi?
          if (arguments.Value%2 == 0)
            arguments.IsValid = true;
          else
            arguments.IsValid = false;
       }
    </script>

Tags: , , , , ,

ASP.NET | Javascript

ASP.NET 3.5 ile Bound Control içindeki button'un OnClick ya da OnClientClick event'i esnasında "Invalid postback or callback argument" hatası neden alınır?

by oozturk 31. December 2008 03:03

Eğer html kodu doğru hazırlanmış ise büyük ihtimalle sebebi databind işleminin tam da bu işlem esnasında da çağırılıyor olmasındandır. Yani zaten tekrar doldurulmaya çalışılan databound nesne (gridview, datalist, vs...) içinde yer alan button'un event'i çağırıldığı için server artık aynı button nesnesine sahip olamamış oluyor. databind işleminin yalnızca doğru zamanlarda (Mesela: !Postback) çalışması sağlanınca sorun çözülmüş olacaktır.

ASP.NET ile hazırlanmış sayfada bir nesneye javascript ile nasıl ulaşılır?

by oozturk 30. December 2008 22:58

Asp.NET ile hazırlanan sayfalarda mesela masterpage kullanılıyorsa nesnelere verilen isimlere runtime'da bazı ekler .net tarafından otomatik olarak eklenir. ClientID'ye de design time'da ulaşmak mümkün olmadığı için javascript ile ulaşılmak istenildiğinde o nesneye verilen isim aynen kullanılamaz (ClientID özelliğine, bahsettiğim durumda, sanırım .NET 4.0'da ulaşabiliyor ve hatta sanırım belirleyebiliyor olacağız.). Bu sebeple javascript'i hazırlarken dikkat edilmesi gereken bir husus var. Aşağıda verdiğim örneğe bakarsanız hemen göreceksiniz zaten.

   <script type="text/javascript">
     function showPanel() {
       var pnlvis = document.getElementById(<% ="\'" + pnlModalVisHid.ClientID + "\'" %>);
       pnlvis.show();
     }
   </script>

Bu örneği bir başka yazıda kullanmıştım zaten, oradan alıntı yaptım. Görüldüğü üzere getElementById fonksiyonunu çağırırken direk olarak nesnenin adını değil de runtime esnasında .net tarafından verilmiş (değiştirilmiş) adını vermiş olduk.

Peki html nesnelerine nasıl ulaşacağız? Esasen hiçbir şey değişmiyor. Yalnızca html nesnesine runat="server" diye eklemek gerekiyor ki clientId'si .net tarafından yaratılsın. Bunu yapmamızdaki sebep, yukarıda da belirttiğim gibi masterpage kullanınca .net'in nesne isimlerini değiştiriyor olması.

İşte bu kadar. Umarım yardımcı olabilmişimdir.

İyi çalışmalar dilerim.

Tags: , , , ,

ASP.NET | Javascript

Javascript ile hiddenfield değerini değiştirmek

by oozturk 23. December 2008 13:46

Javascript ile bir hiddenfield'in değerini değiştirmek istiyorsak; javascript ile öncelikle onu bulmamız daha sonra değerini değiştirmemiz gerekir. Bu yapmak esasen çok kolay gözükse de masterpage kullandığımız zamanlarda hiddenfield kontrol'ünün id'si değiştiği için onu bulmak güç olabilir.

 Aşağıdaki kod ile bu işi çözebiliriz.

   var hdn = document.getElementById(<% ="\'" + HiddenField1.ClientID + "\'" %>);

Şimdi de bir örnek ile hem ajax, hem masterpage'in kullanıldığı bir ortamda hiddenfield değerini değiştirip, kontrol edelim.

1. Yeni bir proje içine bir masterpage ve bu masterpage'i kullanan bir contentpage hazırlayalım.

2. Masterpage'imize; bir scriptmanager, bir updatepanel koyalım. Updatepanel içine de bir label (Label1),  bir html buton (Button1) son olarak da bir hiddenfield (HiddenField1) koyalım. Bir de head kısmına aşağıdaki kodu yazalım.

   function setz() {

        var hdn = document.getElementById(<% ="\'" + HiddenField1.ClientID + "\'" %>);

        if(hdn)

        {

           hdn.value = "deneme";

          __doPostBack(<% ="\'" + UpdatePanel1.ClientID + "\'" %>, '');

        }

   }

3. Masterpage'imizdeki Button1 kontrolümüzü tanımladığımız satıra aşağıdaki işaretli kısmı ekleyelim.

     <input id="Button1" type="button" value="button" onclick="return setz();" />

4. Masterpage'imizin kod sayfasında, form load içine de aşağıdaki kodu yazalım. 

     Label1.Text = HiddenField1.Value;

5. Contentpage'imiz boş kalsın.

Uygulamayı çalıştıralım. Düğmeye bastığımızda, label'in yazısının deneme diye değiştiğini göreceğiz. Bunu dinamik herhangi bir olay neticesinde yapabiliriz.

Bildiğiniz gibi bir html butonunun herhangi bir .net kodu ya da kendinden bir postback özelliği yoktur. Haliyle tamamen client tarafında değeri değiştirip daha sonra UpdatePanel ile postback yaptık ki o da zaten server tarafında sadece gerekli kısmın değişmesini sağlayıp, bütün sayfanın yenilenmesini engelliyor. Aslında ajax kullandığımız için javascript içinde kullandığımız _doPostBack komutu yerine aşağıdaki kodu da kullanabilirdik.

    <%= ClientScript.GetPostBackEventReference(HiddenField1, "") %>;

Ayrıca kodda bazı optimizasyonlar da yapılabilir. Misal olarak her seferinde hdn değerini eşitlemek yerine javascript genelinde bir değişken açıp oradan da tanımlayabilirdik mesela.

İyi çalışmalar dilerim.

Tags: , , , , ,

ASP.NET | Ajax | Javascript

Hakkımda...

Aklıma gelen sorunlara çözümler yazmaya çalışıyorum burada. Eğer çözümünü yazmamı istediğiniz sorunlar varsa,  bana e-posta atın :-)

 Iyi kodlamalar..

RecentComments

Comment RSS

Tag cloud