Dinamik HTML
26 Kasım 2007
W3C DOM Düzey 2 OlaylarıOlayların çalışması konusunda bir fikriniz oldu. Şimdi W3C DOM Düzey 2'de durum nedir ona bakalım. Buradaki adreste ayrıntılı bilgi vardır: DOM Olayları (Events)Yakalama ya da Fokurdama (Capture or Bubble)?DOM'un bir sayfada nasıl siradüzensel yapıda olduğunu anımsayıp olaylara ne olduğuna bakalım:
Let's take a look at an example page: Şimdi aşağıdaki örneğe bakalım: Ve şimdi olayın üç yöne gidişini gösteren çizime bakalım: 1. Olay içinde bulunduğu düğümde etkindir
2. Yakalama - bir düğümde olay olduğunda ve en üst noktadan aşağıya doğru tümünü ateşlediğinde.
3. Fokurdama - Bir düğümde olay olduğunda ve olayın olduğu düğümden yukarı doğru tümünü ateşlediğinde
Yöntemleri AnlamaBir olay oluştuğunda üç değişik biçimde geliştiğini biliyoruz. Şimdi bazı kodlamalara bakalım. "addEventListener(eventType, Function, useCapture)" Bir düğümden çalıştırılacak olayı ekler.
"removeEventListener(eventType, Function, useCapture)" Çalıştırılacağı düğümden bu olay dinleme işlemini kaldırmak için kullanılır. Unutulmaması gereken en önemli nokta tüm parametreler "addEventListener()" işlemindekiyle aynı olmalıdır. Eğer "addEventListener()" işleminde useCapture değerini "false" olarak atamışsanız, removeEventListener() işleminde buraya "true" yazarsanız silme işlemi çalışmaz... "stopPropagation()" Olayın dökümanın diğer yerlerinde dolanmasını engeller. Örneğin olayın yakalanmasıni ya da fokurdamasını engeller. DOM Örnekleri
DOM yazılımı için bir tablo üzerinde çalışacağız. Bir tablo yaratacağız. Hücresi tıklandığında rengi değişecek ve "ışıldayacak". Tablonun bir hücresi seçildiğinde görünen bir form çıkacak ve yapabileceğimiz işlemleri belirtecek. Yeni satır ekleme, seçilen satırı silme, o anki satırı kopyalama, kopyalanan satırı yapıştırma ve satırın yazısını değiştirme. Buradaki örnek
Örnek 12
yalnız NS 6 ve Mozilla tarayıcılarında çalışır.
Örnek KodŞimdi parç parça bu kodu inceleyelim Bu kod kullanacağımız küresel değişkenlerimizi yaratır. "selectedTD" kullanıcının seçtiği tablo hücresini saklar. "copiedTD" Kullanıcının kopyaladığı tablo hücresini saklar. "document.createElement()" işlemiyle yarattığımız değişik tablo bölümlerinin değerlerinin "table, tbody, tr, td, text" değişkenleri saklar. Tablomnuzu yaratalımBu işlev yeni satır yaratır ve değerlerini ilgili değişkenlerde saklar. Bu işlev, parametresinden gelen yazıya göre bir yazı düğümü yaratır. It creates a textNode with the text passed in its sole argument. Also, it assigns some attributes to the table cell tag; the bgColor Tablo hücresinin niteliklerine de değerler atar. Aslında "bgColor" bu yazılımda oldukça çok kullanılan bir niteliktir. Varsayılan değeri seçilmediğinde pembedir (seçilince parlak mavi olacaktır). Ek olarak bu yeni yaratılmış tablo hücrelerine "Olay Dinleyici" eklemekteyiz. Böylece hücrelerden birini tıklayınca "clickTD" işlevini çalıştıracağız. Kodun bu bölümü "align" niteliği ortalanmış (center) bir "div" öğesi yaratır. Aynı zamanda bir "table" öğesi "div" öğesinin çocuğu olarak yaratılır. Daha sonra "tbody" öğesi "table" öğesinin çocuğu olarak yaratılır. Artık yeni satırlar "tbody" öğesinin altına eklenecektir. Son olarak "div" öğesi "body" öğesinin arkasına eklenir. Böylece tamamı aşağıdaki HTML kodunu üretmeiş olur. clickTD işleviŞimdi bir başka kod parçasını inceleyelim: Bu kod zor gelebilir ama göründüğü gibi değildir. Biri tablo hücresinde fareyi tıkladığında bu işlev çalışmaya başlar. Hücrenin art alan rengi değişerek hücre seçilmiş (etkinleştirilmiş) olur. Daha önce seçilmiş bir başka hücre varsa o hücrenin etkinleştirilmiş olması kaldırılır. (rengi yeniden pembeye döner). Hücre etkinleştirilince tablonun hemen altında bir form görüntülenir. Seçilmiş hücre yeniden tıklandığında etkinleştirilme kalkar ve görüntülenmiş form kaybolur. Öncelikle "clickTD" bir işlev olarak tanımlanır. Eğer hücre daha önce seçilmişse, etkinliği kaldırılır ve art alan rengi diğer hücrelerinki gibi "pembe" olur. "selectedTD" değişkenine kullanıcının tıkladığı tablo hücresinin değerini atar. Tıklanan hücrenin rengini de "mavi" yapar. Bundan sonra "showForm" işlevi çalıştırılır. Birazdan incelenecek olan form bu işlevle görüntülenir. Eğer tıklanan tablo hücresi daha önce seçilmişse, şimdi seçilmişlik kaldırılmak istenmektedir. Bu durumda "selectedTD" değeri "null" yapılır ve "form" "hideForm" işleviyle saklanır. FormDaha çok ilerlemeden "Form" kodunu inceleyelim:: Şimdi bu formu gösteren ve saklayan işlerleri inceleyelim. Form öncelikle (sayfa yüklenince) saklıdır. İşlevlerimiz:
function hideForm(){
document.getElementsByTagName("form").item(0).setAttribute("style","display:none");
}
function showForm(){
document.forms[0].setAttribute("style","display:block");
}
"hideForm" işlevi formu saklar, "showForm" işlevi formu görüntüler. form öğesine her iki biçimde de ulaşmanın nasıl olduğu görülmüş olur. Seçilen tablo hücresinde işlerin nasıl yapıldığına bakalım. Yeni Satır Ekle
function insertNR(){
if(document.forms[0].newTextInput.value=="")
createNewRow("This is the new table cell");
else createNewRow(document.forms[0].newTextInput.value);
tbody.insertBefore(tr,
selectedTD.parentNode.nextSibling);
window.resizeBy(-10,-10);
window.resizeBy(10,10);
}
Bu işlev yeni satır oluşturur. Eğer "newTextInput" giriş alanı boşsa, yeni tablo hücresini soysal yazıyla üretir. Aksi halde "next" değeri "newTextInput" içinde olacak biçimde yeni hücreyi üretir. Üretilen hücre seçilenin peşine eklenir. Unutmayın ki "selectedTD.parentNode" "td" öğesinin bulunduğu "tr" öğesini gösterir. "selectedTD.parentNode.nextSibling" ise seçili öğeden sonra gelen ilk "tr" öğesini belirtir. Böylece yenisi seçilenden selectedTD.parentNode sonra eklenebilir. O da selectedTD.parentNode.nextSibling'dan öncekidir. Burada kodun sonunda yer alan "window.resizeBy()", birden çok satır eklemek ya da yapıştırmak isteyince çıkan Mozilla hatasını geçiştirmek için kodlanmıştır. Hücre Yazısını Değiştir
function changeText(txt){
if(txt="")return;
selectedTD.firstChild.nodeValue = txt;
}
Bunun yaptığı document.forms[0].newTextInput içindeki veriyi parametre olarak geçirmektir (txt). Ama document.forms[0].newTextInput.value değeri boşsa, hiçbir şey yapmaz. Hücre Kopyala
function copyCell(cellToCopy){
copiedTD = selectedTD.cloneNode(true);
copiedTD.setAttribute("bgColor","purple");
copiedTD.addEventListener("click", clickTD, false);
}
Seçilen hücreyi kopyalar. Seçilen hücre zaten selectedTD içinde olduğundan aynı özellikleri olan copiedTD gerekmez. Seçilen etkinleştirilmiştir ama kopyalanın da etkinleştirilmesi gerekmediğinden bu özellik kaldırılmıştır. Son olarak kopyalanan bir düğümün EventListener özellikleri kopyalanmadığından yeni düğüm için bunları ayarlamak gerekir. Hücreyi Yapıştır
Önce hücrenin kopyalanıp kopyalanmadığını saptar. Eğer kopyalanmamışsa işlev son bulur. Ama kopyalanmışsa işlev devam eder. Yeni bir "tr" öğesi ekler ve ona "copiedTD" içindeki "td" öğesini ekler. Ve yeni tablo satırını hemen seçilenin altına ekler. Daha sonra Mozilla düzeltme koduna yer verilmiştir.
Burada çekirdek DOM (temel DOM) kullandık, ama DOM buradakiler yerine hazır işlevleri vardır. "insertRow" ve "deleteRow" bunlardan bazılarıdır. Bu yöntemler bazı öğeler için geçerlidir. Konuya ilişkin WEB sayfası
DOM-HTML ve burada anlatılanların (tablolar gibi) yer aldığı belgeler DOM-HTML: TABLES altında bulunabilir.
![]() |
|