jQuery ile Form Kontrolü

Yazan: türker | Tarih 6 Aralık 2008 | Yorum  7 Yorum
BerbatKötüOrtaGüzelHarika 1 kez puan verildi, Ortalama: 5.00 (5 üzerinden)
Loading ... Loading ...

Konunun başlığından da anlaşılacağı üzere jQuery nedir ne değildir diye uzun uzun anlatmayacağım. Zaten bir framework kullanmaya karar verdiyseniz yada halen kullanmaktaysanız nedir, CSS nedir, DHTML nedir, DOM nedir biliyorsunuzdur. Yine de bu saydıklarım içinde kendinizi yetersiz bulduğunuz veya halen bilmediğiniz birşey varsa bu yazının devamındakileri anlamayabilirsiniz. (Uzun uzun anlatmayacağım dedim ama yine de kısaca bazı şeylere değinmek lazım.)

jQueryWeb2.0 ile birlikte javascriptin kıymeti daha da anlaşıldı. Kullanıcı ile anında etkileşime girmek, sayfalara çeşitli efektler vermek artık vazgeçilmez şeyler haline geldi. , css ve html bilgimiz üst seviyelerde bile olsa her yaptığımız işte/projede uzun uzun kodlar yazmaktan sıkılır hale geldik. Bu noktada framework denen, çok sık yaptığımız işleri daha kolay hale getiren ve bunun yanında yapılması uzun vakit ve pek çok satır kod gerektirecek bazı efektleri, etkileşimleri vs. daha çabuk ve kolay şekilde bizim kullanımımıza sunan hazır kütüphaneler oluştu. Bunlardan benim bildiklerim: DoJo, Prototype, Ext Js, mootools ve jQuery. Hepsinin iyi ve kötü yönleri sayfa sayfa internette tartışılıyor. Ancak framework kullanıyor olmak hiç bilmeden az çok birşeyler yapabilmek anlamına geliyor gibi gözüksede illaki bir noktada fonksiyonlarından veya nesnelerinden faydalanmanız gerekiyor.

Başlamadan önce, eğer jQuery ile ilgili bilginiz pek yoksa referans olması açısından aşağıdaki yazılara gözatmanızı tavsiye ederim:
jQuery Dökümantasyonu
jQuery dünyasına adım atıyoruz
jQuery ve Seçiciler
jQuery ve Css işlemleri
jQuery ve Olaylar
jQuery ve DOM işlemleri
jQuery ve AJAX işlemleri
jQuery ve Efekt işlemleri
jQuery ve JSON işlemleri

Gelelim asıl işimize. Malum web sitelerin olmazsa olmazı formlar. Kayıt formları, sipariş formları, bilgi formları... uzar gider bu liste. Fakat hemen hepsinin ortak yönü bazı bölümlerinin ziyaretçi tarafından boş bırakılmaması gerektiği veya sadece belirli kriterler içinde doldurulması gerektiği. En basitinden bir giriş formu şu şekilde olacaktır:

HTML:
  1. <form action="giris.php" method="post" id="girisformu">
  2. Kullanıcı adı: <input type="text" name="user" id="user" /><br />
  3. Şifre: <input type="text" name="pass" id="pass" /><br />
  4. <input type="submit" value=" Gönder " />
  5. </form>

Yine bu formun boş bırakılmamasını sağlamak için yazılabilecek basit bir kod şu şekilde olabilir:

JAVASCRIPT:
  1. $(document).ready( function() {
  2.   $("#girisformu").submit(function() { // form submit edildiğinde....
  3.     if ($("#user").val()=='' || $("#pass").val()=='') { // eğer kullanıcı adı ve şifre boş ise...
  4.       alert("Tüm Alanları Doldurun!"); // uyarı mesajı ver
  5.       return false; // formun gönderilmesini durdur
  6.     }
  7.   });
  8. });

Bu yöntemi kullanarak formdaki her alanı tek tek kontrol edebiliriz ancak bunu yapmak programcı için epey eziyet verici bir hal alabilir. İçinde 10-15 tane input alanı(radio, checkbox veya select) ve textarea olan ve üstelik, sadece bazı alanların boş bırakılmaması gerektiği bir form olduğunu düşünürseniz yazmanız gereken kodun ne kadar uzayabileceğini az çok tahmin edebilirsiniz.

Örneğin hazırladığınız bir formda sadece text tipindeki inputların doldurulması gerekiyorsa şöyle birşey işinizi görebilir:

JAVASCRIPT:
  1. $(document).ready( function() {
  2.   $("#girisformu").submit(function() {
  3.     $("input").each(function(){
  4.       if ($(this).attr("type")=='text' && $(this).val()=='') {
  5.         alert("Gerekli Alanları Doldurun!");
  6.         return false;
  7.       }
  8.     });
  9.   });
  10. });

Yukarıdaki yöntemler bazen işimizi görse de her zaman kullanmak mümkün olmayacaktır. Genel amaçlı bir kullanım için kendi hazırlayacağımız bir form doğrulama sistemi, her işde/projede aynı kodları yazmaktan bizi kurtaracaktır.

Şimdilik sadece boş mu/dolu mu kontrolü yaptık. Elbette daha detaylı doğrulamalara ihtiyacımız olacak. Bu yüzden, önceden belirlediğimiz form elemanlarını(input, radio, textarea farketmeden) test edebilen bir kod hazırlamamız lazım. Buradaki anahtar nokta, jQuery(veya diğerleri) ile kontrol yapacaksak bir şekilde kontrol yapacağımız elemanı diğerlerinden ayırabilmemiz yani seçebilmemiz lazım. Bunun için genelde hep aynı yöntem ufak farklılıklarla uygulanır. Kimisi form elemanına ait id özelliğini, kimisi class özelliğini, kimisi name özelliğini denetler. Bunların hepsi doğrudur ancak ben accesskey özelliğini kullanmayı tercih ediyorum. Malum name, class ve id özellikleri farklı amaçla da kullanıldığı için bazen bizim doğrulama scriptimiz için kullanışsız olabilirler.

Örnek formumuz şu şekilde olsun:

HTML:
  1. <form action="giris.php" method="post" id="register">
  2. Kullanıcı adı: <input type="text" name="user" id="user" accesskey="r,a" title="Kullanıcı adı" /><br />
  3. Şifre: <input type="text" name="pass" id="pass" accesskey="r" title="Şifre" /><br />
  4. İsim: <input type="text" name="name" id="name" accesskey="r,w" title="İsim" /><br />
  5. Email: <input type="text" name="email" id="email" accesskey="r,e" title="Email" /><br />
  6. Telefon: <input type="text" name="phone" id="phone" accesskey="n" title="Telefon" /><br />
  7. Adres: <textarea name="address" accesskey="min:10,max:100" title="Adres"></textarea><br />
  8. Şehir: <select name="city" id="city" title="Şehir" accesskey="r">
  9. <option value="0">seçiniz</option><option value="1">ankara</option><option value="2">istanbul</option>
  10. </select><br />
  11.  
  12. <input type="submit" value=" Gönder " />
  13. </form>

Bu formdaki elemanların hepsine title ve accesskey özelliklerinin atandığını görüyorsunuz. title özelliğinin değeri(içeriği) kullanıcıya gösterilecek uyarı mesajları için, accesskey özelliğinin değeri ise gerekli denetimleri yapabilmemiz için kullanılılacak. Burada ben kendime göre bazı kısaltmalar kullandım. Mesea r=gerekli, a=alfanümerik, n=nümerik, w=harf, e=email, min:X=en az X karakter uzunluğunda,, max:X=en fazla X karakter uzunluğunda anlamında tanımladım. Siz bunlara ekleme yapabilir veya kendinize göre değiştirebilirsiniz. Tabiki buna göre hazırlayacağınız jQuery scripti de düzenlenmelidir.

Gelelim bunları yorumlayacak scripte. İşlevi şu şeklide olacak, ilk önce form nesnesinin içindeki tüm form elemanlarını alacağız. Daha sonra accesskey özelliği olanları denetleyip, accesskeyde tanımlanmış işleme göre gerekli kontrolleri yapacağız.

JAVASCRIPT:
  1. $(document).ready( function() {
  2.   $("#register").submit(function() {
  3.     $.stop=false;
  4.     var emailfilter=new RegExp("^([a-z0-9_\.\-])+\@([a-z0-9\-])+\.([a-z]{2,4})(\.([a-z]{2,4}))?$","i"); // email doğrulamasında kullanılacak regExp deseni
  5.     var inputs=$("#register>:input");  // $("form> *"); şeklinde veya $(":input"); şeklinde de seçilebilir
  6.     if (inputs.length<1) alert("Formda eleman yok, neyi denetleyelim?!");
  7.     else {
  8.       var message="";
  9.      
  10.       inputs.each(function(){
  11.         var inputVal=$.trim($(this).val()); // form elamanın değeri        
  12.         var inputTitle=$.trim($(this).attr("title")); // form elemanın title değeri
  13.         var checkList=$.unique($.trim($(this).attr("accesskey")).split(",")); // accesskey içindeki değerleri parçalayıp, array yapalım
  14.        
  15.         if (checkList.length>0) {
  16.           for (i=0;i<checkList.length;i++) { // accesskeyde tanımlanmış tüm direktifleri test etmeye başlayalım
  17.             var value=$.trim(checkList[i]);
  18.             if (value.search(":")!=-1) { // max ve min tanımlaması var...
  19.               var limits=value.split(":");
  20.               var type=limits[0]; // max veya min
  21.               var len=limits[1]; // X
  22.               if (type=='max'&&inputVal.length>len) {
  23.                 if (inputTitle!="") message=message+inputTitle+" alanına en fazla "+len+" karekter girilebilir!\n";
  24.               }
  25.               if (type=='min'&&inputVal.length<len) {
  26.                 if (inputTitle!="") message=message+inputTitle+" alanına en az "+len+" karekter girilmelidir!\n";
  27.               }
  28.             }
  29.             else {
  30.               if (value=="r" && (inputVal==""||inputVal==0)) { // doldurulması zorunlu
  31.                 if (inputTitle!="") message=message+inputTitle+" alanının doldurulması zorunludur!\n";
  32.               }
  33.              
  34.               if(inputVal!=""&&inputVal!=0&&value!="r") { // doldurulması zorunlu değil ancak belli kriterlere göre doldurulmalı
  35.                 if (value=="e" && emailfilter.test(inputVal)==false) { // email doğrulaması
  36.                   if (inputTitle!="") message=message+inputTitle+" alanına girilen e-mail adresi geçerli değil!\n";
  37.                 }
  38.                 if (value=="w" && inputVal.search(/^[a-z]+$/ig|>)==-1) { // harf doğrulaması
  39.                   if (inputTitle!="") message=message+inputTitle+" alanına sadece harf girilmelidir!\n";
  40.                 }
  41.                 if (value=="n" && inputVal.search(/^[0-9]+$/ig|>)==-1) { // rakam doğrulaması
  42.                   if (inputTitle!="") message=message+inputTitle+" alanına sadece rakam girilmelidir!\n";
  43.                 }
  44.                 if (value=="a" && inputVal.search(/^\w+$/ig)==-1) { // alfanümerik doğrulama
  45.                   if (inputTitle!="") message=message+inputTitle+" alanına sadece alfanümerik karakterler girilmelidir!\n";
  46.                 }
  47.               }
  48.             }
  49.           } // for
  50.         } // if
  51.       });
  52.      
  53.       if (message!="") alert(message); // hataları gösterelim
  54.       else $.stop=true;
  55.     }
  56.     return $.stop
  57.   });
  58. });

Tüm kodları bir fonksiyon haline getirirseniz kullanması daha pratik olacaktır. Hatta jQuery'e eklenti olarak bile ekleyebilirsiniz. Tabiki bu kodların ufak tefek eksiklikleri (mesela radio input için bu kodlar düzgün çalışmayacaktır) olabilir yada daha performanslı çalışmasını sağlayacak iyileştirmeler yapılabilir. Bu halini uzun uzun test edecek vaktim olmasa da işin mantığını kavramanıza yeteceğini düşünüyorum.

Peki hazırı varken kendimiz neden oturup bunları hazırlayalım. Hazıra dağ dayanmaz diye bir laf vardır... Belki ufak tefek işlerde hazır olanları kullanmak size yeter ancak büyük çaplı işlerde çalışacaksınız veya biraz karmaşık işlemler yapacaksanız mutlaka kendiniz buna benzer kodlamalar yapmak durumunda kalıyorsunuz. Çünkü hazır olarak kullandığınız kütüphanenin ne kadar doğru kodlandığı, kodlanırken nelerin göz önüne alındığı ve performansın ne kadar düşünüldüğü, ne kadar zaman önce kodlandığı gibi etmenler çok önem arz edebiliyor. Herşey bir tarafa kulladığınız dilin/frameworkun yeneklerini gerçekten öğrenmek istiyorsanız, olabildiğinice kendi kodlarınızı yazmanızı öneririm.

Kolay gelsin.

Çok sevdim, başkalarıyla paylaşayım:
  • Google Bookmarks
  • Facebook
  • MySpace
  • TwitThis
  • del.icio.us
  • Digg
  • Live
  • YahooMyWeb
  • Technorati
  • StumbleUpon
Yazdır Yazdır | 5,010 Görüntülenme | Kategori: HTML & Javascript & Ajax | Trackback  Geri İzleme
Etiketler  Etiketler: , , , , , ,

Benzer Yazılar


Yorum Yap


(gerekli)

(gerekli,yayınlanmaz)




XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>