Professional Documents
Culture Documents
Ajax’a Giriş
Web sitesi oluşturma konusunda verimli bir yaklaşım olan Ajax’ı ve nasıl çalıştığını anlamak
Düzey: Giriş
06 Aralık 2005
HTML, JavaScript™ teknolojisi, DHTML ve DOM’dan oluşan Ajax, eski ve hantal Web
arabirimlerini etkileşimli Ajax uygulamalarına dönüştürmenizi sağlayan önemli bir
yaklaşımdır. Ajax uzmanı olan yazar, bu teknolojilerin birlikte çalışarak Web geliştirmesinde
çok verimli sonuçlar elde edilmesinin kolay bir gerçekliğe nasıl dönüştürüldüğünü genel
bilgilerden başlayıp daha ayrıntılı bilgelere geçerek göstermektedir. Ayrıca, XMLHttpRequest
nesnesi gibi Ajax’ın temel kavramlarına da ışık tutmaktadır.
Beş yıl önce, XML bilginiz yoksa, kimsenin konuşmadığı çirkin ördek yavrusu gibi
görülürdünüz. On sekiz ay önce, Ruby gündeme geldi ve Ruby konusunda bilgisi olmayan
programcıların, iş arkadaşlarının ayaküstü sohbetlerine katılması bile zordu. Bugün, en son
teknoloji furyasına kapılmak istiyorsanız, işe Ajax ile başlamanız gerekiyor.
Bununla birlikte, Ajax yalnızca gelip geçici bir akım değildir; web sitesi geliştirmek
konusunda güçlü bir yaklaşımdır ve yeni bir dili öğrenmek kadar zor değildir.
Ajax’ı derinlemesine incelemeye başlamadan önce, Ajax’ın neler yaptığını anlamak için
birkaç dakikamızı ayıralım. Bugün bir uygulama yazarken, iki temel seçim olanağınız vardır:
• Masaüstü uygulamaları
• Web uygulamaları
Her iki tip uygulama da bilinen uygulamalar; masaüstü uygulamaları genellikle bir CD’de
gelir (ya da bazen bir Web sitesinden yüklenir) ve bilgisayarınıza tam olarak kurulur.
Güncellemeleri yüklemek için Internet’i kullanabilirler, ancak bu uygulamaları çalıştıran kod
masaüstünüzde yer alır. Web uygulamalarıysa, sizin de bildiğiniz gibi, başka bir yerdeki bir
Web sunucusu üzerinde çalışır ve uygulamaya Web tarayıcınızla erişirsiniz.
Tabii bu anlatım biraz fazla basitleştirme oldu ancak ana fikri almış olduğunuzu
düşünüyorum. Sizin de tahmin edebileceğiniz gibi, Ajax bir masaüstü uygulamasının
işlevselliği ve etkileşimi ile her zaman güncellenen bir Web uygulaması arasındaki mesafeyi
kapatmaya çalışır. Bir masaüstü uygulamasında bulabileceğinize benzer dinamik kullanıcı
arabirimleri ve hoş denetimler kullanabilirsiniz, ama bunlar size Web uygulamasında sunulur.
Bu durumda daha ne bekliyorsunuz? Ajax’a göz atmaya başlayın; eski ve hantal Web
arabirimlerinizi hızlı yanıt veren Ajax uygulamalarına dönüştürün.
Şimdi bunları ayıralım ve her birinin neler yaptığına daha yakından bakalım. Bu
teknolojilerden her birini daha sonraki yazılarımda derinlemesine ele alacağım; şu anda bu
bileşenleri ve teknolojileri tanımaya odaklanalım. Bu kod hakkında ne kadar çok şey
bilirseniz, bu teknolojilerle ilgili genel geçer bilgilerden her birini ustalıkla kullanmaya (ve
Web uygulaması geliştirme yeteneklerinizi zenginleştirmeye) geçişiniz daha kolay olacaktır.
XMLHttpRequest nesnesi
Anlamak istediğiniz ilk nesne büyük olasılıkla sizin için en yeni olan XMLHttpRequest adlı
nesnedir. Bu bir JavaScript nesnesidir ve Liste 1’de gösterildiği kadar basit bir şekilde
yaratılabilir.
Bir sonraki yazımda, bu nesneyi daha ayrıntılı ele alacağım, ama şimdilik bu nesnenin tüm
sunucu iletişiminizi yürüten nesne olduğunu anlamanız önemli. Diğer konuya geçmeden önce,
sunucuyla iletişim kuranın XMLHttpRequest nesnesi yoluyla JavaScript teknolojisi olduğunu
düşünün. Bu normal uygulama akışı değildir ve Ajax’ın sihiri büyük ölçüde buradan gelir.
Normal bir Web uygulamasında, kullanıcılar form alanlarını doldurur ve bir Submit (Gönder)
düğmesini tıklatır. Sonra, formun tamamı sunucuya gönderilir, sunucu bir komut dosyasını
işlemeye geçer (genellikle PHP ya da Java ya da belki bir CGI işlemi ya da benzeri) ve komut
dosyası tamamlandığında, sunucu geriye yepyeni bir sayfa gönderir. Bu sayfa, bazı verilerle
doldurulmuş yeni bir form içeren HTML olabilir, bir onay olabilir ya da belki, özgün forma
girilen verilere göre seçilen bazı seçenekleri içeren bir sayfa olabilir. Tabii ki, sunucudaki
komut dosyası ya da program işlem yaparken ve yeni bir form döndürürken, kullanıcıların
beklemesi gerekir. Bu sırada ekran boş kalır ve sunucudan veri geri geldikçe yeniden dolar.
İşte düşük etkileşimin ortaya çıktığı yer burasıdır; kullanıcılar anında geribildirim almaz ve
kesinlikle bir masaüstü uygulamasında çalışıyorlarmış gibi hissetmezler.
Sonra, sunucu, verileri bunlarla ne yapılacağına karar verecek olan JavaScript kodunuza geri
gönderir (hala Web formunun yerine çalışır). JavaScript kodu form alanlarını hızlı bir şekilde
güncelleyebilir, bu şekilde uygulamanızın hızlı olduğu izlenimini verir (kullanıcılar formları
gönderilmeden ya da yenilenmeden yeni verileri alırlar). Hatta JavaScript kodu, kullanıcının
müdahalesi olmadan, verileri alabilir, bazı hesaplamalar yapabilir ve başka bir istek
gönderebilir! Bu, XMLHttpRequest nesnesinin gücüdür. Kullanıcı farkında bile olmadan bu
nesne, istediği bir sunucuyla iletişim kurabilir. Sonuç, arkasında yatan Internet teknolojisinin
gücüyle, bir masaüstü uygulaması gibi dinamik, hızlı yanıt veren, yüksek düzeyde etkileşimli
bir deneyimdir.
JavaScript ekleme
XMLHttpRequest nesnesini nasıl kullanacağınızı öğrendikten sonra, JavaScript kodunuzun
geri kalanı oldukça sıradan gelir. Aslında, JavaScript kodunu yalnızca birkaç temel görev için
kullanırsınız:
• Form verilerini alma: JavaScript kodu HTML formunuzdan veri almayı ve bunları
sunucuya göndermeyi kolaylaştırır.
İlk iki madde için, Liste 2’de gösterildği gibi getElementById() yöntemini öğrenmek
isteyebilirsiniz.
// Get the value of the "phone" field and stuff it in a variable called
phone
var phone = document.getElementById("phone").value;
Burada çok dikkate değer birşey yok ve bu bizim için iyi. Sanırım bu konunun çok karmaşık
bir tarafı olmadığını fark etmeye başladınız. XMLHttpRequest nesnesini iyice öğrendikten
sonra, Ajax uygulamanızın geri kalanının büyük bir bölümü, Liste 2’de gösterildiği gibi biraz
akıllı HTML ile karışık basit JavaScript kodu olacaktır. Sonra, zaman zaman biraz DOM işi
olur. Bu yüzden şimdi DOM’a geçelim.
Neyse ki, DOM’u JavaScript teknolojisinde kullanmak kolaydır. Bu noktada, normal olarak
size DOM’un nasıl kullanılacağını gösterirdim ya da en azından birkaç kod örneği verirdim,
ancak bu bile yanlış yönlendirici olabilirdi. Görüyorsunuz, DOM konusunu fazla
kurcalamadan Ajax konusunda yeterince bilgi sahibi olabilirsiniz, size de bu yolu
göstereceğim. DOM konusunu daha sonraki bir yazımda ele alacağım, şimdilik, yalnızca
DOM’un işin içinde olduğunu bilmeniz yeterli. XML’i JavaScript kodunuz ve sunucu
arasında geri gönderip yeniden aldığınızda ve HTML kodunu gerçekten değiştirdiğinizde,
DOM konusuna yeniden gireceksiniz. Şimdilik, DOM olmadan devam ederek Ajax
konusunda yararlı şeyler öğrenmek kolay olacağından DOM’u dışarıda bırakalım.
Birkaç sene öncesinde yaşanan can sıkıcı tarayıcı savaşlarını ve tarayıcıların hiçbirinin aynı
şekilde çalışmadığını hatırlıyor musunuz? İster inanın, ister inanmayın ama bu savaşlar daha
küçük ölçekli de olsa hala sürüyor. Ve sürpriz: XMLHttpRequest bu kavganın kurbanlarından
biridir. Bu nedenle, bir XMLHttpRequest nesnesini çalıştırmak için birkaç farklı şey yapmanız
gerekiyor. Size bu işlemleri adım adım göstereceğim.
Tüm bunların henüz tam olarak birşey ifade etmemesi normaldir. Bu dizi bitmeden önce
JavaScript programlama, hata yönetimi, koşullu derleme ve başka birçok konu hakkında
derinlemesine bilgi sahibi olmuş olacaksınız. Şimdilik, aşağıdaki iki temel satırı öğrenmeniz
yeterlidir:
ve
Daha basit olan bu satır, Mozilla, Firefox, Safari, Opera ve bir şekilde Ajax’ı destekleyen
Microsoft dışı birçok tarayıcıda bir XMLHttpRequest nesnesi yaratır.
Özet
İşin püf noktası tüm tarayıcıların desteklenmesidir. Kim yalnızca Internet Explorer’da ya da
yalnızca Windows dışı tarayıcılarda çalışan bir uygulama yazmak ister ki? Daha da kötüsü,
uygulamanızı iki kere yazmak ister misiniz? Tabii ki hayır! İşte bu nedenle, kodunuz hem
Internet Explorer, hem de Microsoft dışı tarayıcıları destekler. Liste 4 bunu yapmak için
gerekli olan kodu gösterir.
Şimdilik, açıklamaları ve @cc_on; gibi garip etiketleri göz ardı edin; bunlar yalnızca
XMLHttpRequest üzerine yazacağım bir sonraki makalemde derinlemesine
inceleyebileceğiniz özel JavaScript derleyici komutlarıdır. Bu kodun temeli üç adıma ayrılır:
3. xmlHttp hala oluşturulmadıysa, nesneyi Microsoft dışı bir yöntemi kullanarak yaratın.
Bu işlemin sonunda, kullanıcılarınız hangi tarayıcıyı kullanıyor olursa olsun, xmlHttp, geçerli
bir XMLHttpRequest nesnesine başvuruda bulunmalıdır.
Güvenlik hakkında
Peki ya güvenlik? Günümüzde tarayıcılar kullanıcılara güvenlik düzeylerini yükseltme,
JavaScript teknolojisini devre dışı bırakma ve tarayıcılarındaki istedikleri seçenekleri devre
dışı bırakma yeteneğini sunuyor. Bu gibi durumlarda, büyük olasılıkla kodunuz hiçbir koşulda
çalışmayacaktır. Bu durumlar için, sorunları dikkatli bir şekilde ele almanız gerekir; bu en
azından başlı başına bir yazı konusu ve daha sonra ele alacağım (uzun bir dizi olacak, değil
mi? Ama endişelenmeyin, tamamlamadan önce bunların tümünü çok iyi öğreneceksiniz).
Şimdilik, yazdığınız kod dayanıklı, ama mükemmel değil; bu kadarı bile Ajax’a başlangıç için
büyük bir adım. Daha ince ayrıntılara tekrar döneceksiniz.
Burada eksik kalan nokta nedir? XMLHttpRequest nesnesinin gerçekte nasıl kullanıldığı. Bu
kod yazdığınız her Ajax uygulamasında bir şekilde kullanacağınız çok önemli bir kod
olduğundan Ajax’ta basit bir istek/yanıt modelinin nasıl olduğuna hızlıca bakalım.
İstekte bulunma
Yeni XMLHttpRequest nesneniz hazır. Öncelikle, Web sayfanızın çağrı yapabileceği (bir
kullanıcı metin yazarken ya da menüden bir seçeneği belirlerken olduğu gibi) bir JavaScript
yöntemi gerekir. Sonra, hemen hemen tüm Ajax uygulamalarınızda aynı temel anahattı
izleyeceksiniz:
5. İsteği gönderin.
function callServer() {
// Get the city and state from the web form
var city = document.getElementById("city").value;
var state = document.getElementById("state").value;
// Only go on if there are values for both fields
if ((city == null) || (city == "")) return;
if ((state == null) || (state == "")) return;
Bu örneğin büyük bir bölümü açıklama gerektirmeyecek şekilde açıktır. Kodun ilk bölümü
temel JavaScript kodunu kullanarak birkaç form alanının değerlerini ele alıyor. Ardından,
kod, bağlantı hedefi olarak bir PHP komut dosyası oluşturuyor. Basit GET parametreleri
kullanılarak komut dosyasının URL’sinin nasıl belirlendiğine, ardından (formdaki) city (ilçe)
ve state (il) değerlerinin bu isteğe nasıl eklendiğine dikkat edin.
Bir sonraki adımda, bir bağlantı açılır; burası, XMLHttpRequest nesnesinin yeniden devreye
girdiği ilk yerdir. Bağlantı yöntemi (GET) ve bağlanılacak URL belirtilir. Son parametre, true
olarak belirlendiğinde, eşzamanlı olmayan bir bağlantı (böylece bunu Ajax yaparak) ister.
False değerini kullandıysanız, istek yapıldığında kod sunucuyu bekler ve yanıt alana kadar
devam etmez. Bu değer true olarak belirlendiğinde, sunucu arka planda bu isteği işlerken
kullanıcılarınız formu kullanmaya (hatta başka JavaScript yöntemlerini çağırmaya) devam
edebilirler.
Bu işlem bir fikir sahibi olmanızı sağlamadıysa, ne kadar düz ve basit olduğuna bakın!
Ajax’ın eşzamanlı olmayan doğasının anlaşılmasından başka, göreceli olarak basit bir işlem.
Karmaşık http istek/yanıt kodu yerine size daha yararlı uygulamalara ve arabirimlere
yoğunlaşma özgürlüğü tanımasını takdir edeceksiniz.
Liste 5’teki kod göründüğü kadar kolaydır. Veriler basit metinlerdir ve istek URL’sinin
parçası olarak eklenebilirler. Daha karmaşık olan POST yerine GET komutu isteği gönderir.
Eklenecek XML ya da içerik başlıkları yok, isteğin gövdesinde gönderilecek veri yok; diğer
bir deyişle, bu Ajax Ütopyası.
Korkmayın; bu dizinin ilerleyen bölümlerinde işler daha karmaşık bir hal alacak. POST
isteklerini göndermeyi, istek üstbilgilerini ve içerik türlerini belirlemeyi, iletinizde XML’i
kodlamayı, isteğinize güvenlik eklemeyi ve burada sıralaması zaman alacak daha birçok
işlemi öğreneceksiniz. Şimdilik kafanızı zor işlemlerle yormayın; temel ilkeleri kavramaya
çalışın, kısa bir süre sonra tam donanımlı bir Ajax araç deposu oluşturacaksınız.
İsteğin işlenmesi
Artık sunucunun yanıtıyla çalışmanız gerekiyor. Bu aşamada yalnızca iki noktayı bilmeniz
gerekir:
Bu hazır durumlardan ilki bir sonraki yazının ana konusu; bir HTTP isteğinin aşamaları
hakkında bilmek istediğinizden daha fazlasını öğreneceksiniz. Şimdilik, yalnızca belirli bir
değeri (4) kontrol ederseniz, işler düzgün gider (ve bir sonraki yazının konusunu dört gözle
beklersiniz). Sunucunun yanıtını almak için xmlHttp.responseText özelliğinin kullanılması
olan ikinci nokta kolaydır. Liste 6’da, sunucunun Liste 5’te gönderilen değerlere dayanarak
çağırabileceği bir yöntem örneklenir.
function updatePage() {
if (xmlHttp.readyState == 4) {
var response = xmlHttp.responseText;
document.getElementById("zipCode").value = response;
}
}
Yine, bu kod da çok zor ya da karmaşık değildir. Sunucunun doğru olan hazır durumla
kendini çağırmasını bekler, ardından sunucunun döndürdüğü değeri (bu örnekte, kullanıcının
girdiği ilçe ve ilin posta kodu) kullanarak başka bir form alanının değerini belirler. Sonuç
olarak, zipCode alanında birden posta kodu görünür (ama kullanıcının hiçbir zaman bir
Gözlemci okuyucular zipCode alanının normal bir metin alanı olduğunu fark etmiş olabilirler.
Sunucu posta kodunu döndürdüğünde ve updatePage() yöntemi bu alanın değerini ilçe/il
posta koduyla belirlediğinde, kullanıcılar bu değeri başka bir değerle değiştirebilirler. Bunun
iki nedeni vardır: Örnekteki öğelerin basit olmasını sağlamak ve size bazen kullanıcıların, bir
sunucunun söylediğini değiştirebilmelerini istediğinizi göstermek. Her iki nedeni de dikkate
alın; çünkü bunlar iyi bir kullanıcı arabirimi tasarımı için önemli özelliklerdir.
<form>
<p>City: <input type="text" name="city" id="city" size="25"
onChange="callServer();" /></p>
<p>State: <input type="text" name="state" id="state" size="25"
onChange="callServer();" /></p>
Bunun da diğerleri gibi oldukça rutin bir kod olduğunu düşünüyorsanız, haklısınız, öyle! Bir
kullanıcı ilçe ve il alanına yeni bir değer girdiğinde, callServer() yöntemi devreye girer ve
Ajax eğlencesi başlar. Birşeyleri kavramaya başladınız mı? Güzel; amacımıza ulaştık!
Sonuç
Bu aşamada, büyük olasılıkla çıkıp ilk Ajax uygulamanızı yazmaya hazır olmayacaksınız;
tabii en azından Kaynaklar bölümünde gerçekten inceleme yapmaya istekli değilseniz.
Bununla birlikte, bu uygulamaların nasıl çalıştığıyla ve XMLHttpRequest nesnesiyle ilgili
temel bilgileri kavramaya başlayabilirsiniz. Sonraki makalelerde, bu nesne, JavaScript ve
sunucu arasındaki iletişimi yönetme, HTML formlarıyla çalışma, hatta DOM’la ilgili temel
kavramlar konusunda derinlemesine bilgi sahibi olacaksınız.
Kaynaklar
Bilgi
Tartışma
Düzey: Orta
17 Ocak 2006
Web uygulamalarının çoğu, sunucudan tüm HTML sayfasını alan bir istek/yanıt modelini
kullanır. Sonuçta kullanıcı bir düğmeyi tıklatır, sunucuyu bekler, başka bir düğmeyi tıklatır ve
biraz daha bekler. Ajax ve XMLHttpRequest nesnesiyle, kullanıcıların sunucu yanıtını
beklemelerine hiçbir zaman gerek bırakmayan bir istek/yanıt modeli kullanabilirsiniz. Bu
makalede, Brett McLaughlin, çapraz tarayıcı yöntemiyle XMLHttpRequest örneklerinin nasıl
oluşturulacağını, isteklerin oluşturulmasını ve gönderilmesini ve sunucuya yanıt verilmesini
gösteriyor.
Bu dizinin son makalesinde (bağlantılar için bkz. Kaynaklar), Ajax uygulamalarına giriş
yapılmış ve Ajax uygulamalarının kullandığı bazı temel kavramlara bakılmıştı. Bunun
merkezinde, önceden biliyor olabileceğiniz birçok teknoloji vardır: JavaScript, HTML ve
XHTML, biraz dinamik HTML ve hatta, biraz DOM (Document Object Model; Belge Nesne
Modeli). Bu makalede, uzak mesafeden konuya yaklaşıp özel Ajax ayrıntılarına
odaklanacağım.
Öncelikle, kodun içine dalmadan bu genel bakışın son kısmını ele alalım -- Web 2.0
konusunda her şeyin kafanızda net olduğundan emin olun. Web 2.0 terimini duyduğunuzda,
sormanız gereken ilk şey "Web 1.0 nedir?" olmalıdır. Web 1.0 terimi çok sık duyulmasa da,
çok belirgin bir istek ve yanıt modelinin kullanıldığı geleneksel Web için kullanılmaktadır.
Örneğin, Amazon.com'a gidin ve bir düğmeyi tıklatın ya da bir arama terimi girin. Sunucuya
bir istek gönderilir ve tarayıcınıza bir yanıt gelir. Bu istek, kitaplar ve başlıklardan oluşan bir
listeden çok daha fazlasını içerir; aslında bu başka bir tam HTML sayfasıdır. Sonuç olarak,
Web tarayıcınızın ekranı bu yeni HTML sayfasıyla yeniden çizilirken bazı yanıp sönen
şekiller görürsünüz. Aslında, gördüğünüz her bir sayfayla tanımlanan istek ve yanıtı açıkça
görebilirsiniz.
Daha sonra, bu yeni etkileşimlerin nasıl mümkün kılınacağını düşünmeniz gerekir. Tabii, hala
isteklerde bulunmanız ve yanıtları almanız gerekir, ancak yavaş ve aksak bir Web arabirimi
algılamasını veren şey, her bir istek/yanıt etkileşiminde HTML'in yeniden çizilmesidir. Daha
net bir şekilde anlatırsak, tüm HTML sayfasının yerine, yalnızca ihtiyacınız olan veriler için
istekte bulunacak ve yanıtları alacak bir yaklaşıma ihtiyacınız vardır. Yeni bir tam HTML
sayfasını yalnızca, kullanıcının yeni bir sayfa görmesini istediğinizde almak isteyebilirsiniz.
Ancak etkileşimlerin çoğu, ayrıntı ekler ya da gövde metnini değiştirir ya da var olan
sayfalardaki verilerin üzerine yazar. Bu durumların tümünde, Ajax ve Web 2.0 yaklaşımı tüm
HTML sayfasını güncellemeden veri gönderip almayı mümkün kılar. Ve bu yetenek, sık sık
Web'de dolaşan kullanıcılara uygulamanızın çok daha hızlı, daha çabuk yanıt veren bir
uygulama olduğunu düşündürecek ve tekrar tekrar geri gelmelerini sağlayacaktır.
XMLHttpRequest'e Giriş
Bunların tümünü (ya da hiçbirini) anlamazsanız üzülmeyin -- bundan sonraki birkaç makale
içinde her bir yöntem ve özellik ayrıntılarıyla anlatılacaktır. Buradan çıkarmanız gereken,
XMLHttpRequest ile ne yapacağınıza ilişkin iyi bir fikirdir. Bu yöntemlerin ve özelliklerin her
birinin, bir istek göndermeyle ve bir yanıtı işlemeyle ilgili olduğuna dikkat edin. Aslında,
XMLHttpRequest nesnesinin her yöntemini ve özelliğini gördükçe, bunların tümünün o çok
basit istek/yanıt modeliyle ilişkili olduğunu anlayacaksınız. Açıkçası, inanılmaz bir GUI
nesnesiyle ya da kullanıcı etkileşimi yaratmak için süper gizli bir yaklaşımla ilgili bilgi
almayacaksınız; basit istekler ve basit yanıtlarla çalışacaksınız. Bu kulağa heyecan verici
gelmeyebilir, ancak bu tek nesnenin dikkatli bir şekilde kullanılması uygulamalarınızı
tamamen değiştirebilir.
Yeninin basitliği
Çok zor değildi, değil mi? Unutmayın, JavaScript, değişkeninin üzerine yazılmasını
gerektirmez, bu nedenle Liste 2'deki gibi bir şeye ihtiyacınız yoktur (bu nesneyi Java
yaratsaydınız, böyle yapmanız gerekebilirdi).
JavaScript'te var ile bir değişken yaratır, buna bir ad verir ("request" gibi) ve daha sonra
bunu, yeni XMLHttpRequest örneğine atarsınız. Bu noktadan sonra nesneyi işlevlerinizde
kullanabilirsiniz.
Hata işleme
Gerçek yaşamda, işler kötü gidebilir ve bu kod, hata işleme özelliği sağlamaz. Bu nesneyi
yaratmak ve işler ters giderse nesneyi hatalı olarak ayırmak biraz daha iyi bir yaklaşımdır.
Örneğin, eski tarayıcıların birçoğu (ister inanın ister inanmayın, insanlar hâlâ Netscape
Navigator programının eski sürümlerini kullanmaya devam ediyorlar) XMLHttpRequest
nesnesini desteklemez ve bu kullanıcılara, bir şeyin ters gittiğini bildirmeniz gerekir. Liste
3'te, bu nesnenin, hata oluştuğunda JavaScript uyarısı verecek şekilde nasıl yaratılacağı
gösterilmektedir.
if (!request)
alert("Error initializing XMLHttpRequest!");
</script>
1. Request adlı yeni bir değişken oluşturun ve buna, bir false (yanlış) değeri atayın.
XMLHttpRequest nesnesinin henüz yaratılmadığını belirten bir koşul olarak false
(yanlış) değerini kullanacaksınız.
2. Bir try/catch (dene/yakala) bloğu ekleyin:
1. XMLHttpRequest nesnesini yaratmayı deneyin.
2. Başarısız olursanız (catch (failed)), request değişkeninin false (yanlış)
değerinde kaldığından emin olun.
3. Request değişkeninin hâlâ false (yanlış) değerinde olup olmadığına bakın (işler
yolundaysa, bu değerde kalmış olmayacaktır).
4. Bir sorun varsa (ve request false değerindeyse), kullanıcılara bir sorun olduğunu
bildirmek için bir JavaScript uyarısı kullanın.
Bu oldukça basittir; çoğu JavaScript ve Web geliştiricisi için konuyu anlamak, ilgili konuları
okuyup yazılar yazmaktan çok daha kısa sürer. Artık XMLHttpRequest nesnesi yaratan ve
hata kabul etmeyen bir kod parçanız var, üstelik ters giden şeylerle ilgili size bilgi de veriyor.
Her şey yolunda gibi görünüyor ... en azından bu kodu Internet Explorer'da deneyinceye
kadar. Bunu denerseniz, Şekil 1'dekine benzer, berbat görünen bir sonuç alırsınız.
Görünen o ki, bir şeyler ters gidiyor; Internet Explorer'ın modası geçmiş bir tarayıcı olduğu
söylenemez ve dünyanın yaklaşık %70'i Internet Explorer kullanmaya devam ediyor. Diğer
bir deyişle, Microsoft ve Internet Explorer'ı desteklemezseniz, Web dünyasında çok da
başarılı olamazsınız. Bu nedenle, Microsoft'un tarayıcılarıyla çalışmak için farklı bir
yaklaşıma ihtiyacınız var.
Görünüşe göre Microsoft Ajax'ı destekliyor, ancak kendi XMLHttpRequest sürümüne farklı
bir ad veriyor. Aslında, bunun için birkaç farklı ad kullanıyor. Internet Explorer'ın daha yeni
bir sürümünü kullanıyorsanız, Msxml2.XMLHTTP adlı nesneyi kullanmanız gerekir; bazı eski
Internet Explorer sürümleri Microsoft.XMLHTTP nesnesini kullanır. Bu iki nesne tipini
desteklemeniz gerekir (bu arada Microsoft dışındaki tarayıcıların desteğini de
kaybetmemelisiniz). Daha önce gördüğünüz koda Microsoft desteği ekleyen Liste 4'e bakın.
if (!request)
alert("Error initializing XMLHttpRequest!");
Bu dolambaçlı yollarda kaybolmak oldukça kolay olduğundan ben size adım adım yol
göstereceğim:
1. Request adlı yeni bir değişken oluşturun ve buna, bir false (yanlış) değeri atayın.
Koşul için XMLHttpRequest nesnesinin henüz yaratılmadığını belirten false (yanlış)
değerini kullanın.
2. Bir try/catch (dene/yakala) bloğu ekleyin:
1. XMLHttpRequest nesnesini yaratmayı deneyin.
2. Başarısız olursa (catch (trymicrosoft)):
1. Microsoft'un daha yeni sürümlerini kullanarak Microsoft uyumlu bir
nesne yaratmayı deneyin (Msxml2.XMLHTTP).
2. Başarısız olursa (catch (othermicrosoft)), Microsoft'un eski
sürümlerini kullanarak Microsoft uyumlu bir nesne yaratmayı deneyin
(Microsoft.XMLHTTP).
3. Başarısız olursanız (catch (failed)), request değişkeninin false (yanlış)
değerinde kaldığından emin olun.
3. Request değişkeninin hâlâ false (yanlış) değerinde olup olmadığına bakın (işler
yolundaysa, bu değerde kalmayacaktır).
4. Bir sorun varsa (ve request false değerindeyse), kullanıcılara bir sorun olduğunu
bildirmek için bir JavaScript uyarısı kullanın.
Kodunuzdaki bu değişiklikleri yaptıktan sonra Internet Explorer'da bir deneme daha yapın;
yarattığınız formu (hata iletisi olmadan) görmeniz gerekir. Benim denememde, sonuç Şekil
2'deki gibiydi.
Liste 1, 3 ve 4'e tekrar bakın ve bu kodun doğrudan script biçim imlerinin içine
yerleştirildiğine dikkat edin. JavaScript böyle kodlandığında ve bir yöntem ya da işlev
gövdesine yerleştirilmediğinde, buna statik JavaScript denir. Bu, kodun, sayfa kullanıcıya
görüntülenmeden önce çalışmaya başladığı anlamına gelir. (Belirtimden, kodun tam olarak ne
zaman çalıştığı ve tarayıcıların işlemleri ne zaman farklı gerçekleştirdikleri yüzde yüz net
değildir; ancak kodun, kullanıcıların sayfanızla etkileşime girmeden önce çalışması garanti
edilir.) Birçok Ajax programcısı genellikle XMLHttpRequest nesnesini böyle yaratır.
Bunu belirttikten sonra, bu kodu kesinlikle Liste 5'teki gibi bir yönteme yerleştirebilirsiniz.
var request;
function createRequest() {
try {
request = new XMLHttpRequest();
} catch (trymicrosoft) {
try {
request = new ActiveXObject("Msxml2.XMLHTTP");
if (!request)
alert("Error initializing XMLHttpRequest!");
}
</script>
var request;
function createRequest() {
try {
request = new XMLHttpRequest();
} catch (trymicrosoft) {
try {
request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (othermicrosoft) {
try {
request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
request = false;
}
}
}
if (!request)
alert("Error initializing XMLHttpRequest!");
}
function getCustomerInfo() {
createRequest();
// Do something with the request variable
}
</script>
Statik JavaScript kullandığınızda, kullanıcı sayfanıza gelir gelmez bir hata iletisi alır. Bu da
can sıkı değil mi? Belki; Web uygulamanızın tarayıcılarında çalışmaması kullanıcıları
kızdırabilir. Ancak, aynı hatayı bilgi girmek için harcadıkları 10 dakikanın sonunda
vermekten kesinlikle çok daha iyidir. Yalnızca bu nedenden, size kodunuzu statik olarak
hazırlamanızı ve kullanıcılara olası sorunlarla ilgili erkenden bilgi vermenizi öneririm.
Ajax, kum havuzu olarak bilinen bir güvenlik modeli kullanır. Sonuç olarak, Ajax kodunuz
(ve özellikle XMLHttpRequest nesnesi) yalnızca çalıştığı etki alanına istekte bulunabilir.
Yakında yayınlanacak bir makalede güvenlik ve Ajax ile ilgili çok daha fazla şey
öğreneceksiniz, ama şimdilik bilmeniz gereken yerel makinenizde çalışan kodun, yalnızca
yerel makinenizdeki sunucu tarafı komut dosyalarına istekte bulunabileceğidir. Ajax kodunuz
www.breakneckpizza.com üzerinde çalışıyorsa, bunun www.breakneckpizza.com üzerinde
çalışan komut dosyalarına istek göndermesi gerekir.
İlk olarak belirlemeniz gereken bağlanılacak sunucunun URL'sidir. Bu Ajax'a özel bir şey
değildir (açıkçası şimdiye kadar URL oluşturmayı öğrenmiş olmanız gerekir) ancak yine de
bağlantı kurmak için bu gereklidir. Çoğu uygulamada, bu URL'yi kullanıcılarınızın üzerinde
çalıştıkları formdan alınan verilerle bazı statik veri takımlarının birleşiminden
oluşturacaksınız. Örneğin, Liste 7'de telefon numarası alanındaki değeri alan ve bu verileri
kullanarak URL oluşturan bir JavaScript kodu gösterilmektedir.
if (!request)
alert("Error initializing XMLHttpRequest!");
function getCustomerInfo() {
var phone = document.getElementById("phone").value;
var url = "/cgi-local/lookupCustomer.php?phone=" + escape(phone);
}
</script>
Buradaki hiçbir şey kafanızı karıştırmamalıdır. Öncelikle, kod phone (telefon) adlı yeni bir
değişken yaratır ve bu değişkene, tanıtıcısı "phone" (telefon) olan form alanının değerini atar.
Liste 8'de, bu forma ilişkin phone (telefon) alanını ve id (tanıtıcı) özniteliğini görebileceğiniz
XHTML gösterilmektedir.
escape() yöntemini daha önce hiç görmediyseniz, doğru biçimde düz metin olarak
gönderilemeyecek karakterlerden kaçınmak için kullanılır. Örneğin, telefon numarasındaki
boşluklar %20 karakterlerine dönüştürülür ve karakterlerin URL içinde aktarılmasını sağlar.
İsteği açma
Genellikle, bu parametrelerin ilk üçü kullanılır. Aslında, zamanuyumsuz bir istekte bulunmak
istediğinizde bile üçüncü parametre için "true" (doğru) değerini belirlemeniz gerekir. Bu
varsayılan ayardır, ancak isteğin zamanuyumsuz olup olmadığını belirtmek her zaman için
kendi belgelendirmelerinizde yararlı olabilir.
Hepsini bir araya topladığınızda genellikle Liste 9 gibi görünen bir satır ortaya çıkar.
Web uygulamalarının aksak ya da yavaş olduğunu düşünmenizin asıl nedeni budur -- gerçek
etkileşim eksikliği. Bir düğmeye bastığınızda, gönderilen isteğe yanıt gelinceye kadar
uygulamanız kullanılamaz duruma gelir. Yoğun sunucu işlemi gerektiren bir istekte
bulunduysanız, bekleme süresi uzun olabilir (en azında günümüzün çok işlemcili, beklemesiz,
DSL dünyasında).
Bununla birlikte, zamanuyumsuz bir istek sunucunun yanıt vermesini beklemez. Bir istek
gönderirsiniz ve uygulamanız işleme devam eder. Kullanıcılar Web formuna bilgi girmeye,
diğer düğmeleri tıklatmaya devam edebilir, hatta formdan çıkabilirler. Dönen plaj topları,
kum saatleri ya da uzun süreli donan uygulamalar olmaz. Sunucu sessizce isteğe yanıt verir ve
işlem tamamlandığında, ilk istekte bulunanın, (biraz sonra göreceğiniz yöntemlerle) işlemin
tamamlandığını bilmesini sağlar. Sonuçta aksak ya da yavaş olmayan, bunun yerine yanıt
veren, etkileşimli ve daha hızlı bir uygulama ortaya çıkar. Bu Web 2.0'ın yalnızca bir
bileşenidir, ancak çok önemlidir. Tüm parlak GUI bileşenleri ve Web tasarımı paradigmaları
yavaş, zamanuyumlu istek/yanıt modelinin üstesinden gelemez.
İsteği gönderme
send() yalnızca tek bir parametre alır: gönderilecek içerik. Bunun üzerinde uzun uzun
düşünmeden önce, verileri URL'nin kendisinden göndermekte olduğunuzu anımsayın:
Öncelikle, bu kodda yarattığınız süreci anladığınızdan emin olun (gerekiyorsa, Liste 10'u
gözden geçirin). Bir istek oluşturuldu ve gönderildi. Buna ek olarak, bu bir zamanuyumsuz
istek olduğundan JavaScript yöntemi (bu örnekte getCustomerInfo()) sunucunun yanıtını
beklemeyecektir. Kod devam edecek; bu durumda, yöntemden çıkılacak ve denetim forma
dönecek. Kullanıcılar bilgi girmeye devam edebilecekler ve uygulama sunucuyu
beklemeyecektir.
Ancak bu, ilginç bir soruyu da beraberinde getiriyor: Sunucu isteği işlemeyi bitirdiğinde ne
olacak? Yanıt, en azından kodun şu haliyle, hiçbir şey! Elbette bu iyi bir şey değil. Bu
nedenle, XMLHttpRequest tarafından gönderilen isteği işlemesi tamamlandığında sunucunun
ne yapması gerektiğini belirten bir tür yönergeye sahip olması gerekir.
Burada devreye zamanuyumsuzluk girer: Kullanıcı formu bir düzeyde çalıştırırken, başka bir
düzeyde sunucu bir isteğe yanıt verir ve onreadystatechange özelliğinde belirtilen geri çağrı
yöntemini başlatır. Bu nedenle, bu yöntemi Liste 11'de gösterildiği şekilde, kodunuzda
belirtmeniz gerekir.
Bu özelliğin kodun neresinde ayarlandığına dikkat edin -- send() çağrılmadan önce ayarlanır.
Bu özelliği istek gönderilmeden önce ayarlamanız gerekir; böylece, sunucu isteğe yanıt
vermeyi tamamladığında özelliği arayabilir. Geriye, bu makalenin son bölümünde
odaklanacağımız updatePage() yönteminin kodlanması kalıyor.
İsteğinizi gönderdiniz, kullanıcınız Web formunda mutlulukla çalışıyor (bu arada sunucu da
isteği işliyor) ve sunucu, isteği işlemeyi tamamlıyor. Sunucu onreadystatechange özelliğine
bakar ve çağrılacak yöntemi belirler. Bu gerçekleştikten sonra, zamanuyumsuz olsun ya da
olmasın uygulamanızı diğer uygulamalar gibi düşünebilirsiniz. Diğer bir deyişle, sunucuya
yanıt veren özel işlem yazma yöntemlerini uygulamanız gerekmez; yalnızca formu değiştirin,
kullanıcıyı başka bir URL'ye alın ya da sunucuya yanıt vermek için ne yapmanız gerekiyorsa
onu yapın. Bu bölümde, sunucuya yanıt verilmesi ve tipik bir işlemin yapılması -- kullanıcının
gördüğü formun değiştirilmesi -- üzerinde duracağız.
if (!request)
alert("Error initializing XMLHttpRequest!");
function getCustomerInfo() {
var phone = document.getElementById("phone").value;
var url = "/cgi-local/lookupCustomer.php?phone=" + escape(phone);
request.open("GET", url, true);
request.onreadystatechange = updatePage;
request.send(null);
}
function updatePage() {
alert("Server is done!");
}
</script>
Bu, sunucu işlemi tamamladığında, bunu size bildiren bir uyarı gönderir. Bu kodu kendi
sayfanızda deneyin, sayfayı kaydedin ve bir tarayıcıda açın (bu örnekte XHTML kullanmak
isterseniz, Liste 8'e bakın). Bir telefon numarası girip alandan çıktığınızda, uyarı iletisini
görmeniz gerekir (bkz. Şekil 3); ancak OK (Tamam) düğmesini tıklattığınızda uyarı defalarca
yeniden görüntülenir.
Tarayıcınıza bağlı olarak, form uyarı görüntülemeyi durduruncaya kadar iki, üç, hatta dört
uyarı alırsınız. Peki neler oluyor? Anlaşılan istek/yanıt döngüsünün önemli bir bileşeni olan
HTTP hazır olma durumunu dikkate almadınız.
HTTP hazır olma durumu, bir isteğin durumunu ya da durumlarını belirtir. İsteğin başlatılıp
başlatılmadığını, yanıtlanıp yanıtlanmadığını ya da istek/yanıt modelinin tamamlanıp
tamamlanmadığını anlatmak için kullanılır. Sunucunun sağladığı yanıt metninin ya da
verilerin okuma için güvenli olup olmadığını belirlemenize de yardımcı olur. Ajax
uygulamalarınızda beş hazır olma durumundan söz edebiliriz:
Liste 13'teki kodun başarılı görünmesine rağmen, hâlâ bir sorunumuz var -- sunucu isteğinize
yanıt verip işlemi bitirir, ancak bir hata raporu verirse ne olacak? Unutmayın, Ajax, JSP,
kurallara uygun bir HTML formu ya da başka bir kod tipi tarafından çağrılıyorsa, bununla
sunucu tarafındaki kod ilgilenmelidir; sunucu tarafı kodunuz bilgileri raporlamak için
yalnızca geleneksel Web'e özel yöntemlere sahiptir. Web dünyasında, HTTP kodları bir
istekte ortaya çıkabilecek çeşitli sorunlarla ilgilenebilir.
Örneğin, bir URL için istek girdiniz, URL'yi yanlış yazdınız ve böyle bir sayfanın olmadığını
belirten bir 404 hata kodu aldınız. Bu, HTTP isteklerinin durum olarak alabileceği birçok
durum kodlarından yalnızca biridir (durum kodlarının tam listesine giden bir bağlantı için
Kaynaklar'a bakın). Güvenli ya da yasak verilere erişildiğini belirten 403 ve 401 hata kodları
da oldukça yaygındır. Bu durumların her birinde, bu kodlar tamamlanmış bir yanıtın
sonucudur. Diğer bir deyişle, sunucu isteği tamamlamıştır (HTTP hazır olma durumu 4'tür),
ancak istemcinin beklediği verileri döndürmüyor olabilir.
Daha sonra, hazır olma durumuna ek olarak HTTP durumunu da denetlemeniz gerekir. Her
şeyin tamam olduğunu belirten 200 durum kodunu arıyorsunuz. Hazır olma durumu 4 ve
durum kodu 200 olduğunda, sunucu verilerini işleyebilirsiniz ve bu veriler, tam olarak
istedikleriniz olmalıdır (bunlar bir hata ya da diğer sorun bildiren bilgi parçaları olmamalıdır).
Geri çağrı yönteminize Liste 14'te gösterilen başka bir durum denetimi ekleyin.
Daha sağlam bir hata işleme özelliği eklemek için -- kodları çok karmaşıklaştırmadan -- diğer
durum kodları için bir ya da iki denetim ekleyebilirsiniz; Liste 15'teki değiştirilmiş
updatePage() örneğine bakın.
Şimdi getCustomerInfo() yöntemindeki URL'yi değiştirin ve var olmayan bir URL yazıp ne
olduğuna bakın. İstediğiniz URL'nin var olmadığını belirten bir uyarı görmelisiniz --
mükemmel! Bu, belki bütün hata koşullarını kapsamaz, ancak tipik bir Web uygulamasında
ortaya çıkabilecek sorunların yaklaşık %80'ini kapsayan basit bir değişikliktir.
İsteğinizin tam olarak işlendiğinden (hazır olma durumu yoluyla) ve sunucunun olağan,
olumlu bir yanıt verdiğinden (durum kodu yoluyla) emin olduğunuza göre, artık sunucudan
geri gönderilen verilerle uğraşabilirsiniz. Bu, uygun bir şekilde XMLHttpRequest nesnesinin
responseText özelliğinde saklanır.
Bu makalede kullanılan örnekte, sunucu müşterinin son siparişini ve adresini, dikey çubukla
birbirinden ayrılmış bir şekilde döndürür. Sipariş ve adres, form üzerindeki öğelerin
değerlerini ayarlamak için kullanılır; Liste 16'da görüntüyü güncelleyen kod gösterilmektedir.
Toparlamadan önce, XMLHttpRequest nesnesinin responseXML adı verilen başka bir önemli
özelliğinden söz etmek istiyorum. Bu özellik, sunucunun XML ile yanıt vermesi durumunda
bir XML yanıtını içerir (tahmin edebilir miydiniz?). Bir XML yanıtıyla çalışma, düz metinle
çalışmaktan biraz daha farklıdır ve ayrıştırma, DOM (Document Object Model; Belge Nesne
Modeli) ve diğer bazı konuları da içerir. Sonraki bir makalede XML ile ilgili ayrıntılı bilgi
verilecektir. Yine de responseXML özelliği responseText çevresinde toplanan tartışmalarla
geldiği için burada sözü edilebilir. Birçok basit Ajax uygulamasında, tek ihtiyacınız olan
responseText özelliğidir, ancak yakında Ajax uygulamalarında XML ile çalışmayı da
öğreneceksiniz.
Sonuç
XMLHttpRequest nesnesinden biraz sıkılmış olabilirsiniz -- tek bir nesneyle ilgili bir
makalenin tamamını, özellikle de nesne bu kadar basitse, genellikle okumam. Ancak, bu
nesneyi yazdığınız ve Ajax kullanan her sayfada ve uygulamada defalarca kullanacaksınız.
Doğruyu söylemek gerekirse, hâlâ XMLHttpRequest nesnesiyle ilgili anlatılacak birkaç şey
var. Sonraki makalelerde, isteklerinizde GET ile birlikte POST kullanımını, sunucudan gelen
yanıtın yanı sıra isteğinizde içerik üstbilgileri belirleme ve okumayı da öğreneceksiniz;
isteklerinizi nasıl kodlamanız gerektiğini ve istek/yanıt modelinizde XML'lerin nasıl
işleneceğini anlayacaksınız.
Ayrıca, sık kullanılan Ajax araç takımlarından bazılarını da göreceksiniz. Bu araç takımları
aslında bu makalede anlatılan ayrıntıların çoğunu aydınlatır ve Ajax programlamasını
Bu nedenle, bu ayrıntıları atlamayın ya da hızlı geçmeyin; böylece elinizin altındaki hazır araç
takımında bir hata oluştuğunda, kafanızı kaşıyıp destek için e-posta göndermenize gerek
kalmaz. XMLHttpRequest nesnesinin doğrudan nasıl kullanılacağını anladığınızda, en garip
sorunlarda hata ayıklamak, hatta sorunu düzeltmek sizin için çok kolay olacaktır. Araç
takımları, tüm sorunlarınızla onların ilgilenmelerine güvenmediğiniz sürece yararlıdır.
Öyleyse, XMLHttpRequest nesnesini iyice tanıyın. Aslında, bir araç takımı kullanan çalışan
bir Ajax kodunuz varsa, bu kodu yalnızca XMLHttpRequest nesnesiyle, ve bunun özellikleri
ve yöntemleriyle yeniden yazmayı deneyin. Bu sizin için iyi bir alıştırma olacaktır ve neler
olup bittiğini çok daha iyi anlamanızı sağlayacaktır.
Sonraki makalede, bu nesneyle ilgili daha derin konulara gireceğiz, POST isteklerinin nasıl
kullanılacağını ve birkaç farklı biçimde veri göndermeyi öğrenmenin yanı sıra bu nesnenin
daha becerikli özelliklerini (responseXML gibi) keşfedeceğiz. Bu nedenle şimdi kodlamaya
başlayın ve bir ay kadar sonra buraya yeniden göz atın.
Kaynaklar
Bilgi Edinme
• "Use Ajax with WebSphere Portal" (Ajax'ın WebSphere Portal ile kullanılması)
(developerWorks, Haziran 2006), portal performansını artırmak, daha temiz bir portal
uygulaması mimarisi ve -- en önemlisi -- kullanıcılarınıza çok daha hızlı yanıt veren
bir portal yaratmak için.
• Java object serialization for Ajax (Ajax için Java nesnesi diziselleştirmesi)
(developerWorks, Ekim 2005), ağ üzerinden nesne gönderme ve Ajax ile etkileşimde
bulunma konularını Java bakış açısıyla inceler.
• Call SOAP Web services with Ajax (Ajax ile SOAP Web hizmetlerinin çağrılması)
(developerWorks, Ekim 2005), Ajax'ı var olan SOAP tabanlı Web hizmetleriyle
bütünleştirme üzerine yazılmış ileri düzey bir makaledir.
• Google GMail, Web'in çalışma şeklini değiştiren, Ajax tabanlı uygulamalara harika bir
örnektir.
• Ajax: A New Approach to Web Applications (Ajax: Web Uygulamalarına Yeni Bir
Yaklaşım), Ajax moniker teriminin ilk kez kullanıldığı ve tüm Ajax geliştiricilerinin
okuması gereken bir makaledir.
• Why Ajax Matters Now (Ajax Neden Bu Kadar Önemli), Ajax'ın (şimdi) neden bu
kadar önemli olduğunu anlamanıza yardımcı olacaktır.
• Bir yanıtın içerebileceği tüm HTTP durum kodlarını içeren bu listeye göz atın.
• Head Rush Ajax, Elisabeth Freeman, Eric Freeman ve Brett McLaughlin (Şubat 2006,
O'Reilly Media, Inc.), bu makaledeki düşünceleri alır ve Head First stilinde beyninize
yükler.
• Java and XML, İkinci Basım, Brett McLaughlin (Ağustos 2001, O'Reilly Media, Inc.),
yazarın XHTML ve XML dönüşümleriyle ilgili görüşlerini içerir.
• JavaScript: The Definitive Guide, David Flanagan (Kasım 2001, O'Reilly Media,
Inc.), JavaScript, dinamik Web sayfalarıyla çalışmayla ilgili kapsamlı yönergeler içerir
ve sonraki basımda Ajax ile ilgili iki yeni bölüm bulunur.
• Head First HTML with CSS & XHTML, Elizabeth ve Eric Freeman (Aralık 2005,
O'Reilly Media, Inc.), XHTML, CSS ve bu ikisinin nasıl birlikte kullanılacağını
öğrenmeyle ilgili eksiksiz bir kaynaktır.
Tartışma
Düzey: Başlangıç
14 Şubat 2006
Çoğu Web geliştiricisi için basit istekler oluşturmak ve basit yanıtlar almak yeterlidir, ancak
Ajax konusunda uzmanlaşmak isteyen geliştiriciler için HTTP durum kodlarının, hazır olma
durumlarının ve XMLHttpRequest nesnesinin tam olarak anlaşılması gerekir. Bu makalede
Brett McLaughlin, size farklı durum kodlarını gösterecek, tarayıcıların her bir durum kodunu
nasıl işlediğini anlatacak ve Ajax ile yapabileceğiniz, daha az kullanılan HTTP isteklerine
ilişkin örnekler verecek.
Bu makalede, son makalemde anlattığım temel konuların biraz ötesine geçip bu istek
nesnesinin üç anahtar parçasıyla ilgili daha ayrıntılı bilgi vereceğim:
Bunların her biri genellikle isteklerin altyapı parçaları olarak görülür; sonuç olarak, bu
konularla ilgili çok az ayrıntılı bilgi bulabilirsiniz. Ancak, Ajax programlamasıyla amatörce
bir uğraştan daha çok şey yapmak istiyorsanız, hazır olma durumları, durum kodları ve
istekler konusunda oldukça iyi olmanız gerekir. Uygulamanızda bir şeyler ters gittiğinde -- ki
her zaman bir şeyler ters gider -- hazır olma durumlarını anlamak, HEAD isteklerini nasıl
yapacağınızı ya da 400 durum kodunun anlamını bilmek, beş dakikalık bir hata ayıklama
işlemiyle beş saatlik boşa uğraş ve kargaşa arasındaki farkı oluşturabilir.
XMLHttpRequest ya da XMLHttp:
Farklı adlı bir gül
Hazır olma durumlarının en yaygın (ve en basit) kullanımı kesinlikle budur. "4" rakamından
da tahmin edebileceğiniz gibi birkaç tane hazır olma durumu söz konusudur (bu listeyi son
makalede de görebilirsiniz -- bkz. Kaynaklar):
Yine de eksiksiz bilgi verebilmek açısından, Liste 2'de hazır olma durumunun nasıl 0 değerine
ayarlanacağı gösterilmektedir.
Bu basit örnekte, Web sayfanız bir isteği başlatmak için getSalesData() işlevini çağırır
(örneğin bir düğme tıklatıldığında). Hazır olma durumunu open() çağrılmadan önce
denetlemeniz gerektiğini unutmayın. Şekil 1'de bu uygulamanın çalışma sonucu
gösterilmektedir.
Açıkçası, bunun size fazla bir yararı olmaz; çoğu zaman open() işlevinin çağrılmadığından
emin olmak isteyeceğiniz durumlar ender görülür. Neredeyse gerçek dünyaya benzeyen Ajax
programlamasında bu hazır olma durumu, yalnızca birden çok işlevde aynı XMLHttpRequest
nesnesini kullanarak birden çok istekte bulunulursa kullanılır. Bu durumda (çok nadiren de
olsa), yeni isteklerde bulunmadan önce bir istek nesnesinin başlatılmamış durumda
(readyState == 0) olduğundan emin olmak isteyebilirsiniz. Bu esas olarak, başka bir işlevin
nesneyi aynı anda kullanmamasını sağlar.
0 hazır olma durumunun dışında, istek nesnenizin tipik bir istek ve yanıt sürecinde diğer hazır
olma durumlarının her birinden geçmesi ve son olarak 4 numaralı hazır olma durumunda
işlemi bitirmesi gerekir. İşte bu noktada, çoğu geri çağrı işlevinde gördüğünüz if
(request.readyState == 4) satırı devreye girer; sunucunun işlemi tamamladığından ve
Web sayfasını güncellemenin ya da sunucudan alınan verilere dayalı bir işlem yapmanın
güvenli olduğundan emin olmanızı sağlar.
Gerçekleşirken bu işlemi gerçekten görmek önemsiz bir görevdir. Hazır olma durumu 4
değerindeyse, geri çağrınızda yalnızca kodu çalıştırmak yerine, geri çağrınızın her çağrılışında
hazır olma durumunu çıkarın. Bunu yapan koda ilişkin bir örnek görmek için Liste 3'e bakın.
Bunu nasıl çalıştıracağınızdan tam olarak emin değilseniz, Web sayfanızdan çağrılacak bir
işlev yaratmanız ve bunun, sunucu tarafındaki bileşene bir istek göndermesini sağlamanız
gerekir (böyle bir işlev Liste 2'de ve bu dizinin birinci ve ikinci makalesindeki örneklerde
gösterilmiştir). İsteğinizi oluştururken, geri çağrı işlevini updatePage() işlevine
ayarlamadığınızdan emin olun; bunu yapmak için istek nesnenizin onreadystatechange
özelliğini updatePage() işlevine ayarlayın.
Bu kod, onreadystatechange özelliğinin tam olarak ne anlama geldiğini gösteren güzel bir
örnektir -- isteğin hazır olma durumunun her değişmesinde, updatePage() çağrılır ve bir
uyarı görüntülenir. Şekil 2'de, 1 hazır olma durumunda çağrılan bu işlevin bir örneği
gösterilmektedir.
Bu kodu kendiniz deneyin. Kodu Web sayfanıza koyun ve olay işleyicinizi etkinleştirin (bir
düğmeyi tıklatın, bir alandan çıkın ya da bir isteği tetiklemek üzere hazırladığınız herhangi bir
yöntemi kullanın). İsteğinizin hazır olma durumu her değiştiğinde, çağrı işleviniz birkaç kez
çalışır ve her bir hazır olma durumu için bir uyarı görüntülenir. Bir isteğin aşamalarını
izlemek için en iyi yöntem budur.
Tarayıcı tutarsızlıkları
Bu işlemin temel mantığını kavradıktan sonra, Web sayfanıza farklı tarayıcılardan erişmeyi
deneyin. Bu hazır olma durumlarının işlenmesiyle ilgili bazı tutarsızlıkları fark etmeniz
gerekir. Örneğin, Firefox 1.5'te aşağıdaki hazır olma durumlarını görürsünüz:
• 1
• 2
• 3
• 4
Burada her bir istek aşaması gösterildiği için bu sizi şaşırtmamalıdır. Ancak, aynı uygulamaya
Safari üzerinden erişirseniz, ilginç bir şeyle karşılaşırsınız -- daha doğrusu karşılaşmazsınız.
Safari 2.0.1'de göreceğiniz durumlar şunlardır:
• 2
• 3
• 4
Safari, birinci hazır olma durumunu dışarıda bırakır ve bunun anlamlı bir açıklaması yoktur;
Safari'nin çalışma yöntemi böyledir. Bu önemli bir noktayı da gösterir: Sunucudan alınan
verileri kullanmadan önce isteğin 4 numaralı hazır olma durumunda olup olmadığından emin
olmak iyi bir fikir olsa da, her bir geçici hazır olma durumuna dayalı kod yazma farklı
tarayıcılarda farklı sonuçlar almanızı sağlar.
• 3
• 4
• 1
• 2
• 3
• 4
Bir istekle ilgili sorun yaşıyorsanız, sorunları aramanız gereken ilk yer burası olmalıdır.
Kodun düzgün çalıştığından emin olabilmeniz için isteğin hazır olma durumunu size
gösterecek bir uyarı ekleyin. Kodunuzu Internet Explorer ve Firefox üzerinde deneyin -- dört
hazır olma durumunu da alabilecek ve isteğin her bir aşamasını denetleyebileceksiniz.
Bir istek sırasında ortaya çıkan çeşitli hazır olma durumlarını anladıktan sonra,
XMLHttpRequest nesnesinin başka bir önemli parçasına bakmak için hazırsınız; bu,
responseText özelliğidir. Son makaleden de hatırlayacağınız gibi bu, sunucudan verileri
almak için kullanılan özelliktir. Sunucu bir isteği işlemeyi tamamladığında, isteğe yanıt
vermek için gereken verileri isteğin responseText kısmına yerleştirir. Daha sonra, Liste 1 ve
Liste 4'te görülebileceği gibi geri çağrı işleviniz bu verileri kullanabilir.
Hazır olma durumu gibi, responseText özelliğinin değeri isteğin yaşam döngüsü içinde
değişir. Bunu gerçekleşirken görmek için isteğin hazır olma durumunun yanı sıra yanıt
metnini de sınayan Liste 5'te gösterilene benzer bir kod kullanın.
Tüm belgeler ve belirtimler, yalnızca 4 numaralı hazır olma durumunda verilerin kullanım
açısından güvenli olduğu konusunda ısrarlıdır. İnanın bana, responseText özelliği 3
numaralı hazır olma durumundayken verilerin alınamayacağı durumlar çok azdır. Ancak,
uygulamanızda buna güvenmek kötü bir fikirdir -- 3 numaralı hazır olma durumundaki
tamamlanmış verilere dayalı bir kod yazdığınızda, verilerin tamamlanmamış olması neredeyse
kesindir.
3 numaralı hazır olma durumunda kullanıcıya, bir yanıtın gelmek üzere olduğu belirten bir
geri bildirim sağlamak daha iyi bir fikirdir. alert() gibi bir işlev kullanmak kötü bir fikirdir -
- Ajax kullanmak ve daha sonra, kullanıcıyı bir uyarı iletişim kutusuyla engellemek çok da
mantıklı değildir -- bunun yerine formunuzdaki ya da sayfanızdaki bir alanı hazır olma
durumu değiştikçe güncelleyebilirsiniz. Örneğin, 1 numaralı hazır olma durumu için bir
aşama göstergesinin %25'lik, 2 numaralı hazır olma durumu için %50'lik, 3 numaralı hazır
olma durumu için %75'lik ve 4 numaralı hazır olma durumu için %100'lük (tamamlanmış)
kısmına ilerleyen bir görünüm hazırlamayı deneyin.
Gördüğünüz gibi bu yaklaşım akıllıca, ancak tarayıcıya bağlı olacaktır. Örneğin Opera'da ilk
iki hazır olma durumunu hiç almazsınız ya da Safari'de birinci durum (1) atlanır. Bu nedenle,
bu makaleye dahil etmek yerine kodu bu haliyle burada, bir alıştırma olarak bırakacağım.
• 401: Yetkisiz
• 403: Yasak
• 404: Bulunamadı
Ek kodları da bulabilirsiniz (tam liste için bkz. Kaynaklar). Ajax uygulamalarınıza başka bir
denetim ve yanıt verebilirlik düzeyi (ve özellikle daha güçlü hata işleme özelliği) eklemek
için bir istekteki ve yanıttaki durum kodlarını doğru biçimde denetlemeniz gerekir.
Birçok Ajax uygulamasında, Liste 6'daki gibi hazır olma durumunu denetleyen ve daha sonra,
sunucu yanıtındaki verilerle çalışmaya devam eden bir geri çağrı işlevi görürsünüz.
Bu, Ajax programlaması için dar görüşlü ve hataya eğilimli bir yaklaşımdır. Bir komut
dosyası, kimlik doğrulaması gerektirirse ve isteğiniz geçerli kimlik bilgilerini sağlayamazsa,
sunucu 403 ya da 401 gibi bir hata kodu döndürür. Ancak, sunucu isteğe yanıt verdiği için
hazır olma durumu 4 değerine gelir (istediğiniz ya da istek için beklediğiniz yanıtı
alamayabilirsiniz). Sonuç olarak, kullanıcı geçerli verileri alamaz ve JavaScript var olmayan
sunucu verilerini kullanmayı denediğinde kötü bir hata bile alabilir.
Sunucunun istekle ilgili işlemi bitirdiğinden ve "Her şey yolunda" durum kodunu
gönderdiğinden emin olmak için çok az bir çaba göstermeniz yeterli olacaktır. Bu kod
"200"'dür ve XMLHttpRequest nesnesinin status özelliğiyle birlikte raporlanır. Sunucunun
yalnızca istekle işini bitirdiğinden değil, aynı zamanda olumlu bir durum da bildirdiğinden
emin olmak için geri çağrı işlevinize Liste 7'de gösterilen denetimi ekleyin.
Birkaç satırlık kod eklemesiyle, bir şeyler yanlış giderse, kullanıcıların, herhangi bir
açıklaması olmayan karışık verilerin bulunduğu bir sayfa yerine (şüpheli de olsa) yararlı bir
hata iletisi alacaklarından emin olabilirsiniz.
• Birincisi, Ajax uygulamaları neredeyse her zaman özel bir sunucu tarafı komut
dosyası, sunucu uygulaması ya da uygulama için yazılır. Bu bileşenin Ajax
programcısının haberi olmadan ortadan kaybolması ve başka bir yere taşınması çok
ender görülen bir olaydır. Genellikle bir kaynağın taşındığını (kendiniz taşıdığınız ya
da taşıttığınız için) bildiğinizden, isteğinizdeki URL'yi değiştirir ve hiçbir zaman bu
tür bir sonuçla karşılaşmazsınız.
• Konu ile daha ilgili bir neden de Ajax uygulamalarının ve isteklerin kum havuzu
yöntemini kullanmasıdır. Bu, Ajax isteklerinin gönderildiği Web sayfasına hizmet
veren etki alanının, bu isteklere yanıt vermesi gereken etki alanı olduğu anlamına
gelir. Bu nedenle, ebay.com etki alanından hizmet alan bir Web sayfası, amazon.com
üzerinde çalışan bir komut dosyasına Ajax stili bir istekte bulunamaz; ibm.com
üzerindeki Ajax uygulamaları netbeans.org üzerinde çalışan sunucu uygulamalarına
isteklerde bulunamaz.
Sonuç olarak, istekleriniz, bir güvenlik hatası oluşturulmadan başka bir sunucuya yeniden
yöneltilemez. Böyle durumlarda, hiçbir durum kodu alamazsınız. Genellikle hata ayıklama
konsolunda bir JavaScript hatası bulunur. Birçok durum kodu üzerinde düşünürken, yeniden
yöneltme kodlarının tamamını göz ardı edebilirsiniz.
Hatalar
200 durum koduyla ilgilendikten ve 300 durum kodu ailesini büyük oranda dikkate
almayabileceğinizi fark ettikten sonra, endişelenmeniz gereken diğer tek kod grubu 400
ailesidir. Bunlar, çeşitli hata tiplerini belirtir. Liste 7'ye bakın ve hatalar işlenirken, kullanıcıya
yalnızca çok soysal bir hata iletisinin bildirildiğine dikkat edin. Bu, doğru yönde bir adım olsa
da kullanıcıya ya da uygulama üzerinde çalışan bir programcıya aslında neyin yanlış gittiğini
açıklama açısından biraz yararsız bir iletidir.
Öncelikle, eksik sayfalar için destek ekleyin. Bu durumla, üretim sistemlerinde gerçekten de
sık karşılaşılmaz, ancak sınama amacıyla komut dosyasının taşınması ya da bir programcının
yanlış bir URL girmesi yaygın bir uygulamadır. 404 hatalarını güzel bir şekilde
raporlayabilirseniz, kafası karışan kullanıcılara ve programcılara yardım etmek için çok daha
fazlasını sağlayabilirsiniz. Örneğin, sunucu üzerindeki bir komut dosyası kaldırıldıysa ve
Liste 7'deki kodu kullanırsanız, Şekil 5'tekine benzer tanımsız bir hata görürsünüz.
Kullanıcı, sorunun kimlik doğrulamasından mı, eksik bir komut dosyasından mı (buradaki
neden budur), kullanıcı hatasından mı, yoksa kod içindeki bir hatadan mı kaynaklandığını
anlayamaz. Bazı basit kod eklemeleri, bu hatanın çok daha kesin olmasını sağlayabilir. Kimlik
doğrulama hatalarının yanı sıra eksik komut dosyalarını kesin bir iletiyle işleyen Liste 8'e
bakın.
Bu kod hâlâ çok basittir, ancak bazı ek bilgiler de sağlar. Şekil 6'da,Şekil 5'teki hatanın aynısı
gösterilmektedir, ancak bu defa, hata işleme kodu kullanıcıya ya da programcıya ne olduğu
hakkında daha iyi bir resim sunar.
Kendi uygulamalarınızda, kimlik doğrulama nedeniyle bir hata oluştuğunda, kullanıcı adını ve
parolayı temizleyip ekrana bir hata iletisi eklemeyi düşünebilirsiniz. Eksik komut dosyalarını
ya da diğer 400 tipi hatalarını (izin verilmeyen bir HEAD isteği göndermek gibi kabul
edilemez bir istek yönetimi için 405 ya da yedek sunucu kimlik doğrulamasının gerektiği bir
407 kodu gibi) daha güzel işlemek için benzer yaklaşımlar uygulanabilir. Yaptığınız seçim ne
olursa olsun, sunucudan dönen durum kodunun işlenmesiyle başlar.
Ek istek tipleri
İstekte bulunma
Aslında bir HEAD isteğinde bulunma oldukça önemsiz bir şeydir; Liste 9'daki gibi basit bir
şekilde, open() yöntemini birinci parametredeki "GET" ya da "POST" yerine "HEAD" ile
çağırırsınız.
Buna benzer bir HEAD isteğinde bulunduğunuzda, sunucu GET ya da POST isteğine
gönderdiği gibi gerçek bir yanıt göndermez. Bunun yerine, yalnızca yanıtın içeriğinin son
değiştirildiği zamanı, istenen kaynağın var olup olmadığını ve diğer ilginç birkaç bilgi biti
içeren üstbilgiler gönderir. Sunucu işleme başlamadan ve kaynağı göndermeden önce, bir
kaynakla ilgili bilgi almak için bunların bir kısmını kullanabilirsiniz.
Bunun gibi bir istekle yapabileceğiniz en kolay şey, yanıt üstbilgilerinin tümünü açıklamaktır.
Bu, HEAD istekleriyle ne alabileceğinizi gösterir. Liste 10'da, bir HEAD isteğinden gelen
yanıt üstbilgilerinin tümünü göstermek için basit bir geri çağrı işlevi sağlanmıştır.
Sunucuya HEAD isteği gönderen basit bir Ajax uygulamasından alınan yanıt üstbilgilerini
gösteren Şekil 7'ye bakın.
Bu üstbilgilerin herhangi bir kısmını (sunucu tipinden içerik tipine kadar), Ajax
uygulamasıyla fazladan bilgi ya da işlevsellik sağlamak için ayrı olarak kullanabilirsiniz.
URL'nin denetlenmesi
Bir URL var olmadığında 404 hatasının nasıl denetleneceğini önceden görmüştünüz. Bu genel
bir soruna dönüşürse -- bir komut dosyası ya da sunucu uygulaması sık sık çevrimdışı duruma
geliyor olabilir -- tam bir GET ya da POST isteği göndermeden önce URL'yi denetlemek
isteyebilirsiniz. Bunu yapmak için bir HEAD isteği oluşturun ve geri çağrı işlevinizde 404
hatası olup olmadığını denetleyin; Liste 11'de örnek bir geri çağrı gösterilmiştir.
Dürüst olmak gerekirse, bunun pek bir değeri yoktur. Sunucunun isteğe yanıt vermesi ve
içerik uzunluğunda yanıt üstbilgisini dolduracak bir yanıt bulması gerekir; bu nedenle,
İçerik uzunluğunu, hatta içerik tipini denetlemek için HEAD isteklerini yararlı bulabilirsiniz.
Bu, bir isteği işlemek için büyük miktarlarda verinin mi gönderileceğini, yoksa HTML, metin
ya da XML yerine sunucunun ikili verileri (ilk üçü JavaScript'te ikili verilerden çok daha
kolay işlenir) göndermeye mi çalışacağını belirleyebilmenizi sağlar.
Birçok uygulamada HEAD isteklerinin eklenmesi herhangi bir işlevsellik katmaz, hatta isteği
yavaşlatabilir (HEAD isteği yanıtla ilgili verileri, ardından gelen GET ya da POST isteği de
gerçek yanıtı almak istediği için). Ancak, bir komut dosyası ya da sunucu tarafındaki bir
bileşenden emin olmamanız durumunda, bir HEAD isteği, yanıt verileriyle uğraşmadan ya da
yanıtı göndermek için bant genişliğini kullanmanıza gerek kalmadan bazı temel verileri
alabilmenizi sağlar.
Sonuç
Birçok Ajax ve Web programcısı için bu makalede anlatılan bilgiler ileri düzey görünebilir.
HEAD isteği oluşturmanın yararı nedir? Hangi durumda JavaScript'inizde açık olarak yeniden
yöneltme durum kodunu işlemeniz gerekir? Bunlar güzel sorular; basit uygulamalarda yanıt,
bu gelişmiş tekniklerin pek değerinin olmadığıdır.
Ancak, Web artık basit uygulamalara tolerans gösterilen bir yer değil; kullanıcılar daha ileri
düzeyli oldular, müşteriler daha güçlü uygulamalar ve gelişmiş hata raporlaması istiyorlar ve
bir uygulama, toplam sürenin %1'inde çalışmadığı için yöneticiler işlerinden çıkarılıyorlar.
O zaman, basit bir uygulamanın ötesine geçip XMLHttpRequest nesnesini daha iyi bir şekilde
anlamak sizin işiniz.
Karşıdan yükleme
Açıklama
Bu makaleye ilişkin örnek kod wa-ajaxintro3_ajax-xhr_adv.zip HTTP
Kaynaklar
Bilgi Edinme
• "Make asynchronous requests with JavaScript and Ajax: Use XMLHttpRequest for
Web requests" (developerWorks, Ocak 2006): Bu dizinin ikinci bölümünde, tarayıcılar
arasında XMLHttpRequest örneklerinin oluşturulması, isteklerin oluşturulması ve
gönderilmesi ve sunucuya yanıt verilmesini öğrenin.
• "Ajax for Java developers: Build dynamic Java applications" (developerWorks, Eylül
2005): Java bakış açısını kullanarak sunucu tarafından Ajax'a bakın vedinamik Web
uygulaması deneyimleri oluşturmak için çığır açan bir yaklaşımla tanışın.
• "Ajax for Java developers: Java object serialization for Ajax" (developerWorks, Ekim
2005): Java nesnesi diziselleştirmesine ilişkin beş yaklaşımı inceleyin veağ üzerinden
nesneleri nasıl göndereceğinizi ve Ajax ile nasıl etkileşime geçeceğinizi öğrenin.
• "Call SOAP Web services with Ajax, Part 1: Build the Web services client"
(developerWorks, Ekim 2005): Ajax'ın var olan SOAP tabanlı Web hizmetleriyle
bütünleştirilmesine ilişkin bu ileri düzey makalede, Ajax tasarım şablonunu kullanarak
Web tarayıcısı tabanlı SOAP Web hizmetleri istemcisini nasıl uygulayacağınızı görün.
• Flickr: Web tabanlı bir uygulamada masaüstü hissi vermek için oluşturulan, Ajax'ın
kullanıldığı bu harika örneğe bakın.
• "Ajax: A New Approach to Web Applications": Ajax moniker teriminin ilk kez
kullanıldığı bu makaleyi okuyun -- tüm Ajax geliştiricileri bu makaleyi okumalıdır.
• Head Rush Ajax, Elisabeth Freeman, Eric Freeman ve Brett McLaughlin (Şubat 2006,
O'Reilly Media, Inc.): Bu makaledeki fikirleri beyninize Head First yöntemiyle
yükleyin.
• Java and XML, İkinci Basım, Brett McLaughlin (Ağustos 2001, O'Reilly Media, Inc.):
Yazarın, XHTML ve XML dönüşümleriyle ilgili düşüncelerini okuyun.
• JavaScript: The Definitive Guide, David Flanagan (Kasım 2001, O'Reilly Media,
Inc.): JavaScript ve dinamik Web sayfalarıyla çalışmaya ilişkin kapsamlı yönergeleri
inceleyin. Yayınlanacak olan yeni basımda Ajax ile ilgili iki yeni bölüm vardır.
• Head First HTML with CSS & XHTML, Elizabeth ve Eric Freeman (Aralık 2005,
O'Reilly Media, Inc.): XHTML, CSS ve bu ikisini birlikte kullanmayı öğrenmeyle
ilgili bu eksiksiz kaynağı dikkatle okuyun.
Düzey: Başlangıç
14 Mart 2006
Birçok Web programcısı gibi, siz de büyük olasılıkla HTML ile çalışmışsınızdır. Programcılar
Web sayfaları üzerinde çalışmaya HTML ile başlar; HTML genellikle, bir uygulamayı ya da
siteyi tamamlamak ve yerleştirme, renk ya da stil üzerindeki son düzenlemeiçin yapılan son
şeydir. HTML kullanımı kadar yaygın bir yanlış anlama da HTML'in ekranda görüntülenmek
üzere tarayıcıya gittikten sonra gerçekte olanlarla ilgilidir. Olanlarla ilgili varsayımlarınızı --
ve bunların neden yanlış olabileceklerini -- derinlemesine incelemeden önce, Web
sayfalarının tasarlanması ve sunulmasıyla ilgili işlemler konusunda her şeyin netleşmesini
istiyorum:
Bu, çok basit görünse de, işler hızla ilginç bir hal alır. Aslında, adım 4 ve 5 arasında
gerçekleşen çok sayıda "ıvır zıvır", bu makalenin odak noktasıdır. Programcıların çoğu, bir
kullanıcının tarayıcısı sayfayı görüntülemek istediğinde biçimlemelerine ne olduğunu aslında
tam olarak hiçbir zaman dikkate almadıkları için buradaki "ıvır zıvır" deyişi gerçekten de bu
durum için geçerlidir:
Bütün bu sorulara verilecek yanıt Belge Nesne Modeli'dir. O zaman, lafı daha fazlauzatmadan
DOM'ye giriş yapalım.
Programcıların çoğu için işleri, Web tarayıcısının başladığı yerde biter. Diğer bir deyişle, bir
HTML dosyasını Web sunucunuzdaki bir dizine gönderdiğinizde, bunu "tamamlanmış" olarak
kabul eder ve (iyi bir olasılıkla) bir daha hiç bu dosyayı düşünmezsiniz! Temiz, iyi
düzenlenmiş sayfalar söz konusu olduğunda da bu harika bir hedeftir; biçimlemenizin, farklı
tarayıcılarda, çeşitli CSS ve JavaScript sürümleriyle olması gerektiği gibi görüntülenmesini
istemenizde yanlış hiçbir şey yoktur.
Programcının yaptıkları
Sıradan bir Web programcısı olarak, büyük olasılıkla metin düzenleyicinizi ve IDE'nizi
açarsınız ve HTML, CSS ya da JavaScript kodlarını girmeye başlarsınız. Biçim imleri,
seçiciler ve öznitelikleri, yalnızca bir sitenin düzgün görünmesi için gerçekleştirmeniz
gereken basit görevler olarak düşünmek kolaydır. Ancak bu noktanın biraz daha ötesine
geçmek kendinizi zorlamanız gerekir -- bunun yerine, içeriğinizi düzenlediğinizin farkına
varmalısınız. Endişelenmeyin; bu yazının biçimlemenin güzelliğiyle, Web sayfanızın gerçek
potansiyelini nasıl kavramanız gerektiğiyle ya da metafizik diğer konularla ilgili bir derse
dönüşmeyeceğine söz veriyorum. Anlamanız gereken şey, Web geliştirmesi içindeki
rolünüzün tam olarak ne olduğudur.
Bir sayfanın nasıl göründüğü söz konusu olduğunda, en iyi durumda yalnızca önerilerde
bulunabilirsiniz. Bir CSS stil sayfası sunduğunuzda, kullanıcı stil seçimlerinizi geçersiz
kılabilir. Bir yazı tipi büyüklüğü sağladığınızda, bir kullanıcının tarayıcısı bu büyüklükleri
görme engelliler için değiştirebilir ya da bunları, büyük ekranlarda (ve aynı şekilde, büyük
çözünürlüklerde) görüntülemek üzere ölçeklendirebilir. Seçtiğiniz renkler ve yazı tiplerinin
kendileri bile, kullanıcıların ekranlarına ve sistemlerine kurdukları yazı tiplerine tabidir. Bir
sayfanın stili oluştururken elinizden gelenin en iyisini yaparken bile, bir Web sayfası
üzerindeki etkinizi en geniş haliyle kullanmazsınız.
Biçimlemenin yaptıkları
Biçimlemenizin aslında düzenlemeyle ilgili olduğunu fark ettiğinizde, buna farklı bir gözle
bakabilirsiniz. h1 kodunun metnin büyük, siyah ve koyu görünmesine neden olduğu yerine,
bu h1 kodunun başlık olduğunu düşünün. Kullanıcıların metni nasıl gördüğü -- ve sizin
CSS'nizi mi, kendilerininkini mi, yoksa ikisinin bir birleşimini mi kullandıkları -- ikincil
öneme sahiptir. Bunun yerine, biçimlemenin tamamen bu düzenleme düzeyini sağlamayla
ilgili her şeyi kapsadığını anlayın; bir p metnin paragraf olduğunu belirtir, img bir resmi
gösterir, div ise bir sayfayı bölümlere ayırır vb.
Biçimlemenizin yalnızca sayfanıza ilişkin bir düzen ya da çerçeve sağladığını göz önünde
bulundurduğunuz süre, oyunda bir adım öndesiniz demektir. Birazdan, tarayıcının tüm bu
metin düzenini nasıl aldığını ve nasıl daha ilginç bir şeye -- değiştirilebilen, arasına ekleme
yapılabilen ya da silinebilen bir nesneler takımına -- dönüştürdüğünü göreceksiniz.
Web tarayıcısına geçmeden önce, düz metnin HTML'nizi saklamak için neden kesinlikle en
iyi seçim olduğu üzerinde düşünebiliriz (bu konuda daha fazla bilgi edinmek için bkz.
Biçimleme üzerine bazı ek düşünceler). İyi ve kötü yönlerini ele almadan, HTML'nizin
sayfanın her görüntülenişinde ağ üzerinden bir Web tarayıcısına gönderildiğini hatırlayın
(basitleştirmek adına önbelleğe alma vb. görevleri bir kenara koyun). Kısacası, metnin
aktarılmasından daha etkili başka bir yaklaşım yoktur. İkili nesneler, sayfanın grafik
gösterimleri, büyük miktarlarda yeniden düzenlenen biçimlemeler ... bunların hiçbiri, ağ
üzerinden düz metin dosyaları kadar kolay gönderilemez.
Buna bir de tarayıcının bu formüle kattığı değeri ekleyin. Günümüzde kullanılan tarayıcılar,
kullanıcıların metnin büyüklüğünü değiştirebilmelerini, resimleri ölçeklendirebilmelerini, bir
sayfaya ilişkin CSS ya da JavaScript dosyasını yükleyebilmelerini (çoğu durumda) ve daha
birçok şeyi sağlamaktadır -- bunların tümü, sayfanın herhangi bir grafik gösteriminin
tarayıcıya gönderilmesini engeller. Bunun yerine, tarayıcı, sayfayı tarayıcıda işlemek için
gerekli işlemleri uygulamak üzere ham HTML'ye gereksinim duyar; böylece sayfanın
işlenmesi için sunucuya güvenmesi gerekmez. Aynı şekilde, CSS'yi JavaScript'ten ve bunları
HTML biçimlemesinden ayırmak için ayrılması kolay bir formatın kullanılması gerekir. Bunu
gerçekleştirmek için metin dosyaları kullanmak yine harika bir seçenektir.
Son, ancak bir o kadar da önemli bir şey de HTML 4.01 ve XHTML 1.0 ve 1.1 gibi yeni
standartların, içeriği (sayfanızdaki veriler) gösterimden ve stilden (genellikle CSS tarafından
uygulanır) ayırma konusundaki vaadlerini hatırlamanızdır. Programcıların HTML'lerini
Bazılarınız için şimdiye kadar okuduklarınız, Web geliştirme sürecindeki rolünüzün genel bir
gözden geçirmesi gibi olabilir. Ancak Web tarayıcısının yaptıkları söz konusu olduğunda, en
usta Web tasarımcılarının ve geliştiricilerinin birçoğu "kapağın altında" gerçekte olup bitenin
farkına bile varmaz. Bu bölümde bu konuya odaklanacağım. Endişelenmeyin, birazdan kodlar
da gelecek, ancak kodlarla ilgili sabırsızlığınız konusunda kendinizi biraz daha tutun, çünkü
bir Web tarayıcısının yaptıklarını gerçekten tam olarak anlamak, kodlarınızın doğru
çalışmasıaçısından büyük önem taşır.
Metin biçimlemesinin bir tasarımcı ya da sayfa yaratıcısı için inanılmaz avantajları olduğu
gibi, tarayıcı açısından önemli dezavantajları da vardır. Özellikle, tarayıcılar metin
biçimlemesini bir kullanıcıya doğrudan gösterirken zorlanmaktadır (bu konuda daha fazla
bilgi edinmek için Biçimleme üzerine bazı ek düşünceler konusuna bakın). Bu yaygın tarayıcı
görevlerini gözden geçirin:
• CSS stillerini (bunlar genellikle dış dosyalardaki birden çok stil sayfalarından
alnır),öğenin tipi, sınıfı, tanıtıcısı ve HTML içindeki konumuna bağlı olarak
biçimlemeye uygulama.
• Stilleri ve formatlamayı, JavaScript koduna göre (bu da genellikle dış dosyalarda
bulunur)HTML bölgesinin farklı parçalarına uygulama.
• JavaScript koduna göre form alanlarının değerini değiştirme.
• JavaScript koduna göre resim kaydırma ve resim değiştirme gibi görsel etkileri
destekleme.
Açıkça görülüyor ki, ilk aşamada bir sayfanın biçimlemesini alırken metin iyi bir çözüm
olmasına rağmen, tarayıcıya ilişkin HTML'in saklanması için düz metin pek iyi bir yöntem
değildir. Buna, JavaScript kodlamasının sayfanın yapısını değiştirebileceğini de eklerseniz
işler karışabilir. Tarayıcı, değiştirilen yapıyı diske yeniden mi yazmalı? Tarayıcı, belgenin şu
anki aşamasının ne olduğunu nasıl belirleyecek?
Tarayıcı bunu alır ve Şekil 1'deki gibi ağaca benzer bir yapıya dönüştürür.
Bu makaleyi izleyebilmeniz için birkaç tane çok küçük basitleştirme yaptım. DOM ya da
XML konusunda uzman olanlar, boş alanın, bir belgedeki metnin Web tarayıcısının ağ
yapısında nasıl gösterileceği ve kesileceği üzerinde bir etkiye sahip olabileceğini fark
edeceklerdir. Bu konuya girersek kafalar iyice karışacaktır, bu nedenle beyaz alanın etkisiyle
ilgili bilginiz varsa, harika; ama yoksa, okumaya devam edin ve bu konudaendişelenmeyin.
Bu bir soruna dönüştüğünde, ihtiyacınız olan her şeyi o zaman bulabilirsiniz.
Gerçek ağaç arka planı dışında burada fark edebileceğiniz ilk şey, ağaçtaki her şeyin, en
dıştaki, HTML'in kapsayıcı öğesi olan html öğesinden başladığıdır. Buna, ağaç benzetmesi
korunarak kök öğe denir. Ağacın en altında olmasına rağmen, ağaçlara bakarken ve ağaçları
çözümlerken her zaman buradan başlayın. Size yardımcı olacaksa, her ne kadar ağaç
benzetmesini bozsa da, her şeyi tersine çevirebilirsiniz.
Kökten, biçimlemenin farklı parçaları arasındaki ilişkileri gösteren çizgiler çıkar. head ve
body öğeleri, html kök öğesinin alt öğeleridir; title, head öğesinin ve "Trees, trees,
everywhere" metni de title öğesinin alt öğesidir. Tarayıcı, Şekil 1'de gördüğünüze benzer
bir yapı alıncaya kadar tüm ağaç bu şekilde düzenlenir.
Ek birkaç terim
Ağaç benzetmesine devam edersek, head ve body öğelerinin html öğesinin dalları olduğu
söylenir. Kendi içlerinde alt öğeleri de olduğu için bunlar dallardır. Ağacın uç noktalarına
Nesnelerin değeri
Temel terminolojinin bir kısmını öğrendiğinize göre, içinde öğe adlarının ve metinlerin
bulunduğu küçük dikdörtgenlerin üzerinde odaklanmanın zamanı geldi (Şekil 1).
Dikdörtgenlerin her biri bir nesnedir; tarayıcı, metinle ilgili bu sorunların bir kısmını burada
çözer. HTML belgesinin her bir parçasını gösteren nesneler kullanıldığında, düzenlemeyi
değiştirmek, stilleri uygulamak, JavaScript'in belgeye erişimine izin vermek ve daha birçok
işlem oldukça kolaylaşır.
Olası biçimleme tiplerinin her birinin kendi nesne tipi vardır. Örneğin, HTML'nizdeki öğeler
bir Element nesne tipiyle gösterilir. Belgenizdeki metin bir Text tipiyle, öznitelikler
Attribute tipleriyle gösterilir ve diğer öğeler için de bu böyle devam eder.
Yani Web tarayıcısı yalnızca belgenizi göstermek için bir nesne modeli kullanmakla kalmaz
(statik metinle uğraşmaktan kaçar), aynı zamanda nesne tipine göre bir şeyin ne olduğunu
hemen tanımlayabilir. HTML belgesi ayrıştırılır ve Şekil 1'de gördüğünüze benzer nesne
takımlarına dönüştürülür; böylece, köşeli parantez ve ters bölme işaretleri gibi şeyler (örneğin
< için < ve > için >) artık sorun olmaktan çıkar. Bu, tarayıcının işini, en azından giriş
HTML'sini ayrıştırdıktan sonra, çok daha kolaylaştırır. Bir şeyin öğe mi, yoksa bir öznitelik
mi olduğunu anlamak ve bu nesne tipiyle yapılacak işlemi belirlemek basittir.
someDiv.style.height = "300px";
Diğer bir deyişle, Web tarayıcısı bunun gibi nesne özelliklerini kullanarak ağacın
görünümünü ve yapısını çok kolay bir şekilde değiştirebilir. Bunu, tarayıcının sayfayı iç metin
olarak göstermesi durumunda yapması gereken karmaşık işlemlerle karşılaştırın;
özelliklerdeki ya da yapıdaki her değişiklik tarayıcının statik dosyayı yeniden yazmasını,
yeniden ayrıştırmasını ve ekranda yeniden görüntülemesini gerektirir. Bunların tümü
nesnelerle mümkün hale gelir.
Bu noktada, HTML belgelerinizin bazılarını açın ve bunları ağaçlar olarak çizin. Pek alışıldık
bir istek gibi görünmese de -- özellikle çok az kodun bulunduğu bir makalede -- bu ağaçları
beceriyle kullanmak istiyorsanız, bu ağaçların yapılarını öğrenmeniz gerekir.
• Özniteliklere ne oluyor?
• em ve b gibi öğelerle ayrılan metne ne oluyor?
• Ve doğru bir şekilde yapılandırılmayan HTML ne oluyor? (Örneğin kapanış p biçim
imi eksik olduğunda)
Bu tür sorunları gördükten sonra, aşağıdaki birkaç bölümü çok daha iyi anlayacaksınız.
p öğesinin üç farklı alt nesnesi vardır ve bunların hiçbiri, "Welcome to a really boring Web
page." metninin tamamını içermemektedir. Bu metnin, "Welcome to a" ve " boring Web
page" gibi parçalarını bulabilirsiniz, ancak tamamını bulamazsınız. Bunu anlamak için
biçimlemenizdeki her şeyin, bir nesne tipine dönüştürülmesi gerektiğini hatırlayın.
Dahası, bunların sırası da önemlidir! Kullanıcıların, doğru biçimlemeyi gösteren, ancak bunu
HTML'nizde sağladığınızdan farklı bir sırada gerçekleştiren bir tarayıcıya nasıl yanıt
vereceklerini düşünebiliyor musunuz? Paragraflar, başlıklar ve üst başlıklar arasında
sıkışmıştır, kendiniz belgeyi böyle düzenlemediğinizde bile bu böyledir. Açıkça görülüyor ki
tarayıcının, öğelerin ve metnin sırasını koruması gerekir.
Bu kavramı anlamanız sizin için çok büyük önem taşır. "really" metni p öğesinin metninin
geri kalanıyla birlikte görüntülenecek olsa bile, bu yine de em öğesinin bir doğrudan alt
öğesidir. p öğesinin geri kalanından farklı bir formatlamaya sahip olabilir ve metnin geri
kalanından bağımsız olarak hareket ettirilebilir.
Bunu aklınıza iyice kazımak için Liste 2 ve 3'teki HTML'in şemalarını çıkarmayı deneyin ve
metni, doğru üst öğeyle birlikte ele aldığınızda emin olun (metin ekranda nasıl görüntülenirse
görüntülensin).
<div id="main-body">
<div id="contents">
<table>
<tr><th>Steps</th><th>Process</th></tr>
</table>
</div>
<div id="closing">
This link is <em>not</em> active, but if it were, the answers
to this <a href="answers.html"><img src="exercise.gif" /></a> would
be there. But <em>do the exercise anyway!</em>
</div>
</div>
</body>
</html>
Özniteliklere ne oluyor?
Öznitelikler aslında, tarayıcının kullandığı nesne modelinde saklanır, ancak bunlarınki biraz
özel bir durumdur. Her bir öğenin, alt nesne listesinden ayrı, kullanılabilir bir öznitelik listesi
vardır. Dolayısıyla bir div öğesinin, "id" özniteliğini ve "class" özniteliğini içeren bir listesi
olabilir.
Bir öğeye ilişkin özniteliklerin, benzersiz adları olması gerektiğini unutmayın; diğer bir
deyişle, bir öğenin iki tane "id" ya da iki tane "class" özniteliği olamaz. Bu, listeyi takip
etmeyi ve listeye erişimi çok kolaylaştırır. Sonraki makalede de göreceğiniz gibi, bir
özniteliğin değerini adına göre almak için yalnızca getAttribute("id") gibi bir yöntemi
çağırabilirsiniz. Benzer yöntem çağrılarıyla öznitelik ekleyebilir ve var olan özniteliklerin
değerini ayarlayabilirsiniz (ya da sıfırlayabilirsiniz).
Öznitelik adlarının benzersiz olmasının, bu listeyi, alt nesne listesinden farklı kıldığını da
hatırlatalım. Bir p öğesinin içinde birden çok em öğesi olabilir; bu nedenle, alt nesne listesi
yinelenen öğeler içerebilir. Alt nesne listesi ve öznitelik listesi benzer şekilde çalışır, ancak
biri yinelenen öğeler içerirken (bir nesnenin alt öğeleri), diğeri içermez (bir öğe nesnesinin
öznitelikleri). Son olarak, yalnızca öğelerin öznitelikleri olabildiğinden, metin nesnelerinin
öznitelikleri saklayacak bağlı listeleri olmaz.
Özensiz HTML
Devam etmeden önce, tarayıcının biçimlemeyi bir ağaç gösterimine dönüştürmesiyle ilgili bir
konu üzerinde daha durmalıyız -- tarayıcı iyi hazırlanmamış biçimlemeyi nasıl işler. İyi
hazırlanmış, aslında XML'de yaygın bir şekilde kullanılan bir terimdir ve iki temel anlamı
vardır:
• Her açılış biçim iminin, bununla eşleşen bir de kapanış biçim imi vardır. Belgedeki her
<p> biçim imi bir </p>, her <div> biçim imi bir </div> biçimimi ile eşleşir.
• En içteki açılış biçim imi, en içteki kapanış biçim imiyle eşleşir; daha sonra bir sonraki
en içteki açılış biçim imi, bir sonraki kapanış biçimimiyle eşleşir, vb. Dolayısıyla,
<b><i>bold and italics</b></i> biçim imi, en içteki açılış biçim imi -- <i> -- en
içteki kapanış biçim imiyle -- <b> -- yanlış eşleştiği için geçersiz olur. Bunu iyi bir
şekilde hazırlamak için, açılış biçim iminin sırasını ya da kapanış biçim iminin sırasını
değiştirmeniz gerekir. (Her ikisini de değiştirirseniz, sorun yine devam eder.)
Bu iki kuralı iyi çalışın. Bu iki kural yalnızca belgenin basit bir şekilde düzenlenmesini
sağlamak kalmaz, aynı zamanda belirsizliğin de ortadan kalkmasını sağlar. Önce koyu, sonra
italik biçim mi uygulanmalı? Yoksa tersi mi yapılmalı? Bu sıralama ve belirsizlik büyük bir
sorun gibi görünmüyorsa, CSS'nin kuralların başka kuralları iptal etmesine izin verdiğini
Tarayıcının iyi hazırlanmamış bir belge aldığı durumlarda, tarayıcı elinden gelenin en iyisini
yapar. Sonuçta ortaya çıkan ağaç yapısı, en iyi ihtimalle özgün sayfa yazarının tasarladığına
yakın bir şey ve en kötü ihtimalle, tamamen farklı bir şey olacaktır. Sayfanızı bir tarayıcıya
yüklediyseniz ve tamamen beklenmedik bir şeyle karşılaştıysanız, bir tarayıcının yapınızın ne
olması gerektiğini tahmin etmeye çalıştığında ve işini başarısız bir şekilde yaptığında ortaya
çıkan sonucu görmüş olabilirsiniz. Elbette, bu sorunun çözümü oldukça basittir:
Belgelerinizin iyi hazırlandığından emin olun! Buna benzer standartlaştırılmış HTML'in nasıl
yazılacağı konusunda şüpheleriniz varsa, yardım için Kaynaklar bölümüne bakın.
DOM'ye giriş
Şimdiye kadar tarayıcıların bir Web sayfasını bir nesne gösterimine dönüştürdüğünü
öğrendiniz ve belki de nesne gösteriminin bir DOM ağacı olduğunu tahmin ettiniz. DOM,
Document Object Model (Belge Nesne Modeli) teriminin kısaltmasıdır ve W3C'de (World
Wide Web Consortium) bulabileceğiniz bir belirtimdir (Kaynaklar bölümünde DOM ile ilgili
birkaç bağlantı bulabilirsiniz).
Belge nesnesi
Elbette, bu kodun tek başına hiçbir yararı yoktur, ancak her Web tarayıcısının, document
nesnesini JavaScript kodu tarafından kullanılabilir kıldığını ve nesnenin, tam biçimleme
ağacını temsil ettiğini gösterir (Şekil 1).
Açıkça görülüyor ki document nesnesi önemlidir, ancak aynı zamanda yalnızca bir
başlangıçtır. Daha ileriye gitmeden önce, bir terim daha öğrenmeniz gerekir: düğüm.
Biçimlemenin her bir parçasının bir nesneyle temsil edildiğini zaten biliyorsunuz, ancak bu
herhangi bir nesne değildir -- bu, belirli bir nesne tipi, DOM düğümüdür. Daha özel tipler --
metin, öğeler ve öznitelikler gibi -- bu temel düğüm tipinden genişler. Böylece elinizde, metin
düğümleri, öğe düğümleri ve öznitelik düğümleri vardır.
O zaman öğrendiğiniz terimleri sadeleştirmek amacıyla, DOM ağacının, bir nesne ağacı
olduğu, ancak daha özel bir şekilde bir düğüm nesneleri ağacı olduğunu söyleyebiliriz. Ajax
uygulamalarında -- ya da diğer herhangi bir JavaScript'te -- bir öğenin ve içeriğinin
kaldırılması, metnin belirli bir parçasının vurgulanması ya da yeni bir resim öğesinin
eklenmesi gibi etkileri yaratmak için bu düğümleri kullanabilirsiniz. Bunların tümü istemci
tarafında (Web tarayıcınızda çalışan kod) gerçekleştiği için, bu etkiler sunucuyla iletişim
kurulmadan hemen etkin olur. Web sayfasındaki öğeler, sunucuya istek gönderilip gelen yanıt
yorumlanırken karşılaşılan çok uzun duraklamalar olmadan değiştiği için sonuçta ortaya çıkan
uygulama genellikle daha yanıt verici olduğu hissini verir.
Programlama dillerinin çoğunda, her bir düğüm tipine ilişkin gerçek nesne adlarını
öğrenmeniz, kullanılabilir özellikleri öğrenmeniz ve tipleri ve seçimleri anlamanız gerekir;
ancak JavaScript'te bunların hiçbiri gerekli değildir. Basit bir şekilde bir değişken yaratabilir
ve bunu, istediğiniz nesneye atayabilirsiniz (önceden de gördüğünüz gibi):
Herhangi bir tip yoktur ve JavaScript değişkenlerin yaratılmasını ve gerekli şekilde doğru
tiplere atanmalarını sağlar. Sonuç olarak, JavaScript üzerinden DOM kullanımı oldukça basit
bir şey olur (sonraki bir makalede DOM'nin XML ile ilişkisi ele alınacaktır ve işler, o noktada
biraz daha hassaslaşır).
Sonuç
Bu noktada, sizi biraz heyecanlı bir dizinin ortasında bırakır gibi olacağım. Açıkçası, bu
makale DOM'yi tam olarak tüm ayrıntılarıyla kapsayan bir yazı olmadı; aslında, bu makale
DOM'ye girişten biraz daha fazlasını içeriyor. DOM konusunda anlatılacak, bugün size
anlattığımdan çok daha fazla şey var!
Bu dizinin bir sonraki makalesi, bu düşünceleri biraz daha genişletecek ve DOM'yi, Web
sayfalarını güncellemek, HTML'inizde hızla değişiklikler yapmak ve kullanıcınıza daha
etkileşimli bir deneyim yaratmak için JavaScript ile nasıl kullanabileceğiniz üzerinde
duracaktır. Ajax isteklerinizde XML kullanılmasına ilişkin sonraki makalelerimde DOM
konusuna yeniden döneceğim. Bu yüzden DOM'yi öğrenin; DOM, Ajax uygulamalarınızın
ana parçalarından biri olacak.
Bu noktada DOM ile ilgili daha ayrıntılı bilgiler vermek daha kolay olurdu; DOM ağacında
hareket etmeyle ilgili ayrıntılar, öğe ve metin değerlerini alma, düğüm listelerinde dolaşma ve
Bir sonraki makaleye geçmeden önce, ağaç yapıları üzerine biraz düşünmeyi deneyin ve kendi
HTML'niz üzerinde çalışıp bir Web tarayıcısının HTML'yi biçimlemenin bir ağaç
görünümüne nasıl dönüştürdüğünü inceleyin. Ayrıca, bir DOM ağacı düzenlemesiyle ilgili
düşünün ve bu makalede anlatılan özel durumlarla ilgili çalışın: öznitelikler, içinde öğelerin
karıştırıldığı metin, metin içeriği olmayan öğeler (img öğesi gibi).
Ve sakın unutmayın: burada Liste 2 ve 3'ün yanıtları bulunmaktadır -- bunlar aynı zamanda
örnek kodun da içindedir!
Kaynaklar
Bilgi Edinme
• World Wide Web Consortium'daki DOM Ana Sayfası: DOM ile ilgili her şeyin
başlangıç noktası olan bu siteyi ziyaret edin.
• "Ajax for Java developers: Build dynamic Java applications:" Java bakış açısını
kullanarak sunucu tarafından Ajax'a bakın ve dinamik Web uygulaması deneyimleri
oluşturmak için çığır açan bir yaklaşımla tanışın (developerWorks, Eylül 2005).
• "Ajax for Java developers: Java object serialization for Ajax:" Java nesnesi
diziselleştirmesine ilişkin beş yaklaşımı inceleyin ve ağ üzerinden nesneleri nasıl
göndereceğinizi ve Ajax ile nasıl etkileşime geçeceğinizi öğrenin (developerWorks,
Ekim 2005).
• "Call SOAP Web services with Ajax, Part 1: Build the Web services client:" Ajax'ın
var olan SOAP tabanlı Web hizmetleriyle bütünleştirilmesine ilişkin bu ileri düzey
makaleyi inceleyin; Ajax tasarım şablonunu kullanarak Web tarayıcısı tabanlı SOAP
Web hizmetleri istemcisini nasıl uygulayacağınızı gösterir (developerWorks, Ekim
2005).
• "Ajax: A New Approach to Web Applications": Ajax moniker teriminin ilk kez
kullanıldığı bu makaleyi okuyun -- tüm Ajax geliştiricileri bu makaleyi okumalıdır.
• HTTP durum kodları: W3C'den alınan durum kodlarının tam listesini gözden geçirin.
• Head Rush Ajax, Elisabeth Freeman, Eric Freeman ve Brett McLaughlin (Şubat 2006,
O'Reilly Media, Inc.): Bu makaledeki fikirleri beyninize Head First yöntemiyle
yükleyin.
• Java and XML, İkinci Basım, Brett McLaughlin (Ağustos 2001, O'Reilly Media, Inc.):
Yazarın, XHTML ve XML dönüşümleriyle ilgili düşüncelerini okuyun.
• JavaScript: The Definitive Guide, David Flanagan (Kasım 2001, O'Reilly Media,
Inc.): JavaScript ve dinamik Web sayfalarıyla çalışmaya ilişkin kapsamlı yönergeleri
inceleyin. Yayınlanacak olan yeni basımda Ajax ile ilgili iki yeni bölüm vardır.
• Head First HTML with CSS & XHTML, Elizabeth ve Eric Freeman (Aralık 2005,
O'Reilly Media, Inc.): XHTML, CSS ve bu ikisini birlikte kullanmayı öğrenmeyle
ilgili bu eksiksiz kaynağı dikkatle okuyun.
Düzey: Başlangıç
11 Nisan 2006
Geçen ay Brett, öğeleri sahne arkasında Web sayfalarınızı tanımlamak için çalışan Belge
Nesne Modeli'ni tanıtmıştı. Bu ay, DOM ile ilgili daha derin konulara giriyor. DOM ağacının
paçalarını nasıl yaratabileceğinizi, kaldırabileceğinizi ve değiştirebileceğinizi öğrenin ve Web
sayfalarınızı hızla güncellemek için sonraki adımı atın!
Bu dizide geçen ay yayınlanan yazımı okuduysanız, bir Web tarayıcısı Web sayfalarınızdan
birini görüntülediğinde neler olup bittiğini birinci elden öğrenmişsinizdir. O yazımda da
anlattığım gibi, sayfanız için tanımladığınız HTML ve CSS bir Web tarayıcısına
gönderildiğinde, metinden bir nesne modeline çevrilir. Kodun basit ya da karmaşık
olmasından, tümünün bir dosyada ya da ayrı dosyalarda saklanmasından bağımsız olarak bu
geçerlidir. Daha sonra tarayıcı, sağladığınız metin dosyalarıyla çalışmak yerine, doğrudan
nesne modeliyle çalışır. Tarayıcının kullandığı modele Belge Nesne Modeli denir.
Belgelerinizdeki öğeleri, öznitelikleri ve metni temsil eden nesneleri bir birine bağlar. HTML
ve CSS içindeki tüm stiller, değerler ve hatta boşlukların çoğu nesne modelinde birleştirilir.
Belirli bir Web sayfasına ilişkin özel modele, sayfanın DOM ağacı denir.
Bir DOM ağacının ne olduğunu anlamak ve HTML'nizi ve CSS'nizi nasıl gösterdiğini bilmek,
Web sayfalarınızın denetimini almak konusunda atacağınız ilk adımdır. Daha sonra, belirli bir
Web sayfası için DOM ağacıyla nasıl çalışacağınızı öğrenmeniz gerekir. Örneğin, DOM
ağacına bir öğe eklerseniz, bu öğe hemen kullanıcının Web tarayıcısında görüntülenir --
sayfanın yeniden yüklenmesine gerek yoktur. DOM ağacından metnin bir kısmını
kaldırdığınızda da metin, kullanıcının ekranından kaybolur. Kullanıcı arabirimini DOM
aracılığıyla değiştirebilir ve kullanıcı arabirimiyle DOM üzerinden etkileşime geçebilirsiniz;
bu da size programlama konusunda inanılmaz bir güç ve esneklik sağlar. DOM ağacıyla nasıl
çalışılacağını öğrendiğinizde, zengin içerikli, etkileşimli, dinamik Web sitelerine doğru büyük
bir adım atarsınız.
Aşağıdaki konular geçen ayki "Web yanıtı için DOM'yi kullanma" yazısını temel alır; o
makaleyi henüz okumadıysanız, buradan ileri gitmeden önce okumak isteyebilirsiniz.
Belge Nesne Modeli, bir W3C standardıdır (W3C bağlantıları için Kaynaklar bölümüne
bakın). Bu nedenle, tüm modern Web tarayıcıları DOM'yi, en azından belirli bir düzeye kadar
destekler. Tarayıcılar arasında bazı farklılıklar vardır, ancak temel DOM işlevselliğini
kullanırsanız -- ve birkaç özel ve olağandışı duruma dikkat ederseniz -- DOM kodunuz tüm
tarayıcılarda aynı şekilde çalışacaktır. Opera içindeki bir Web sayfasını değiştirmek için
yazdığınız kod, Apple's Safari®, Firefox®, Microsoft® Internet Explorer® ve Mozilla®
tarayıcılarında da çalışır.
DOM'yi aynı zamanda yaygın olarak kullanılan programlama dillerinin çoğuyla birlikte
kullanabilirsiniz. W3C, DOM için birkaç dil ilişkilendirmesi tanımlamıştır. Dil
ilişkilendirmesi, basit anlamda, DOM'yi belirli bir dille kullanabilmeniz için tanımlanan bir
API'dir. Örneğin, C, Java ve JavaScript için iyi tanımlanmış DOM dil ilişkilendirmeleri
bulabilirsiniz. Dolayısıyla, DOM'yi bu dillerin herhangi biriyle kullanabilirsiniz. Dil
ilişkilendirmeleri, diğer bazı diller için de mevcuttur, ancak bunların çoğu W3C tarafından
değil, üçüncü taraflar tarafından tanımlanmıştır.
Tüm bunlar söylendikten sonra, diğer dillerdeki DOM dil ilişkilendirmelerine debakmanızı
öneririm. Örneğin, Java dili ilişkilendirmelerini yalnızca HTML ile değil, aynı zamanda bu
makalenin sonraki kısımlarında da anlatacağım gibi, XML ile de çalışmak için
kullanabilirsiniz. Burada öğreneceğiniz dersler HTML'in ötesinde, yalnızca istemci tarafı
JavaScript'inden çok daha fazla ortam için geçerlidir.
Kavramsal düğüm
Düğüm, DOM içindeki en temel nesne tipidir. Aslında, bu makalenin sonraki kısımlarında da
göreceğiniz gibi, DOM ile tanımlanan neredeyse her nesne düğüm nesnesini genişletir.
Ancak, semantikle ilgili daha ileri aşamalara geçmeden önce, bir düğümün temsil ettiği
kavramı anlamanız gerekir; daha sonra, düğümün gerçek özelliklerini ve yöntemlerini
öğrenmek sizin için çok kolay olacaktır.
Düğüm bir...
En basit anlatımla düğüm, bir DOM ağacındaki tek bir şeydir. "Şey" sözcüğü, belirsizliği
nedeniyle özellikle kullanılmıştır, çünkü bu olabilecek en belirgin terimdir. Örneğin,
HTML'nizdeki bir öğe (img gibi) ile HTML'nizdeki bir metin parçasının ("Scroll down for
more details" gibi) birçok ortak özelliğe sahip oldukları yeterince açık olmayabilir. Ancak
bunun nedeni, bu ayrı tiplere işlevleri açısından bakmanız ve birbirlerinden ne kadar farklı
olduklarını düşünmenizdir.
Bunun yerine, DOM ağacındaki her bir öğenin ve metin parçasının bir üst öğesinin olduğunu;
bu üst öğenin de, başka bir öğenin alt öğesi (img öğesinin p öğesine yerleştirilmesi gibi) ya da
DOM ağacındaki en üst öğe olduğunu (her belge için bir defalık özel bir durumdur ve html
öğesini kullandığınız yerdir) düşünün. Ayrıca, hem öğelerin hem de metnin bir tipinin
olduğunu dikkate alın. Bir öğeye ilişkin tip, gayet açık olarak öğedir; metne ilişkin tip de
metindir. Her bir düğümün oldukça iyi tanımlanmış bir yapısı da vardır: kendi altında, alt
öğeler gibi düğümleri var mı? Kardeş düğümleri (öğe ya da metnin "yanındaki" düğümler)
var mı? Her bir düğüm hangi belgeye ait?
Açıkçası, bunların çoğu oldukça soyut görünür. Aslında, bir öğe tipinin öğe olduğunu
söylemek biraz saçma görünebilir. Ancak, ortak bir nesne tipi olarak düğümün sahip olduğu
değeri anlamanız için biraz soyut düşünmeniz gerekir.
DOM kodunuzun içinde en çok gerçekleştireceğiniz tek görev bir sayfanın DOM ağacında
gezinmek olacaktır. Örneğin, "id" özniteliğine göre bir formu bulabilir ve bu formun içindeki
iç içe geçmiş öğelerle ve metinle çalışmaya başlayabilirsiniz. Metin yönergeleri, giriş
alanlarına ilişkin etiketler, gerçek inputöğeleri ve büyük olasılıkla diğer HTML öğeleri (img
öğeleri gibi) ve bağlantılar (a öğeleri) olacaktır. Öğeler ve metin tamamen farklı tiplerdeyse,
bir tipten diğerine geçmek için tamamen farklı kod parçaları yazmanız gerekir.
Bir ortak düğüm tipi kullanırsanız her şey farklılaşır. Böyle bir durumda, basit bir şekilde
düğümden düğüme geçer ve düğümün tipiyle, yalnızca bir öğe ya da metinle ilgili özel bir şey
yapmak istediğinizde ilgilenirsiniz. DOM ağacında dolaşırken, bir öğenin üst öğesine -- ya da
alt öğelerine -- geçmek için, diğer düğüm tiplerinde gerçekleştireceğiniz işlemleri
kullanırsınız. Bir düğüm tipiyle, yalnızca belirli bir düğüm tipine özgü (öğenin öznitelikleri
gibi) bir şeyler yapmanız gerektiğinde özel olarak çalışmanız gerekir. DOM ağacındaki her
bir nesneyi bir düğüm olarak düşünmek, çalışmanızı çok basitleştirir. Aklınızdan bunu
çıkarmadan, bir sonraki bölümde, özellikler ve yöntemlerden başlayarak DOM Düğüm
yapısının tam olarak neler sunduğuna bakacağım.
Diğer birkaç özellik, daha soysal XML belgeleri için geçerlidir ve HTML tabanlı Web
sayfalarıyla çalıştığınızda pek de işinize yaramazlar.
Alışılmadık özellikler
Benzer şekilde, öğelerin bir nodeName özelliği vardır (öğenin adı), ancak bir öğe nodeValue
özelliğinin değeri her zaman boştur. Özniteliklerin, hem nodeName hem de nodeValue
özellikleri için değerleri vardır. Bir sonraki bölümde bu ayrı tiplerle ilgili biraz daha ayrıntıya
gireceğim, ancak bu özellikler her düğümün parçası olduğu için, burada bunlardan söz
etmekte fayda var.
Düğüm yöntemleri
Sırada tüm düğümlerle kullanılabilen yöntemler var (düğüm özelliklerinde olduğu gibi, çoğu
HTML DOM işlemleri için gerçekten geçerli olmayan birkaç yöntemi atladım):
Beni sına!
Şimdiye kadar Liste 1 ve 2'de yalnızca iki örnek gördünüz, ancak bunlar bile DOM ağacını
kullanmaya başladığınızda yapabileceklerinize ilişkin her tür fikri vermiş olmalı. Buraya
Liste 3. DOM'nin kullanıldığı bazı JavaScript kodlarının bulunduğu bir HTML dosyası
<html>
<head>
<title>JavaScript and the DOM</title>
<script language="JavaScript">
function test() {
// These first two lines get the DOM tree for the current Web page,
// and then the <html> element for that DOM tree
var myDocument = document;
var htmlElement = myDocument.documentElement;
</html>
Bu sayfayı tarayıcınıza yüklediğinizde, Şekil 1'dekine benzer bir sayfa görmeniz gerekir.
Şekil 1. JavaScript çalıştırmak üzere bir düğmesi olan basit bir HTML sayfası
Test me! (Beni sına!) düğmesini tıklattığınızda Şekil 2'deki gibi uyarı kutuları
görüntülenmeye başlar.
Kod çalışmayı tamamladığında, resimler Şekil 3'te gösterildiği gibi gerçek zamanlı olarak
sayfadan kaldırılır.
Her bir düğümdeki kullanılabilir özelliklere ve yöntemlere yeniden bakın. Bunlar, nesne
odaklı (OO) programlama kullananlar için DOM'ye ilişkin bir temel noktayı açıklar: DOM
çok da nesne odaklı bir API değildir. Birincisi, birçok durumda bir düğüm nesnesinde yöntem
çağırmak yerine, nesnenin özelliklerini doğrudan kullanırsınız. getNodeName() yöntemi
yoktur; örneğin, nodeName özelliğini doğrudan kullanırsınız. Dolayısıyla düğüm nesneleri (ve
diğer DOM nesneleri), özellikleri aracılığıyla, yalnızca işlevleri değil, birçok veriyi de
gösterir.
İkincisi, özellikle Java ya da C++ gibi dillerde aşırı yüklü nesnelerle ve nesne odaklı API'lerle
çalışmaya alıştıysanız, DOM içindeki nesnelerin ve yöntemlerin adlandırılması biraz garip
görünebilir. DOM'nin, birkaç dil belirtmek gerekirse, C, Java ve JavaScript içinde çalışması
gerekir; bu yüzden, API tasarımından bazı ödünler verilmiştir. Örneğin, aşağıdaki gibi
görünen NamedNodeMap yöntemlerinde iki farklı yöntem görürsünüz:
• getNamedItem(String name)
• getNamedItemNS(Node node)
OO programcıları için bu oldukça garip görünür. İki yöntemin amacı aynıdır, ancak biri bir
dizeyi (String) alırken, diğeri bir düğümü (Node) alır. OO API'lerinin çoğunda, her iki sürüm
için de aynı yöntem adını kullanırdınız. Kodunuzu çalıştıran sanal makine, yönteme geçirilen
nesne tipine dayalı olarak çalıştırılacak yöntemi belirlerdi.
nodeName özelliği her tipin bir adı olması için tasarlanmıştır; ancak birçok durumda, ad
tanımlanmamıştır ya da programcılar için değer taşımayan garip bir iç addır (örneğin, Java'da
bir metin düğümünün nodeName özelliği, birçok durumda "#text" olarak bildirilir). Aslında,
hata işlemenin size bırakıldığını varsaymanız gerekir. Hemen myNode.nodeName değerine
erişmek ve bu değeri kullanmak güvenli değildir; birçok durumda, değer boş olacaktır. Bu
HTML ile uğraşırken, zamanınızın yaklaşık %95'ini bu düğüm tipleriyle çalışarak geçirirsiniz.
Bu nedenle, bu ayki makalenin geri kalan kısmını bu konuda daha ayrıntılı bilgi vermek için
kullanacağım. (İleride yazacağım bir makalede XML konusunu anlatırken, diğer düğüm
tiplerinden bazılarını da tanıtacağım.)
Belge düğümü
Birinci düğüm tipi, yazdığınız DOM tabanlı hemen her kodda kullanacağınız belge
düğümüdür. Belge düğümü, aslında HTML (ya da XML) sayfasının bir öğesi değil, sayfanın
kendisidir. Dolayısıyla HTML Web sayfasında, belge düğümü tüm DOM ağacıdır.
JavaScript'te, document anahtar sözcüğünü kullanarak belge düğümüne erişebilirsiniz:
// These first two lines get the DOM tree for the current Web page,
// and then the <html> element for that DOM tree
var myDocument = document;
var htmlElement = myDocument.documentElement;
JavaScript'teki document anahtar sözcüğü, geçerli Web sayfasına ilişkin DOM ağacını
gösterir. Buradan, ağaçtaki tüm düğümlerle çalışabilirsiniz.
Aşağıdaki yöntemlere benzer yöntemleri kullanarak yeni düğümler yaratmak için document
belgesini de kullanabilirsiniz:
Bir Web sayfasının DOM ağacına erişmek için document öğesini kullandıktan sonra, öğelerle,
özniteliklerle ve metinle doğrudan çalışmaya başlayabilirsiniz.
Öğe düğümleri
Öğe düğümleriyle çok çalışacaksınız, ancak öğeler üzerinde gerçekleştirmeniz gereken birçok
işlem, yalnızca öğelere özel yöntemler ve özellikler yerine, tüm düğümler için geçerli
yöntemleri ve özellikleri içerir. Yalnızca iki yöntem takımı öğelere özeldir:
Bunların tümü büyük ölçüde kendi kendilerini açıklar niteliktedir, ancak yine de aşağıdaki
örneklere bakmanızda yarar vardır.
Özniteliklerle çalışma
İç içe geçmiş öğeleri bulmak da kolaydır. Örneğin, Liste 3'teki HTML sayfasında bulunan
tüm img öğelerini bulmak ve kaldırmak için aşağıdaki kodu kullandım:
Öznitelik düğümleri
DOM, öznitelikleri düğüm olarak gösterir ve bir öğenin attributes özelliğini kullanarak her
zaman bir öğenin özniteliklerini aşağıda gösterildiği gibi alabilirsiniz:
bodyElement.removeChild(imgElement);
}
attributes özelliğinin aslında düğüm tipi üzerinde olduğunu ve özellikle öğe tipi üzerinde
olmadığını belirtelim. Bu biraz gariptir ve kodlamanızı etkilemez, ancak bilinmesi yararlıdır.
Metin düğümleri
Düşünmeniz gereken son düğüm tipi -- en azından HTML DOM ağaçlarıyla çalışırken --
metin düğümleridir. Metin düğümleriyle çalışmak için yaygın olarak kullanacağınız
özelliklerin neredeyse tümü, gerçekte düğüm nesnesinde bulunur. Aslında, aşağıda
gösterildiği gibi metin düğümünden metin almak için genellikle nodeValue özelliğini
kullanacaksınız:
Diğer birkaç yöntem, metin düğümlerine özeldir. Bunlar, bir düğümdeki verilere ekleme
yapma ya da verileri bölmeyle uğraşırlar:
Şimdiye kadar gördüklerinizin çoğu, çalıştığınız düğüm tipini bildiğiniz varsayımına dayanır,
ancak durum her zaman böyle değildir. Örneğin, bir DOM ağacında geziniyorsanız ve ortak
düğüm tipleriyle çalışıyorsanız, bir öğeye ya da metne geçtiğinizi fark etmeyebilirsiniz. Bir p
öğesinin tüm alt öğelerini alabilir ve metinle mi, bir b öğesiyle mi, yoksa bir img öğesiyle mi
çalıştığınızdan emin olamayabilirsiniz. Böyle durumlarda, bir düğümle çalışmaya başlamadan
önce ne tip bir düğümle çalıştığınızı anlamanız gerekecektir.
Neyse ki bunu anlamak oldukça basittir. DOM düğüm tipi, aşağıdakilere benzer birkaç
değişmez değeri tanımlar:
Başka birkaç düğüm tipi daha vardır, ancak HTML işlemlerinde, bu dördünün dışındakiler
çok seyrek olarak kullanılır. Bu değişmezlerin her birine ilişkin değerlerin DOM belirtiminde
tanımlanmasına rağmen ben, bilerek bunları atladım; değerle hiçbir zaman doğrudan
çalışmamalısınız, değişmezlerin amacı budur!
nodeType özelliği
Bu oldukça basit bir örnektir, ancak asıl nokta da budur: bir düğüm tipinin alınması basittir.
Daha zor olan konu, düğümün tipini öğrendikten sonra düğümle ne yapacağınızı bilmektir;
ancak düğüm, metin, öznitelik ve öğe tipleri konusunda sağlam bir bilgiyle, DOM
programlamasını kendi başınıza üstlenmeye hazırsınız.
nodeType özelliği, düğümlerle çalışmanız için gereken bileti size sağlayacakmış gibi
görünüyor -- ne tip bir düğümle çalıştığınızı anlamanıza ve daha sonra, bu düğümle ilgili kodu
yazmanıza olanak tanıyor. Buradaki sorun, yukarıda tanımlanan Node değişmezlerinin
Internet Explorer üzerinde düzgün çalışmamasıdır. Bu nedenle, Node.ELEMENT_NODE,
Node.TEXT_NODE ya da diğer değişmezleri kodunuzda kullanırsanız, Internet Explorer Şekil
4'te gördüğünüze benzer bir hata verir.
Sonuç
Bu dizinin son birkaç makalesinde birçok şey öğrendiniz. Bu noktada, oturup bir sonraki
makalede DOM ağacının tüm akıllı kullanım çeşitlerini ele almamı beklememelisiniz. Şimdiki
ev ödeviniz DOM ile hoş etkileri ya da parlak arabirimleri nasıl yaratacağınızı keşfetmek. Bu
son iki makalede öğrendiklerinizi gözden geçirin ve deney yapıp kodlarla biraz oynamaya
başlayın. Bir masaüstü uygulamasını andıran, bir kullanıcı işlemine yanıt olarak nesnelerin
ekranda hareket ettiği bir Web sitesi oluşturup oluşturamayacağınızı görün.
Daha da iyisi, ekrandaki her nesnenin çevresine bir sınır çizin ve nesnelerin DOM ağacındaki
yerlerini görün ve nesneleri hareket ettirmeye başlayın. Düğümler oluşturun ve bunları var
olan alt öğe listelerine ekleyin; iç içe geçmiş birçok düğümden oluşan düğümleri kaldırın; bir
düğümün CSS stilini değiştirin ve bu değişikliklerin alt düğümler tarafından alınıp
alınmadıklarına bakın. Olasılıklar sınırsızdır ve yeni bir şeyi her deneyişinizde yeni bir şey
öğrenirsiniz. Web sayfalarınızla oynamanın tadını çıkarın.
Daha sonra, DOM'ye özel bu üçlemenin son parçasında DOM'nin bazı havalı ve ilginç
uygulamalarını programlamanızla nasıl birleştireceğinizi göstereceğim. Kavramsal olarak
konuşmayı ve API'yi anlatmayı bırakıp size biraz kod göstereceğim. O zamana kadar,
kendinize ait birkaç parlak fikir bulun ve kendi başınıza nelergerçekleştirebileceğinizi görün.
Bilgi Edinme
• Use Ajax with WebSphere Portal (Ajax'ı WebSphere Portal ile kullanma), portal
performansını artırmak, daha temiz bir portal uygulaması mimarisi ve -- en önemlisi --
kullanıcılarınıza çok daha hızlı yanıt veren bir portal yaratmak için. (developerWorks,
Haziran 2006)
• Ajax for Java developers: Build dynamic Java applications, Philip McCarthy: Java
bakış açısını kullanarak sunucu tarafından Ajax'a bakın ve dinamik Web uygulaması
deneyimleri oluşturmak için çığır açan bir yaklaşımla tanışın (developerWorks, Eylül
2005).
• Ajax for Java developers: Java object serialization for Ajax, Philip McCarthy: Java
nesnesi diziselleştirmesine ilişkin beş yaklaşımı inceleyin ve ağ üzerinden nesneleri
nasıl göndereceğinizi ve Ajax ile nasıl etkileşime geçeceğinizi öğrenin
(developerWorks, Ekim 2005).
• Call SOAP Web services with Ajax, Part 1: Build the Web services client, James
Snell: Ajax'ın var olan SOAP tabanlı Web hizmetleriyle bütünleştirilmesine ilişkin bu
ileri düzey makaleyi inceleyin; Ajax tasarım şablonunu kullanarak Web tarayıcısı
tabanlı SOAP Web hizmetleri istemcisini nasıl uygulayacağınızı gösterir
(developerWorks, Ekim 2005).
• World Wide Web Consortium'daki DOM Ana Sayfası: DOM ile ilgili her şeyin
başlangıç noktası olan bu siteyi ziyaret edin.
• Head Rush Ajax, Brett McLaughlin (O'Reilly Media, Inc., Mart 2006): Bu makaledeki
fikirleri Head First yöntemiyle öğrenin.
• Java and XML, İkinci Basım, Brett McLaughlin (Ağustos 2001, O'Reilly Media, Inc.):
Yazarın, XHTML ve XML dönüşümleriyle ilgili düşüncelerini okuyun.
• JavaScript: The Definitive Guide, David Flanagan (Kasım 2001, O'Reilly Media,
Inc.): JavaScript ve dinamik Web sayfalarıyla çalışmaya ilişkin kapsamlı yönergeleri
inceleyin. Yayınlanacak olan yeni basımda Ajax ile ilgili iki yeni bölüm vardır.
• Head First HTML with CSS & XHTML, Elizabeth ve Eric Freeman (Aralık 2005,
O'Reilly Media, Inc.): Standartlaşmış HTML ve XHTML ve CSS'yi HTML'ye
uygulamayla ilgili daha fazla bilgi öğrenin.
Düzey: Orta
12 Eylül 2006
Etkileşimli Ajax uygulamaları oluşturmak için Belge Nesne Modeli (DOM) ile JavaScript'i
birleştirin. Bu dizinin önceki makalelerinde DOM programlamasıyla ilgili kavramları
incelediniz (Web tarayıcısının bir Web sayfasını ağaç olarak nasıl görüntülediği gibi) ve şimdi
DOM içinde kullanılan programlama yapılarını anlıyor olmalısınız. Bu makalede, tüm bu
bilgileri uygulamaya geçirecek ve bazı hoş etkilere sahip basit bir Web sayfası
oluşturacaksınız. Oluşturulan tüm öğeler DOM'yi kullanmak üzere JavaScript ile, sayfanın
yeniden yüklenmesini ya da yenilenmesini gerektirmeden oluşturulacak.
Belge Nesne Modeli ya da DOM'nin tanıtımıyla ilgili iki tam makale okudunuz; şimdiye
kadar DOM'nin nasıl çalıştığını anlamışsınızdır. (İlk iki DOM makalesine ve Ajax dizisindeki
önceki makalelere ilişkin bağlantıları görmek için Kaynaklar bölümüne bakın.) Bu makalede,
anladıklarınızı uygulamaya geçireceğiz. Kullanıcı işlemlerine göre değişen bir kullanıcı
arabirimine sahip, temel bir Web uygulaması geliştireceksiniz -- elbette, bu arabirimi
değiştirme işlemi için DOM'yi kullanacaksınız. Bu makaleyi bitirdiğinizde, DOM ile ilgili
öğrendiğiniz tekniklerin ve kavramların çoğunu uygulamaya koyacaksınız.
Çok temel bir uygulama oluşturup daha sonra biraz da DOM büyüsü ekleyerek iş başlayalım.
DOM'nin Web sayfasındaki öğeleri bir form sunmadan hareket ettirebildiği düşüncesini -- bu
nedenle de mükemmel bir Ajax yardımcısı olduğunu -- aklınızdan çıkarmadan, yalnızca bir
silindir şapka ve Hocus Pocus! etiketli bir düğmenin bulunduğu basit bir sayfa oluşturalım.
(Bunun nereye gideceğini tahmin edebiliyor musunuz?)
İlk HTML
Liste 1'de bu sayfaya ilişkin HTML gösterilmektedir; bu yalnızca basit bir resim ve
basabileceğiniz bir düğme ile birlikte başlık ve formdan oluşan bir gövdedir.
<body>
Burada herhangi bir zorluk yok; sayfayı açtığınızda Şekil 1'dekine benzer bir görüntü
görmeniz gerekir.
Burada dikkat etmeniz gereken önemli bir nokta, Liste 1 ve Şekil 1'deki düğmenin button
tipinde olduğu, bir gönderme düğmesi olmadığıdır. Bir gönderme düğmesi kullanırsanız,
düğmeye basıldığında tarayıcı formu göndermeyi dener; elbette, formda action özniteliği
olmadığından (özellikle eklenmemiştir), etkinlik olmayan sonsuz bir döngü başlatır. (Neler
olup biteceğini görmek için bunu kendi başınıza denemelisiniz.) Normal bir giriş düğmesi
kullanarak -- ve gönderme düğmesi kullanmayarak -- düğmeye bir JavaScript işlevi
bağlayabilir ve tarayıcıyla formu göndermeden etkileşime geçebilirsiniz.
Şimdi, Web sayfasını biraz JavaScript, DOM ve biraz da resim büyüsüyle güzelleştirelim.
Açıkçası, tavşan yoksa sihirli bir şapkanın pek bir değeri de olmaz. Bu yüzden, var olan
sayfadaki resmi (yeniden Şekil 1'e bakın) Şekil 2'de gösterilen gibi bir tavşan resmiyle
değiştirerek işe başlayın.
Biraz DOM ustalığı kullanmak için ilk olarak Web sayfasında img öğesini gösteren DOM
düğümünü arayın. Genel olarak bunu yapmanın en kolay yolu, Web sayfasını belirten
document nesnesindeki getElementById() yönteminin kullanılmasıdır. Bu yöntemi daha
önce görmüştünüz; bu yöntem aşağıdaki gibi çalışır:
Bu oldukça temel bir JavaScript kodudur, ancak HTML'nizde biraz çalışma gerektirir:
Erişmek istediğiniz öğeye bir id özniteliği eklemelisiniz. Örnekte değiştirmek istediğiniz img
öğesi olduğu için (tavşanın bulunduğu yeni resim ile değiştirilecek), HTML'nizi Liste 2'de
gösterilen şekilde değiştirmeniz gerekir.
Sayfayı yeniden yüklerseniz (ya da yeniden açarsanız) farklı hiçbir şey görmezsiniz; id
özniteliğinin eklenmesi Web sayfasında görsel hiçbir değişikliğe neden olmaz. Ancak,
JavaScript ve DOM'yi kullanarak bir öğe üzerinde daha kolay çalışmaya olanak tanır.
</head>
<body>
<h1 align="center">Welcome to the DOM Magic Shop!</h1>
<form name="magic-hat">
<p align="center">
</html>
İstediğiniz değişikliği iki yolla yapabilirsiniz: Zor yol ve kolay yol. Tüm iyi programcılar gibi
ben de kolay yolu tercih ederim; ancak, uzun yoldan yürümek sizin için harika bir DOM
alıştırması olacaktır ve kesinlikle zaman harcadığınıza değecektir. Önce zor yoldan resmi
nasıl değiştirebileceğimize bakalım; daha sonra, aynı değişikliği kolay yoldan nasıl
yapabileceğinizi göreceksiniz.
Var olan resmi, tavşanın bulunduğu yeni resimle değiştirmek için yapmanız gerekenler
şunlardır:
Son iki makalemden de hatırlayacağınız gibi, DOM ile ilgili hemen hemen her şeyin
anahtarıdocument nesnesidir. Bu nesne, tüm bir Web sayfasını temsil eder,
getElementById() gibi güçlü yöntemlere erişmenizi sağlar ve yeni düğümler oluşturmanıza
olanak tanır. Şimdi kullanmak isteyeceğiniz de bu son özelliktir.
Tam olarak söylersek, yeni bir img öğesi yaratmanız gerekir. DOM içinde her şeyin bir
düğüm olduğunu, ancak düğümlerin de üç temel gruba ayrıldığını unutmayın:
• Öğeler
• Öznitelikler
• Metin düğümleri
Bu, element tipinde, img öğe adıyla yeni bir düğüm oluşturur. HTML'de bu temel olarak
şöyledir:
<img />
İçerik açısından img öğesi, boş bir öğedir. Ancak, bir öznitelik eklemeniz gerekir: Yüklenecek
resmi belirten src özniteliği. Burada addAttribute() gibi bir yöntem kullanmanız
gerektiğini düşünebilirsiniz, ancak bu doğru değil. DOM belirtimini oluşturanlar,
programcılar olarak bizlerinkısayollardan hoşlanacağımızı düşündüler (ki gerçekten
kısayolları severiz!) ve yeni öznitelikleri eklemek ve var olanların değerini değiştirmek için
tek bir yöntem oluşturdular: setAttribute().
setAttribute() yöntemini çağırır ve var olan bir öznitelik sağlarsanız, değeri sağladığınız
değerle değiştirilir. Ancak, setAttribute() yöntemini çağırır ve var olmayan bir öznitelik
sağlarsanız, DOM sağladığınız değeri kullanarak sessizce bu özniteliği ekler. Bir yöntem, iki
amaç! JavaScript'inize şunları eklemeniz gerekir:
Bu, resmi oluşturur ve kaynağını uygun şekilde ayarlar. Bu noktada, HTML'niz Liste 4'teki
gibi görünür.
<html>
<head>
<title>Magic Hat</title>
<script language="JavaScript">
function showRabbit() {
var hatImage = document.getElementById("topHat");
var newImage = document.createElement("img");
newImage.setAttribute("src", "rabbit-hat.gif");
}
</script>
</head>
<body>
<h1 align="center">Welcome to the DOM Magic Shop!</h1>
<form name="magic-hat">
<p align="center">
</html>
Artık yerleştirilmeye hazır bir resminiz olduğuna göre, bunun yerleştirileceği yere ihtiyacınız
var. Ancak, bunu var olan resme yerleştirmeyeceksiniz; bunun yerine, yeni resmi var olan
resmin önüne koymak ve daha sonra var olan resmi kaldırmak isteyebilirsiniz. Bunu yapmak
için, tüm bu yerleştirme ve kaldırma işlemlerinde gerçekten anahtar role sahip, var olan
resmin üst öğesi gereklidir.
Önceki makalelerden de hatırlayacağınız gibi DOM, bir Web sayfasını gerçekten de bir ağaç
gibi, düğüm hiyerarşisi içinde görür. Her düğümün bir üst öğesi (düğümün alt öğe olduğu
ağaçtaki bir üst düğüm) ve büyük olasılıkla kendi alt öğeleri vardır. Bu resim örneğindealt öğe
yoktur -- resimlerin boş öğeler olduklarını hatırlayın -- ancak kesinlikle bir üst öğe vardır. Üst
öğenin ne olduğu hiç önemli değil; yalnızca bu öğeye erişmeniz gerekir.
Bunu yapmak için her DOM düğümünde olan parentNode özelliğini kullanabilirsiniz:
Bu kadar basit! Üst öğenin alt öğeleri olabileceğini biliyorsunuz, çünkü zaten bir alt öğesi var:
Eski resim. Bunun ötesinde, üst öğenin bir div, p ya da sayfanın body öğesi mi olduğunu
bilmeniz gerekmez; bu önemli değildir!
Eski resmin üst öğesine eriştiğinize göre, yeni resmi ekleyebilirsiniz. Bu oldukça kolay bir
işlemdir; bir alt öğe eklemek için birkaç yöntem kullanabilirsiniz:
• insertBefore(newNode, oldNode)
• appendChild(newNode)
Yeni resmin tam olarak eski resimle aynı yerde görünmesini istediğiniz için insertBefore()
yöntemini (ve removeChild() yöntemini) kullanmanız gerekir. Yeni resim öğesini var olan
resmin hemen önüne yerleştirmek için kullanacağınız JavaScript satırı şöyledir:
Bu noktada, eski resmin üst öğesinin iki alt resmi vardır: Yeni resim ve hemen ardından gelen
eski resim. Bu resimlerin çevresindeki içeriğin değişmediğini ve bu içeriğin sırasının, tam
olarak ekleme işleminden önceki sırada kaldığını belirtmek gerekir. Yalnızca üst öğenin artık
eski resmin önünde bir ek alt öğesi (yeni resim) daha vardır.
Web sayfasında yalnızca yeni resmi istediğiniz için şimdi yapmanız gereken eski resmi
kaldırmaktır. Eski resim öğesinin üst öğesine erişiminiz olduğu için bu kolay olacaktır.
removeChild() yöntemini çağırıp bunu kaldırmak istediğiniz düğüme geçirebilirsiniz:
Bu noktada, eski resmi yenisiyle değiştirdiniz. HTML'niz Liste 5'teki gibi görünmelidir.
</head>
<body>
<h1 align="center">Welcome to the DOM Magic Shop!</h1>
<form name="magic-hat">
<p align="center">
</html>
JavaScript'in bağlanması
Son -- ve belki de en kolay -- adım olarak, HTML formunuzu, az önce yazdığınız JavaScript
işlevine bağlarsınız. showRabbit() işlevinin, kullanıcının Hocus Pocus! düğmesini her
tıklatmasında çalışmasını istiyorsunuz. Bunu gerçekleştirmek için HTML'nize basit bir
onClick olay işleyicisi ekleyin:
Resmi değiştirmek için uyguladığınız adımlara dönüp bakar ve daha sonra, düğümler üzerinde
gerçekleştirebileceğiniz çeşitli yöntemleri gözden geçirirseniz, replaceNode() adlı bir
Bu çok büyük bir şey gibi görünmeyebilir, ancak kesinlikle kodunuzu basitleştirir. Liste 6'da,
insertBefore() yöntemini kaldırarak ve removeChild() yöntemini çağırarak bu değişikliği
nasıl yapacağınız gösterilmektedir.
}
</script>
</head>
<body>
<h1 align="center">Welcome to the DOM Magic Shop!</h1>
<form name="magic-hat">
<p align="center">
<img src="topHat.gif" id="topHat" />
<br /><br />
<input type="button" value="Hocus Pocus!" onClick="showRabbit();" />
</p>
</form>
</body>
</html>
Az önce de belirttiğim gibi bir görevi gerçekleştirmek için hemen her zaman daha kolay bir
yol olduğu için, şimdi şapka resmini tavşan resmiyle değiştirmenin çok daha kolay yolunu
göstereceğim. Bu makale üzerinde çalışırken bu yaklaşımın ne olduğunu anlayabildiniz mi?
Size bir ipucu vereyim: Özniteliklerle ilgili bir şey.
Resim öğesinin büyük oranda, bir yerlerdeki (bir yerel URI ya da bir dış URL) bir dosyaya
başvuruda bulunan src özniteliği tarafından denetlendiğini hatırlayın. Şimdiye kadar, resim
düğümünü yeni bir resimle değiştirdiniz; ancak yalnızca var olan resmin src özniteliğini
değiştirmek çok daha kolaydır! Bu, yeni düğüm oluşturma, üst öğeyi bulma ve eski düğümü
değiştirme ile ilgili tüm adımları tek bir adıma indirir:
hatImage.setAttribute("src", "rabbit-hat.gif");
Hepsi bu! Bu çözümü tüm Web sayfası bağlamında gösteren Liste 7'ye bakın.
}
</script>
</head>
<body>
<h1 align="center">Welcome to the DOM Magic Shop!</h1>
<form name="magic-hat">
<p align="center">
<img src="topHat.gif" id="topHat" />
<br /><br />
<input type="button" value="Hocus Pocus!" onClick="showRabbit();" />
</p>
</form>
</body>
</html>
Tavşanın gizlenmesi
Şu anda Web sayfası oldukça etkileyici, ancak hala biraz ilkel durumda. Tavşan şapkadan
çıkıyor, ancak ekranın altındaki düğmede tavşan çıktıktan sonra da Hocus Pocus! yazmaya ve
düğme, showRabbit() işlevini çağırmaya devam ediyor. Bu, tavşan çıktıktan sonra düğmeyi
tıklatırsanız, boşuna zaman harcayacağınız anlamına gelir. Daha da önemlisi, bu hiçbir işe
yaramaz ve yararsız düğmeler hiçbir zaman iyi bir şey değildir. Birkaç değişiklik daha
yapmak ve tavşan ister şapkanın içinde ister dışında olsun düğmenin yararlı olmasını
sağlamak için DOM'yi kullanıp kullanamayacağınızı görelim.
</head>
<body>
<h1 align="center">Welcome to the DOM Magic Shop!</h1>
<form name="magic-hat">
<p align="center">
</html>
function showRabbit() {
var hatImage = document.getElementById("topHat");
hatImage.setAttribute("src", "rabbit-hat.gif");
var button = document.getElementById("hocusPocus");
}
Elbette, düğme etiketinin değerini değiştirmek için bir sonraki JavaScript'in satırını çoktan
yazmış olabilirsiniz. Burada yine setAttribute() yöntemi gündeme gelir:
function showRabbit() {
var hatImage = document.getElementById("topHat");
hatImage.setAttribute("src", "rabbit-hat.gif");
var button = document.getElementById("hocusPocus");
button.setAttribute("value", "Get back in that hat!");
}
Bu basit DOM çalışmasıyla, tavşan ortaya çıkar çıkmaz düğmenin etiketi değişir. Bu noktada,
HTML'niz ve tamamlanmış showRabbit() işleviniz Liste 9'daki gibi görünmelidir.
</head>
<body>
<h1 align="center">Welcome to the DOM Magic Shop!</h1>
<form name="magic-hat">
<p align="center">
</html>
Yeni düğme etiketinden de tahmin edeceğiniz gibi, tavşanın şapkaya geri girmesinin zamanı
geldi. Aslında bu, tavşanı çıkarmak için yaptığınız işlemleri tersine çevirmenizle aynı süreçtir:
Resmin src özniteliği yeniden eski resme değiştirilir. Bunu yapmak için yeni bir JavaScript
işlevi oluşturun:
function hideRabbit() {
var hatImage = document.getElementById("topHat");
hatImage.setAttribute("src", "topHat.gif");
var button = document.getElementById("hocusPocus");
button.setAttribute("value", "Hocus Pocus!");
}
Bu, gerçekten de showRabbit() işlevinin yaptığı her şeyi tersine çevirmektir. Resmi eski,
tavşansız şapkaya ayarlayın, düğmeyi alın ve etiketini yeniden Hocus Pocus! olarak
değiştirin.
Örnek uygulamanın bu noktada önemli bir sorunu vardır: Düğmenin etiketi değişir, ancak
düğmeyi tıkladığınızda gerçekleşen işlem değişmez. Neyse ki, DOM'yi kullanarak kullanıcı
düğmeyi tıklattığında gerçekleşen işlemi değiştirebilirsiniz. Dolayısıyla, düğmede Get back
in that hat! yazıyorsa, kullanıcı düğmeyi tıkladığında hideRabbit() işlevinin çalışmasını
istiyorsunuz demektir. Bunun tersine, tavşan gizlendiğinde, düğme showRabbit() işlevini
çalıştırır.
addEventHandler() yöntemini
kullanmakta kaçının
Ancak ufak bir nokta vardır: onclick özelliğinin bir işlev başvurusuyla beslenmesi gerekir --
işlevin dize adı değil, işlevin kendisine bir başvuru gereklidir. JavaScript'te, bir işleve
parantez kullanmadan, adıyla başvuruda bulunabilirsiniz. Bir düğme tıklatıldığında çalışan
işlevi aşağıdaki şekilde değiştirebilirsiniz:
button.onclick = myFunction;
function hideRabbit() {
var hatImage = document.getElementById("topHat");
hatImage.setAttribute("src", "topHat.gif");
var button = document.getElementById("hocusPocus");
button.setAttribute("value", "Hocus Pocus!");
button.onclick = showRabbit;
}
</script>
</head>
<body>
<form name="magic-hat">
<p align="center">
<img src="topHat.gif" id="topHat" />
<br /><br />
<input type="button" value="Hocus Pocus!" id="hocusPocus"
onClick="showRabbit();" />
</p>
</form>
</body>
</html>
Sonuç
Bu noktada, DOM ile rahatça çalışabiliyor olmanız gerekir. Önceki makalelerde, DOM ile
çalışmaya ilişkin temel kavramları görmüş ve API'ye ayrıntılı bir şekilde bakmıştınız; şimdi
DOM tabanlı basit bir uygulamayla çalıştınız. Bu makale üzerinde durun ve kendiniz
çevrimiçi denemeler yapın.
Bu makale, bu dizinin özellikle Belge Nesne Modeli konusuna odaklanan son makalesi
olmasına rağmen, DOM ile okuyacağınız son yazı değildir. Aslında, en azından bir dereceye
kadar DOM'yi kullanmadan Ajax ve JavaScript dünyalarında fazla bir şey yapmakta
zorlanırsınız. İster karmaşık vurgulama ve hareket etkileri oluşturun, ister yalnızca metin
blokları ve resimlerle uğraşın, DOM size kullanımı gerçekten kolay bir yöntemle bir Web
sayfasına erişim sağlar.
Yüklemeler
Karşıdan
Açıklama Ad Boyut yükleme
yöntemi
Yalnızca örnekteki grafikler wa-ajaxintro6/ajax_6-images_download.zip 91 KBHTTP
HTML ve grafiklerin bulunduğu
wa-ajaxintro6/ajax_6-complete_examples.zip93 KBHTTP
tam örnek
Bilgi Edinme
• Exploiting DOM for Web response (Web yanıtı için DOM'yi kullanma) ve Advanced
requests and responses in Ajax (Ajax'ta gelişmiş istekler ve yanıtlar): DOM
programlamasıyla ilgili bu dizinin birinci ve ikinci makalelerini okuyun ya da
Mastering Ajax (Ajax'ta Uzmanlaşma) dizisinin tamamına bakın.
• "Java object serialization for Ajax" (Philip McCarthy, developerWorks, Ekim 2005):
Ağ üzerinden nesne gönderme ve Ajax ile etkileşimde bulunma konularını Java bakış
açısıyla inceler.
• "Call SOAP Web services with Ajax" (James Snell, developerWorks, Ekim 2005):
Ajax'ın var olan SOAP tabanlı Web hizmetleriyle bütünleştirilmesine ilişkin bu ileri
düzey makaleyi inceleyin; Ajax tasarım şablonunu kullanarak Web tarayıcısı tabanlı
SOAP hizmetleri istemcisini nasıl uygulayacağınızı gösterir.
• World Wide Web Consortium'daki DOM Ana Sayfası: DOM ile ilgili her şeyin
başlangıç noktasını ziyaret edin.
• "Ajax: A new approach to Web applications" (Jesse James Garrett , Adaptive Path,
Şubat 2005): Ajax moniker teriminin ilk kez kullanıldığı bu makaleyi okuyun -- tüm
Ajax geliştiricileri bu makaleyi okumalıdır.
• Head Rush Ajax, Brett McLaughlin (O'Reilly Media, 2006): Bu makaledeki fikirleri
Head First yöntemiyle öğrenin.
• Java and XML, Second Edition (Brett McLaughlin, O'Reilly Media, Inc., 2001):
Yazarın XHTML ve XML dönüşümleriyle ilgili görüşlerini okuyun.
• Head First HTML with CSS & XHTML (Elizabeth and Eric Freeman, O'Reilly Media,
Inc., 2005): Standartlaşmış HTML ve XHTML ve CSS'yi HTML'ye uygulamayla
ilgili daha fazla bilgi öğrenin.
Düzey: Orta
10 Ekim 2006
Sıradan Ajax geliştiricileri bile Ajax içindeki x harfini ve bunun XML anlamına geldiğini fark
edecektir. XML, her tür programlama ortamındaki en yaygın veri biçimlerinden biridir ve
zamanuyumsuz uygulamalarda sunucu yanıtları açısından gerçek avantajlar sunar. Bu
makalede, sunucuların bir isteğe yanıt verirken nasıl XML gönderdiklerini görürsünüz.
Ancak, bu düşünce, teknik gerçeklikten çok, Ajax uygulamalarında kullanılan temel nesneler
için yapılan kötü ad seçimlerini yansıtmaktadır (XMLHttpRequest). Diğer bir deyişle, çoğu
kişi, XMLHttpRequest nesnesinin her zaman XML kullandığını varsaydıklarından, XML'in
Ajax'ın temel bir parçası olduğunu düşünürler. Ancak durum böyle değildir ve bunun
nedenleri, bu makalenin birinci bölümünün konusudur. Aslında, Ajax uygulamalarının
çoğunda, XML'in çok nadiren göründüğünü fark edeceksiniz.
Bir teknolojiyle ilgili olabilecek en kötü şeylerden birisi, teknolojinin çok popüler olması ve
temel parçalarını değiştirmenin imkansız hale gelmesidir. Ajax uygulamalarındaki temel
nesnelerden biri olan XMLHttpRequest için de durum böyledir. Bakıldığında, HTTP istekleri
üzerinden XML göndermek ya da bir çeşit XML biçiminde HTTP istekleri göndermek için
tasarlanmış gibi görünür. Adının ne ima ettiğine bakmadan, nesnesinin asıl yaptığı şey, bir
HTTP isteği göndermek için istemci kodunuza (genellikle Web sayfanızdaki JavaScript) bir
yol sağlamasıdır. Hepsi bu kadar; yaptığı başka bir şey yoktur.
Başka bir yaygın hata da XML'in sahne arkasında bir şekilde kullanıldığını düşünmektir --
dürüst olmak gerekirse, eskiden ben de böyle düşünürdüm! Ancak, bu görüş, teknolojiyi
anlama açısından zayıflığımızı da gösterir. Bir kullanıcı tarayıcısını açıp sunucudaki bir Web
sayfası için istekte bulunmak üzere http://www.google.com ya da
http://www.headfirstlabs.com gibi şeyler yazar. http:// kısmını yazmasa bile tarayıcı,
tarayıcı adres çubuğundaki bu parçayı doldurur. Bu birinci parça -- http:// -- iletişim nasıl
oluştuğuyla ilgili, anlaşılması çok da zor olmayan bir ipucu sağlar: Hypertext Transfer
Protocol (Bağlantılı Metin Aktarımı İletişim Kuralı) yoluyla. Sunucuyla iletişim kurmak için
Web sayfanıza bir kod yazdığınızda, bu ister Ajax, ister normal biçimli bir POST, ister bir
metin bağlantısı kullansın, söz konusu olan HTTP'dir.
Tarayıcılar ve sunucular arasındaki tüm Web iletişiminin büyük bir kısmının HTTP üzerinden
olduğunu bildiğimizde, XMLHttpRequest tarafından gizli bir biçimde kullanılan aktarım ya da
teknolojinin XML olduğu düşüncesi çok da anlamlı olmaz. XML kesinlikle HTTP isteği
içinde gönderilebilir, ancak HTTP, çok net bir şekilde tanımlanmış bir standarttır ve yakın bir
zamanda da herhangi bir şekilde ortadan kalkacak gibi görünmemektedir. İsteğinizde özel
olarak XML kullanmıyorsanız ya da sunucu, yanıtı size XML biçiminde göndermiyorsa,
XMLHttpRequest nesnesinde düz eski HTTP'yi kullanmaktan başka yapmanız gereken bir şey
yoktur. Birisi size bir daha "Evet, buna XMLHttpRequest denmesinin nedeni, arkada XML
kullanmasıdır" dediğinde yalnızca gülümseyin ve sabırlı bir şekilde onlara HTTP'nin ne
olduğunu ve XML'in HTTP üzerinden gönderilebildiğini, ancak XML'in bir veri biçimi
olduğunu, bir aktarım iletişim kuralı olmadığını anlatın.
Şimdiye kadar size XML'in Ajax içinde kullanılmadığı yerlerden söz ettim. Ancak, Ajax
içindeki x ve XMLHttpRequest içindeki XML gerçekliğini devam ettiriyor ve Web
uygulamalarında XML kullanmak için birkaç seçeneğiniz var. Bu bölümde temel seçeneklere
bakacak ve bu makalenin geri kalanında, bu konuda gerçekten ayrıntıya gireceksiniz.
XML seçenekleri
Bunlardan birincisi -- XML biçiminde bir istek gönderme -- isteğinizi, API kullanarak ya da
yalnızca metin dizeleri oluşturarak, XML formatında sunucuya göndermenizi gerektirir. Bu
seçenekte, eldeki ana iş, isteğin XML kurallarıyla uyumlu ve sunucunun anlayabileceği bir
şekilde oluşturulmasıdır. Dolayısıyla, gerçekten XML biçimine odaklanmanız gerekir;
göndermek istediğiniz veriler elinizdedir ve tüm yapmanız gereken, bunları XML
semantiğiyle hazırlamaktır. Bu makalenin geri kalanı, Ajax uygulamalarınızda XML'in bu
kullanımı üzerinde odaklanır.
Bu seçeneklerin ikincisi -- XML biçiminde bir istek alma -- sunucudan bir yanıt almanızı ve
verileri XML'den çıkarmanızı gerektirir (yine bir API kullanarak ya da biraz kaba kuvvet
yaklaşımıyla). Bu durumda, sunucudan gelen veriler üzerinde odaklanırsınız ve verileri,
yapıcı bir şekilde kullanmak için XML'den çekip çıkarmanız gerekir. Bu dizinin bir sonraki
makalesinin konusu da budur ve o zaman bu konu ayrıntılarıyla ele alınacaktır.
Bir masaüstü uygulaması gibi çalışan parlak ve hızlı bir uygulama yazmak istiyorsanız, XML,
başlamak için en iyi nokta olmayabilir. Düz metinle başlayıp, XML için belirli bir
gereksinimle karşılaşırsanız, bu harikadır; ancak, en baştan XML kullanırsanız,
uygulamanızın yanıt verebilirliğini yavaşlatmanız neredeyse kesin bir sonuçtur. Çoğu
durumda, düz metni göndermek -- name=jennifer gibi ad/değer çiftlerini kullanmak -- metni,
aşağıdaki gibi XML'e çevirmekten daha hızlı olacaktır:
<name>jennifer</name>
XML'in zaman kaybettirdiği tüm yerleri bir düşünün: Metnin XML olarak hazırlanması;
fazladan bilgilerin gönderilmesi (dikkat ederseniz çevre öğeleri, XML üstbilgisini ya da daha
gerçekçi bir isteğin parçası olabilecek başka şeyleri belirtmedim); sunucunun XML'i
ayrıştırması, bir yanıt oluşturulması, yanıtın yeniden XML olarak hazırlanması ve Web
sayfanıza geri gönderilmesi; son olarak yanıtın sayfanızda ayrıştırılması ve verilerin
kullanılması. Dolayısıyla, XML'i ne zaman kullanacağınızı öğrenin, ancak birçok durumda
uygulamanızı daha hızlı yapacağını düşünerek uygulamanızı oluşturmaya XML'den
başlamayın; XML, daha çok, birazdan da sözünü edeceğimiz gibi esneklik sağlar.
XML'i, bir istemciden sunucuya veri göndermek için kullanılan format olarak ele alalım.
Öncelikle, bunun teknik açıdan nasıl yapılacağını görecek, daha sonra da bunun ne zaman iyi
bir fikir olduğu ve ne zaman olmadığı üzerinde duracağız.
firstName=Larry
lastName=Gullahorn
street=9018 Heatherhorn Drive
city=Rowlett
state=Texas
zipCode=75080
Bunun gibi veriler için biçim olarak XML kullanmayı istiyorsanız, yapmanız gereken ilk şey
verileri saklamak için temel XML biçimini kullanmak olacaktır. Ad/değer çiftlerinizin tümü
XML öğelerine dönüştürülebilir; burada, öğe adı çiftin adı ve öğenin içeriği de değer olur:
<firstName>Larry</firstName>
<lastName>Gullahorn</lastName>
<street>9018 Heatherhorn Drive</street>
<city>Rowlett</city>
<state>Texas</state>
<zipCode>75080</zipCode>
Elbette, XML bir kök öğenizin ya da yalnızca bir belge parçasıyla çalışıyorsanız (XML
belgesinin bir parçası) çevreleyen bir öğenin olmasını gerektirir. Dolayısıyla, yukarıdaki
XML'i aşağıdaki gibi bir koda dönüştürebilirsiniz:
<address>
<firstName>Larry</firstName>
<lastName>Gullahorn</lastName>
<street>9018 Heatherhorn Drive</street>
Sözlü iletişim
Aslında, XML biçiminde gönderdiğiniz verilerin doğru olarak alındığından emin olmak için
gerçekleştirmeniz gereken iki adım vardır:
1. XML'i gönderdiğiniz komut dosyasının veri biçimi olarak XML'i kabul ettiğinden
emin olun.
2. Komut dosyasının, verilerinizi gönderdiğiniz belirli XML biçimini ve yapısını kabul
ettiğinden emin olun.
Bunların ikisi de gerçekten bir insanla konuşmanızı gerektirebilir, sizi bu konuda uyarıyorum!
XML olarak veri gönderebilmeniz önem taşıyorsa, komut dosyası yazarlarının çoğu size
iyilikte bulunur; bu nedenle, XML kabul edecek bir komut dosyası bulmak çok da zor
değildir. Yine de, kullandığınız biçimin komut dosyasının beklediği biçimle eşleştiğinden
emin olmanız gerekir. Örneğin, sunucunun aşağıdaki gibi verileri kabul ettiğini düşünün:
<profile>
<firstName>Larry</firstName>
<lastName>Gullahorn</lastName>
<street>9018 Heatherhorn Drive</street>
<city>Rowlett</city>
<state>Texas</state>
<zip-code>75080</zip-code>
</profile>
1. İstemciden gelen XML bir address öğesi içinde olmasına rağmen sunucu, verilerin
bir profile öğesi içinde bulunmasını beklemektedir.
2. İstemciden gelen XML zipCode öğesini kullanır, ancak sunucu, posta kodunun bir
zip-code öğesinde olmasını beklemektedir.
Büyük bir sistem içinde bu gerçekten küçük noktalar, verilerinizi kabul eden ve işleyen
sunucu ile kötü bir şekilde çöken ve Web sayfanıza -- ve büyük olasılıkla kullanıcılara --
şifreli bir hata iletisi veren sunucu arasındaki farkı oluşturur. Bu nedenle, sunucunun neyi
Bu kodun çoğu, üzerinde durulmaya değer birkaç nokta dışında, kendi kendini açıklar
niteliktedir. Birincisi, isteğinizdeki verilerin el ile XML olarak biçimlendirilmesi gerekir.
Belge Nesne Modeli'nin (DOM) kullanımına ilişkin üç makaleden sonra bu biraz hayal
kırıklığına neden olmuştur sanırım, değil mi? Hiçbir şey JavaScript kullanan bir XML
belgesini oluştururken DOM kullanmanızı engellemez; bu durumda, GET ya da POST
isteğiyle ağ üzerinden göndermeden önce DOM nesnesini metne dönüştürmeniz gerekir. Bu
XML'inizi oluşturduktan sonra, büyük oranda metni gönderirken açtığınıza benzer bir
bağlantı açarsınız. Bazı tarayıcılar GET sorgu dizelerine uzunluk sınırlaması getirdiği ve
XML de oldukça uzun olabildiği için ben, XML için POST isteklerini kullanmayı tercih
ediyorum; Liste 2'de GET isteğinden uygun şekilde POST isteğine nasıl geçildiğini
görebilirsiniz. Ayrıca, istekte bulunduğunuz URL'nin sonuna eklenen bir parametre olarak
gönderilmek yerine XML, send() yöntemiyle gönderilir. Bunların tümü oldukça küçük
farklılıklardır ve ayarlanmaları kolaydır.
xmlHttp.setRequestHeader("Content-Type", "text/xml");
Bunu anlamak çok da zor değil: Yalnızca sunucuya düz eski ad/değer çiftleri göndermek
yerine XML gönderdiğinizi belirtir. Her iki durumda da verileri metin olarak gönderirsiniz,
ancak burada text/xml olarak kullanırken, diğerinde gönderilen XML düz metin olarak
kullanılır. Az önce ad/değer çiftlerini kullandıysanız bu satır şöyle okunur:
xmlHttp.setRequestHeader("Content-Type", "text/plain");
Bunların hepsini bir araya getirdikten sonra, yapmanız gereken tek şey send() yöntemini
çağırmak ve XML dizesini geçirmektir. Sunucu XML isteğinizi alır ve (ön çalışmanızı
yaptığınızı varsayarak) XML'i kabul eder, ayrıştırır ve size bir yanıt gönderir. Her şey bundan
ibarettir -- birkaç kod değişikliği yapılmış XML istekleri.
XML yanıtları için XML isteklerini (ve bu makaleyi) terk etmeden önce, isteklerinizdeki
XML kullanımının hassasiyeti üzerinde biraz duralım. XML'in aktarım açısından hiçbir
şekilde en hızlı veri biçimi olmadığından söz etmiştim, ancak üzerinde düşünülmesi gereken
daha birçok nokta var.
Fark etmeniz gereken ilk şey, XML'in isteklerde kullanmak üzere kolayca oluşturabileceğiniz
bir şey olmadığıdır. Liste 2'de gördüğünüz gibi verileriniz, XML semantiğiyle hızlı bir şekilde
karmaşıklaşabilir:
Bu çok kötü görünmeyebilir, ancak bunun yalnızca altı alanı olan bir XML parçası olduğu da
unutulmamalıdır. Geliştireceğiniz Web formlarının çoğunda 10 - 15 arasında alan olacaktır;
tüm isteklerinizde Ajax kullanmasanız da, bu noktayı göz önünde bulundurun. En azından
gerçek verilerle harcadığınız kadar zamanı köşeli ayraçlarla ve biçim imi adlarıyla harcarsınız
ve küçük hatalar yapma olasılığınız oldukça yüksektir.
Buradaki başka bir sorun da -- önceden de belirttiğim gibi -- bu XML'i el ile oluşturmanız
gerektiğidir. Bir DOM nesnesini, istek olarak gönderebileceğiniz bir dizeye dönüştürmek için
iyi ve basit yöntemler olmadığı için DOM'nin kullanılması iyi bir seçenek değildir. Bu
nedenle, bunun gibi dizelerle çalışmak en iyisidir -- ancak bu, aynı zamanda yeni geliştiriciler
için gerçekleştirilmesi ve anlaşılması en zor seçenektir. Bu örnekte, tüm XML'i tek bir satırda
oluşturdunuz; bunu birkaç adımda yaptığınızda her şey daha karmaşıklaşır.
Karmaşıklık sorununun ötesinde, istekleriniz için XML kullanmak, düz metin ve ad/değer
çiftleriyle karşılaştırıldığında size gerçekten fazla avantaj (sağlayacağı herhangi bir avantaj
varsa) sağlayacak değildir. Bu makaledeki her şeyin, ad/değer çiftlerini kullanarak
gönderebileceğiniz verilerle aynı verileri almaya (Liste 1'e bakın) ve bunları XML ile
göndermeye odaklandığını düşünün. Hiçbir noktada XML ile gönderebileceğiniz bir şeyi düz
metin kullanarak gönderemeyeceğiniz belirtilmedi; bunun nedeni, hemen hemen hiçbir zaman
XML kullanarak gönderebileceğiniz bir şeyi düz metin kullanarak gönderememenizin söz
konusu olmamasıdır.
Ve bu, gerçekten de XML ve istekler ile ilgili ana noktadır: Çok seyrek olarak bunu
yapmanızı gerektirecek bir durumla karşılaşırsınız. Bu dizinin bir sonraki makalesinde, bir
sunucunun düz metin kullanarak yaparken çok zorlanacağı bazı şeyleri yapmak için XML
kullanabileceğini göreceksiniz; ancak, istekler söz konusu olduğunda bu durum geçerli
değildir. Yalnızca XML kabul eden bir komut dosyasından söz etmiyorsanız (çok az da olsa
bunlardan var), hemen her istek durumunda düz metin kullanmanız daha iyi olacaktır.
Sonuç
Bu dizinin bir sonraki makalesinde, sunucuların XML kullanarak nasıl yanıt verdiklerini ve
Web uygulamalarınızın bu yanıtları nasıl işleyebildiklerini göreceksiniz. Neyse ki, bir
sunucunun Web uygulamasına XML göndermesi için, bunun tam tersinden daha çok sayıda
neden vardır; bu yüzden, o makalenin teknik ayrıntılarını daha fazla kullanacaksınız; şimdilik,
XML'in neden her zaman harika bir fikir olmadığını (en azından istekleri gönderirken)
anladığınızdan emin olun. İsteklere ilişkin veri biçimi olarak XML kullanan bazı Web
uygulamalarını denemek ve gerçekleştirmek ve daha sonra düz metne dönmek ve hangisinin
sizin için daha hızlı ve kolay geldiğini belirlemek isteyebilirsiniz. Bir sonraki makaleye kadar
çevrimiçi kalın.
Kaynaklar
Bilgi Edinme
• "Java object serialization for Ajax" (Philip McCarthy, developerWorks, Ekim 2005):
Ağ üzerinden nesne gönderme ve Ajax ile etkileşimde bulunma konularını Java bakış
açısıyla inceler.
• "Call SOAP Web services with Ajax" (James Snell, developerWorks, Ekim 2005):
Ajax'ın var olan SOAP tabanlı Web hizmetleriyle bütünleştirilmesine ilişkin bu ileri
düzey makaleyi inceleyin; Ajax tasarım şablonunu kullanarak Web tarayıcısı tabanlı
SOAP hizmetleri istemcisini nasıl uygulayacağınızı gösterir.
• World Wide Web Consortium'daki DOM Ana Sayfası: DOM ile ilgili her şeyin
başlangıç noktasını ziyaret edin.
• "Ajax: A new approach to Web applications" (Jesse James Garrett , Adaptive Path,
Şubat 2005): Ajax moniker teriminin ilk kez kullanıldığı bu makaleyi okuyun -- tüm
Ajax geliştiricileri bu makaleyi okumalıdır.
• Head Rush Ajax, Brett McLaughlin (O'Reilly Media, 2006): Bu makaledeki fikirleri
Head First yöntemiyle öğrenin.
• Java and XML, Second Edition (Brett McLaughlin, O'Reilly Media, Inc., 2001):
Yazarın XHTML ve XML dönüşümleriyle ilgili görüşlerini okuyun.
• JavaScript: The Definitive Guide (David Flanagan, O'Reilly Media, Inc., 2001):
JavaScript ve dinamik Web sayfalarıyla çalışmaya ilişkin kapsamlı yönergeleri
inceleyin. Yayınlanacak olan yeni basımda Ajax ile ilgili iki yeni bölüm vardır.
• Head First HTML with CSS & XHTML (Elizabeth and Eric Freeman, O'Reilly Media,
Inc., 2005): Standartlaşmış HTML ve XHTML ve CSS'yi HTML'ye uygulamayla
ilgili daha fazla bilgi öğrenin.
Tartışma
Düzey: Orta
07 Kasım 2006
Bu dizinin son makalesinde, Ajax uygulamalarınızın sunucuya gönderilen istekleri nasıl XML
şeklinde biçimlendirebildiğini gördünüz. Çoğu durumda, bunun neden iyi bir fikir olmadığını
da okudunuz. Bu makale, genellikle daha iyi bir fikir olan bir şey üzerine odaklanır: İstemciye
XML yanıtlarının gönderilmesi.
Bir sunucudan XML yanıtı almaya ilişkin teknik ayrıntılara girmeden önce, bir sunucunun bir
isteğe yanıt olarak XML göndermesinin neden bu kadar iyi bir fikir (ve bunun, bir istemcinin
bu isteği XML olarak göndermesinden nasıl farklı) olduğunu anlamanız gerekir.
Ad/değer çiftleri gönderdiğinizde, istekleri gönderen Web tarayıcısı ve bu isteğe yanıt veren
ve bir sunucu programını barındıran platform bu ad/değer çiftlerini, bir sunucu programının
kolayca çalışabileceği verilere dönüştürmek için birlikte çalışır. Neredeyse her sunucu tarafı
teknolojisi -- Java™ sunucu uygulamalarından PHP'ye, Perl'e, Ruby on Rails'e -- bir ada
dayalı değerleri almanız için çeşitli yöntemler çağırmanızı sağlar. Dolayısıyla, name
özniteliğinin alınması önemsizdir.
Alias=6.5&Lost=14.2&Six%20Degrees=9.1
Alias|6.5|Lost|14.2|Six%20Degrees|9.1
Bu yanıt dizelerinin nasıl ayrılacağını anlamak çok zor olmasa da, bir istemcinin, noktalı
virgüllere, eşittir işaretlerine, çubuklara ve "ve" işaretlerine dayanarak dizeyi ayrıştırması ve
bölmesi gerekir. Bu, diğer geliştiricilerin kolayca anlayabileceği ve sağlayabileceği güçlü bir
kod yazmak için nadiren kullanılan bir yoldur.
XML girin
Bu sunucunun istemcilere ad/değer çiftleriyle yanıt vermesi için standart bir yol olmadığını
fark ettiğinizde, XML kullanmanın arkasında yatan mantık netleşmeye başlar. Sunucuya veri
gönderirken, sunucular ve sunucu tarafında diller çiftleri kolayca yorumlayabildiği için
ad/değer çiftleri harika birer seçimdir; istemciye veri döndürürken de XML kullanmak için
aynı şey geçerlidir. Birkaç makale önce, XML'i ayrıştırmak için DOM'nin nasıl kullanıldığını
görmüştünüz ve sonraki bir makalede XML'i ayrıştırmak için JSON'nin da başka bir seçenek
sunduğunu göreceksiniz. Hepsinin üzerinde, XML'i düz metin gibi işleyebilir ve değerleri, bu
şekilde alabilirsiniz. Dolayısıyla, bir sunucudan XML yanıtı almanın ve oldukça
standartlaşmış kodla verileri çıkarmanın ve bir istemcide kullanmanın birkaç yolu vardır.
Ek bir bonus olarak XML'in anlaşılması genellikle oldukça kolaydır. Örneğin, programlama
yapabilen kişilerin çoğu, Liste 2'deki verileri anlayabilir.
</show>
<show>
<title>Lost</title>
<rating>14.2</rating>
</show>
<show>
<title>Six Degrees</title>
<rating>9.1</rating>
</show>
</ratings>
Liste 2'de, belirli bir noktalı virgül ya da kesme işaretinin anlamıyla ilgili herhangi bir gizemli
nokta yoktur.
Bu dizinin odak noktası Ajax denkleminin istemci tarafı olduğundan, sunucu tarafındaki bir
programın yanıtı XML olarak nasıl oluşturduğu üzerinde ayrıntılı bilgi vermeyeceğim. Ancak,
istemciniz XML aldığında bazı özel konuları bilmeniz gerekir.
Birincisi, sunucudan gelen bir XML yanıtını iki temel şekilde işleyebilirsiniz:
İkincisi, örnek olsun diye bir sunucudan basit bir XML yanıtı aldığınızı varsayın. Liste 3'te
yukarıda ayrıntılı olarak verilen aynı TV listesi gösterilmektedir (aslında bu, sizin için
yeniden yazılan, Liste 2'dekiyle aynı XML'dir). Bu bölümdeki konularda bu örnek XML'i
kullanacağım.
</show>
<show>
<title>Lost</title>
<rating>14.2</rating>
</show>
<show>
<title>Six Degrees</title>
<rating>9.1</rating>
</show>
</ratings>
Bu durumda, sunucunun size XML olmayan bir yanıt gönderdiğinde yapacağınız gibi istek
nesnenizin responseText özelliğini kullanırsınız (bkz. Liste 4).
Burada belirtilmesi gereken en önemli şey, XML'in tamamının birlikte çalıştığıdır. Çoğu
durumda, sunucular XML'i boşluklar ve satır başlarıyla biçimlendirmez; Liste 5'te
gördüğünüz gibi tümünü tek bir dize halinde birleştirir. Elbette, uygulamalarınız boşluklarla
çok ilgilenmediği için bu, bir sorun oluşturmaz; ancak, okumak biraz zorlaşır.
Bu noktada, bu verileri ayırmak için JavaScript split işlevini ve öğe adlarını ve değerlerini
almak için temel dize işlemesini kullanabilirsiniz. Tabii ki bu, size gerçekten sıkıntı verecektir
ve böyle bir durumda, dizinin önceki makalelerinde DOM'ye (Belge Nesne Modeli) bakmak
için çok zaman harcadığınız gerçeği göz ardı edilir. Bu nedenle, responseText ile bir
sunucunun XML yanıtını kolayca kullanabileceğinizi ve çıkarabileceğinizi aklınızda
tutmanızı öneririm, ancak size daha fazla kod göstermeyeceğim; biraz sonra da göreceğiniz
gibi, DOM'yi kullanabileceğiniz durumlarda, XML verilerini almak için bu yaklaşımı
kullanmamanız gerekir.
Sunucunun XML biçimli yanıtını diğer metin yanıtları gibi işleyebilirsiniz, ancak bunu
yapmanızı gerektiren herhangi bir neden yoktur. Birincisi, bu dizinin sadık bir okuruysanız,
XML'i işlemek için yararlanabileceğiniz JavaScript dostu bir API olan DOM'yi nasıl
Bunu çalışırken görmek için Liste 6'ya bakın. Bu kod, Liste 4'e benzer, ancak responseText
özelliğini kullanmak yerine, geri çağrı responseXML özelliğini kullanır. XMLHttpRequest
nesnesinde bulunan bu özellik, sunucunun yanıtını bir DOM belgesi biçiminde döndürür.
Artık bir DOM Document öğeniz var ve bununla, diğer herhangi bir XML ile yaptığınız gibi
çalışabilirsiniz. Örneğin, tüm show öğelerini alabilirsiniz (bkz. Liste 7).
DOM ile daha önce çalıştıysanız, bu size tanıdık gelmeye başlamış olmalı. Şimdiye kadar
öğrendiğiniz tüm DOM yöntemlerini kullanabilir ve sunucudan aldığınız XML'yi kolayca
işleyebilirsiniz.
Elbette, olağan JavaScript koduna da karıştırabilirsiniz. Örneğin, Liste 8'deki gibi tüm show
öğelerini yineleyebilirsiniz.
// Now do whatever you want with the show title and ratings
}
}
}
}
Bu göreceli olarak basit kodla, bir XML yanıtını, yalnızca düz, biçimlendirilmemiş metin gibi
değil, bir XML gibi işlediniz ve sunucunun yanıtıyla çalışmak için biraz DOM, biraz da basit
JavaScript kullandınız. Daha da önemlisi, virgülle ayrılmış değerler ya da çubukla ayrılmış
ad/değer çiftleri yerine standartlaşmış bir biçimle (XML) çalıştınız. Diğer bir deyişle, XML'i
anlamlı bir yerde kullandınız ve sunucuya istek göndermek gibi anlamsız bir yerde
kullanmaktan kaçındınız.
Sunucuda XML oluşturma konusuna fazla değinmesem de, çok fazla açıklama yapmadan
küçük bir örnek görebiliriz; böylece, böyle bir durumla nasıl uğraşacağınıza ilişkin kendi
düşüncelerinizi oluşturursunuz. Liste 9'da, zamanuyumsuz bir istemciden gelmiş olabilecek
bir isteğe yanıt olarak XML oluşturan basit bir PHP komut dosyası gösterilmektedir.
Bu, PHP komut dosyasının XML çıkışını manuel olarak zorla oluşturduğu kaba kuvvet
yaklaşımıdır. PHP ve XML yanıtları oluşturabilmenizi sağlayan diğer birçok sunucu tarafı
dillerine ilişkin çeşitli araç takımları ve API'ler bulabilirsiniz. Her durumda bu, size en
azından XML ile istek oluşturan ve yanıtlayan bir sunucu tarafı komut dosyasının neye
benzediğine ilişkin bir fikir verir.
if (!mysql_select_db("television", $conn))
die("Error selecting TV database: " . mysql_error());
echo "<show>
echo "<title>" . $title . "</title>";
echo "<rating>" . $rating . "</rating>";
echo "</show>";
}
echo "</ratings>";
mysql_close($conn);
?>
Kendi favori sunucu tarafı dilinizi kullanarak benzer bir şekilde XML çıkışı elde edebilmeniz
gerekir. Çok sayıda IBM developerWorks makalesi, tercih edilen sunucu tarafı dili
kullanılarak bir XML belgesinin nasıl oluşturulacağını anlamanıza yardımcı olur (bağlantılar
için bkz. Kaynaklar).
Genel olarak, JSON ile yapabileceğiniz her şeyi DOM ile de yapabilirsiniz ya da DOM ile
yapabileceğiniz her şeyi JSON ile yapabilirsiniz; bu genellikle tercihle ve belirli bir uygulama
için doğru yaklaşımı seçmeyle ilgilidir. Şimdilik, DOM ile çalışmaya devam edelim ve
sunucunun yanıtını alma bağlamında bunun nasıl kullanılacağını öğrenelim. Birkaç makale
içinde JSON üzerinde oldukça uzun duracağım ve bir sonraki uygulamanızda ikisi arasında
bir seçim yapmak için hazır olacaksınız. Bu nedenle, bu diziyi izlemeye devam edin: Gelecek
makalelerde XML ile ilgili anlatılacak daha çok şey var.
Sonuç
Bu dizinin son makalesinin başlamasından bu yana neredeyse durmaksızın XML ile ilgili
konuşuyorum, ancak henüz XML'in Ajax denklemine katkısının yalnızca yüzeyini biraz
kazıdınız. Gelecek makalemde, XML göndermek (ve XML almak) isteyebileceğiniz belirli
durumlarla ilgili daha ayrıntılı bilgi vereceğim. Özellikle, Web hizmetlerini -- özel olanlar ve
Google gibi API'ler -- Ajax etkileşimi ışığında inceleyeceksiniz.
Sunucunun size gönderdiği verilerin sınırlı olduğu bir durumda ya da virgül veya çubuklarla
ayrılmış garip bir biçimde, XML gerçekten büyük yararlar sağlayabilir. Sunucu tarafı
bileşenlerinizle çalışarak ya da bu bileşenleri değiştirerek, kesinlikle XML kadar sağlam
olmayan bir özel biçimi kullanmak yerine yanıtları daha standart bir şekilde, XML kullanarak
döndürmelerini sağlayabilirsiniz.
Sonuç olarak, Ajax'la ilgili teknolojiler hakkında ne kadar çok şey öğrenirseniz, kararlarınız
konusunda o kadar dikkatli olmanız gerektiğini unutmayın. Bu Web 2.0 uygulamalarını
yazmak eğlencelidir (ve gelecek makalelerde kullanıcı arabirimine dönecek ve
yapabileceğiniz bazı güzel şeyleri göreceksiniz), çalışan bir Web sayfasına, ancak yalnızca
arkadaşlarınızı etkilemek adına teknoloji eklemediğinizden emin olmak için biraz dikkatli
olmanız gerekir. İyi bir uygulama yazabileceğinizi biliyorum, o zaman gidin ve bunu yapın.
İşinizi bitirdiğinizde, buraya gelip gelecek ayın makalesini okuyun ve daha çok XML öğrenin.
Kaynaklar
Bilgi Edinme
• developerWorks Web Geliştirme bölgesi: Web 2.0, Ajax, wikis, PHP, mashup'lar ve
diğer Web projeleriyle ilgili kaynaklar bulun.
• "Write XML documents with StAX" (Berthold Daum, developerWorks, Aralık 2003):
Düşük düzeyli, imleç tabanlı StAX API'sini verimli bir şekilde kullanarak XML
belgeleri oluşturmaya ilişkin tek bir yöntemle ilgili bu kısa ipucunu okuyun.
• "Servlets and XML: Made for each other" (Doug Tidwell, developerWorks, Mayıs
2000): Bu makalede, Java sunucu uygulamalarının XML ile nasıl çalıştığınız ve
sunucu tarafında nasıl XML oluşturduklarını öğrenin.
• "Java object serialization for Ajax," Philip McCarthy (developerWorks, Ekim 2005):
Ağ üzerinden nesne gönderme ve Ajax ile etkileşimde bulunma konularını Java bakış
açısıyla inceler.
• "Call SOAP Web services with Ajax" (James Snell, developerWorks, Ekim 2005):
Ajax'ın var olan SOAP tabanlı Web hizmetleriyle bütünleştirilmesine ilişkin bu ileri
düzey makaleyi inceleyin; Ajax tasarım şablonunu kullanarak Web tarayıcısı tabanlı
SOAP hizmetleri istemcisini nasıl uygulayacağınızı gösterir.
• World Wide Web Consortium'daki DOM Ana Sayfası: DOM ile ilgili her şeyin
başlangıç noktasını ziyaret edin.
• "Ajax: A new approach to Web applications" (Jesse James Garrett , Adaptive Path,
Şubat 2005): Ajax moniker teriminin ilk kez kullanıldığı bu makaleyi okuyun -- tüm
Ajax geliştiricileri bu makaleyi okumalıdır.
• Head Rush Ajax (Brett McLaughlin, O'Reilly Media, 2006): Bu makaledeki fikirleri
Head First yöntemiyle öğrenin.
• Java and XML, Second Edition (Brett McLaughlin, O'Reilly Media, Inc., 2001):
Yazarın XHTML ve XML dönüşümleriyle ilgili görüşlerini okuyun.
• JavaScript: The Definitive Guide (David Flanagan, O'Reilly Media, Inc., 2001):
JavaScript ve dinamik Web sayfalarıyla çalışmaya ilişkin kapsamlı yönergeleri
inceleyin. Yayınlanacak olan yeni basımda Ajax ile ilgili iki yeni bölüm vardır.
• Head First HTML with CSS & XHTML (Elizabeth and Eric Freeman, O'Reilly Media,
Inc., 2005): Standartlaşmış HTML ve XHTML ve CSS'yi HTML'ye uygulamayla
ilgili daha fazla bilgi öğrenin.
Tartışma