JavaScript Temelleri

Bölüm 18

Belge Çözümleyicisi Nesne Modeli (Browser Object Model) (BOM)

Bölüm 18 Sayfa 6

window.navigator Alt nesnesi, window nesnesinin en kafa karıştııcı ve tasarlandığı işlevini kaybetmiş alt nesnesidir. Bu alt nesne, orijinal olarak, sadece Netscape Navigator 'un tek belge çözümleyicisi olduğu bir zamanda, JavaScript programlama dili Netscape tarafından oluşturulurken, kullanılmakta olan Netscape Navigator'un tanımlanması amacı ile, konuk eden ortamın JavaScript nesneleri arasına konulmuştur. İlerleyen süreç içinde, Netscape Navigator geri plana düşünce, programcilar bu alt nesneden, kullandıkları belge çözümleyicisinin, Internet Explorer veya Netscape Navigator olup olmadığını sınama amacı ile kullanmaya çalışmışlar, navigator yerleşik alt nesnesinin orijinal tasarım amacı bu olmadığından, istedikleri sonucu alamamışlardır. Başlangıçta kontroller doğru sonucu verirken, birbirlerinin pazar payını olabildiğince azaltmaya çalışan belge çözümleyicileri üreten ticari kuruluşlar, yanıltıcı yanıtlar alımasını sağlayacak şekilde yazılımlar üretmişlerdir. Günümüzde bu alt nesnenin çeşitli metotları uygulanarak, kullanılan belge çözümleyicinin türünün güvenilir bir şekilde saptanması olanaksızdır. Bu nedenle, alınacak sonuçlara şüpheyle yaklaşmak, bu sonuçlara dayanarak çalışacak yöntemler, tasarlamamak gerekir. Alınacak sonuçlar, sadece bir ön bilgi olarak düşünülmelidir.

Tablo : 18-8: navigator Alt Nesnesinin Ortak Desteklenen Özellikleri
Özellikler Tanım
appCodeName Belge Çözümleyicinin Kod İsmini Döndürür.
appName Belge Çözümleyicinin Gerçek İsmini Döndürür.
appVersion Karakter dizgisi Olarak Belge Çözümleyicisinin Sürümünü Döndürür
cookieEnabled Cookie'lerin Kabul Edilip Edilmediklerini Mantıksal Olarak Döndürür
onLine Belge Çözümleyicisinin On-Line Durumunuı Mantıksal Olarak Döndürürür.
platform Belge Çözümleyicisinin Çalıştığı Platformu Karakter dizgisi Olarak Döndürür.
userAgent Belge Çözümleyici Hakkında Bilgileri Karakter Dizgisi Olarak Döndürür.

Yukarıdaki tablodan görüldüğü gibi, ortak desteklenen özellik sayısı fazla değildir. window.navigator nesnesinin ortak destekelenen tek metodu, javaEnabled() metodudur. Kullanımı,

navigator.javaEnabled();
		

şeklindedir. Bu metot, belge çözümleyici Java appletlerini destekliyorsa geriye true, desteklemiyorsa, false döndürür.

window.navigator nesnesinin ortak desteklenen özellik ve ve metotlarının sonuçlarının görüntülendiğ bir JavaScript programının kodları aşağıda görülmektedir. Bu program ilişikli olduğu uygulama sayfasında çalışmaktadır.


/* <![CDATA[  */

function özellikYaz(mesaj, sonuç, yazımYeriID) {
var yazımYeri = document.getElementById(yazımYeriID), yeniParagraf = null, araYazım= null, bilgi= null;

yeniParagraf = document.createElement('p');
araYazım = document.createElement('span');
araYazım.className = cursive-green;
yeniParagraf.appendChild(araYazım);

araYazım = document.createElement('span');
araYazım.className = cursive-maroon;
araYazım.appendChild(document.createtextNode(' = ');
yeniParagraf.appendChild(araYazım);

araYazım = document.createElement('span');
araYazım.className = cursive-red;
araYazım.appendChild(document.createtextNode(sonuç);
yeniParagraf.appendChild(araYazım);

yazımYeri.parentNode.insertBefore(yeniParagraf, yazımYeri);
}

function işlemleriBaşlat() {
özellikYaz('navigator.appCodeName ', navigato.appCodeName, 'navbottom');
özellikYaz ('navigator.appName ', navigator.appName, 'navbottom');
özellikYaz ('navigator.appVersion ', navigator.appVersion, 'navbottom');
özellikYaz ('navigator.cookieEnabled ', navigator.cookieEnabled, 'navbottom');
özellikYaz ('navigator.onLine ', navigator.onLine, 'navbottom');
özellikYaz ('navigator.platform ', navigator.platform, 'navbottom');
özellikYaz ('navigator.userAgent ', navigator.userAgent, 'navbottom');
özellikYaz ('navigator.javaEnabled() ', navigator.javaEnabled(), 'navbottom');
}


// Eğer Belge Çözümleyici FireFox ise (GECKO Motoru)

if (window.addEventListener) {
window.addEventListener('load', işlemleriBaşlat , false);
}

// Eğer Belge Çözümleyici Internet Explorer İse

else if (window.attachEvent) {
window.attachEvent('onload', işlemleriBaşlat);
}

/* ]]>  */
		

Yukarıdaki sayfanın çeşitli belge çözümleyicilerde çalışması sonucunda elde edilen sonuçlar dikkatle incelenmeli ve değerlendirilmelidir. Bu sonuçlar aşağıdaki tablolarda açıklanmaktadır:

Tablo : 18-9 navigator.appCodeName Özelliğinin Değeri
Belge Çözümleyici Değer
Internet Explorer (Sürüm 8.0.6001.18763) Mozilla
Firefox (Sürüm 3.0.11) Mozilla
Opera (Sürüm 9.64) Mozilla
Safari (Sürüm 4.0.2 (530.19.1)) Mozilla
Chrome (Sürüm 2.0.172.33) Mozilla

Tablo : 18-9: navigator.appName Özelliğinin Değeri
Belge Çözümleyici Değer
Internet Explorer (Sürüm 8.0.6001.18763) Microsoft Internet Explorer
Firefox (Sürüm 3.0.11) Netscape
Opera (Sürüm 9.64) Opera
Safari (Sürüm 4.0.2 (530.19.1)) Netscape
Chrome (Sürüm 2.0.172.33) Netscape

Tablo : 18-10 navigator.appVersion Özelliğinin Değeri
Belge Çözümleyici Değer
Internet Explorer (Sürüm 8.0.6001.18763) 4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; GTB6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 1.1.4322; .NET CLR 3.0.30618; OfficeLiveConnector.1.2; .NET CLR 3.5.30729)
Firefox (Sürüm 3.0.11) 5.0 (Windows; en-GB)
Opera (Sürüm 9.64) 9.64 (Windows NT 6.0; U; en)
Safari (Sürüm 4.0.2 (530.19.1)) 5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1
Chrome (Sürüm 2.0.172.33) 5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.33 Safari/530.5

Tablo : 18-11 navigator.cookieEnabled Özelliğinin Değeri
Belge Çözümleyici Değer
Internet Explorer (Sürüm 8.0.6001.18763) true
Firefox (Sürüm 3.0.11) true
Opera (Sürüm 9.64) true
Safari (Sürüm 4.0.2 (530.19.1)) true
Chrome (Sürüm 2.0.172.33) true

Tablo : 18-12 navigator.onLine Özelliğinin Değeri
Belge Çözümleyici Değer
Internet Explorer (Sürüm 8.0.6001.18763) true
Firefox (Sürüm 3.0.11) true
Opera (Sürüm 9.64) true
Safari (Sürüm 4.0.2 (530.19.1)) true
Chrome (Sürüm 2.0.172.33) true

Tablo : 18-13 navigator.platform Özelliğinin Değeri
Belge Çözümleyici Değer
Internet Explorer (Sürüm 8.0.6001.18763) Win32
Firefox (Sürüm 3.0.11) Win32
Opera (Sürüm 9.64) Win32
Safari (Sürüm 4.0.2 (530.19.1)) Win32
Chrome (Sürüm 2.0.172.33) Win32

Tablo : 18-14: navigator.userAgent Özelliğinin Değeri
Belge Çözümleyici Değer
Internet Explorer (Sürüm 8.0.6001.18763) 4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; GTB6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 1.1.4322; .NET CLR 3.0.30618; OfficeLiveConnector.1.2; .NET CLR 3.5.30729)
Firefox (Sürüm 3.0.11) 5.0 (Windows; en-GB)
Opera (Sürüm 9.64) 9.64 (Windows NT 6.0; U; en)
Safari (Sürüm 4.0.2 (530.19.1)) 5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1
Chrome (Sürüm 2.0.172.33) 5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.33 Safari/530.5

Tablo : 18-15 navigator.javaEnabled Özelliğinin Değeri
Belge Çözümleyici Değer
Internet Explorer (Sürüm 8.0.6001.18763) true
Firefox (Sürüm 3.0.11) true
Opera (Sürüm 9.64) true
Safari (Sürüm 4.0.2 (530.19.1)) true
Chrome (Sürüm 2.0.172.33) true

Yukarıdaki tablolar incelendiğinde, appCodeName özelliği ile hibir belge çözümleyiciyi diğerinden ayırdetme olanağı bulunmadığı görülmektedir. Çünkü, tüm inceleneen belge çözümleyicilerinin appCodeName özelliklerinin değerleri 'Mozilla' olarak görülmektedir.

İncelenen belge çözümleyicilerinin appName özelliklerinin değerleri karşılaştırıldığında, sadece Internet Explorer ve Opera belge çözümleyicilerinin kendilerini gerçek adları tanıttıkları diğerlerin kendilerini, 'Netscape' olarak tanıttıları görülmektedir. Bu davranışın kabul edilecek bir yönü yoktur.ve GECKO motoruna dayalı olarak oluşturulan, Netscape belge çözümleyicisinin gerçek mirasçısı sayılan FireFox belge çözümleyicisine, yapılamış olan bir haksızlıktır. Kendilerini 'Netscape' olarak tanıtan Safari ve Chrome belge çözümleyicileri, gerçekçe Apple kuruluşunun WebKit motoruna dayalı olarak oluşturulan farklı aileden belge çözümleyicileridir.

İncelenen bir sonraki özellik olan appVersion özelliği ise, belenenden çok bilgi vericidir. Bu özelliği değerinin detaylı analizi ile Google'un Chrome belge çözümleyicisi bu özellik değerinde chrome karakterleri olması ile FireFox ve Apple'in Safari bilgisayarından ayrılabilir. Geriye kalan Safari de bu özelliliğin değerinde Wekit sözcüğü bulunduğu ve FireFox da ise bulunmadığı için bu ikisi de birbirinden ayrılabilir.

Diğer özellikler arasında ise en işe yararyanlar, Java appletlerinin desteklenebildiğinin ve cookie lerin kabul edlip edilemeyeceğinin saptanabilmesi olmaktadır. JavaScript programlama dilinin ilerlemesi le artık Java appletleri iyice önemini kaybetmeiş sayılabiilir. Fakat cookie'lerin kabul edilip edilmediğinin başarı saptanabilmiş olması, büyük önem taşımaktadır.

Bu sonuçların uygulanması için iki genel uygulama senaryosunu düşünülebilir. İlk senaryo, kapalı intranet adı verilen ve yayılanan sayfanın sadece şirket çalışanları gibi sınırlı sayıda ve kullanacakları yazılımın önceden belirtileceği kullanıcıların istemcilerine indirileceği bir kullanım şeklidir. Bu kullanım şeklinde, belge çözümleyicinin kontrolüne gerek olmayacaktır, çünkü kullanıcıların belge çözümleyicilerin adı ve sürümü ile diğer yardımcı programlar kullanıcılara daha önce belirtilmiş olmaktadır.

İkinci senaryo, genel yayınlama adı verilen ve bir sunucu üzerinde yayınlanan bir sayfayı, her marka ve sürümdeki çeşitli belge çözümleyicileri kullanan kullanıcıların kendi istemcilerine indirmesi yöntemidir. Bu ortamın koşulları kaotik olarak nitelendirilebilir, çünkü kullanıcıların kullanacakları belge çözümleyiciler üzerinde sayfayı yayınlayanın en küçük bir kontrolü bile yoktur.

Genel yayınlamadaki bir sayfanın kullanıcı ortamında her zaman yeterince değerlendirilememesi olasılığı yüksektir. Örnek oarak, JavaScript gerektiren bir durumda, kullanıcının belge çözümleyicisinde JavaScript yorumlayıcısının kapalı olması bazı bilgilerin kullanıcıya ulaşamaması sonucunu da getirecektir. Bir sayfa, belirli bir belge çözümleyicisini gerektiren kodlar içerdiğinde, kullanıcının bu belgeyi başka bir belge çözümleyici ile açmak istemesi, sayfanın gerektiği gibi değerlendirememesi durumunu ortaya çıkaracaktır. Bu durumda, kullanıcının belge çözümleyicisinin özelliklerinin kontrolü ve yetersiz olduğu durumlarda kullanıcının uyarılması çok önem kazanmaktadır.

Genel yayınlamadaki bir sayfanın kullanıcı ortamında yeterince değerlendirileme olasılığının azaltılması için gerek kullanıcıların gerekse belge çözümleyici üreticilerinin uymaları gereken yükümlülükler bulunmaktadır. Kullanıcılar, en azından kullandıkları belge çözümleyicinin en son sürümünü indirip kullanmalıdırlar. Oysa, kullanıcıların hepsi de ücretsiz olarak dağıtılan belge çözüleyicilerin en son sürümlerini indirip kurmak sorumluluğunu çoğunlukla yerine getirmedikleri görülmektedir. Aşağıdaki tabloda görülen W3Schools belge çözümleyici istatistikleri bu konuda bir fikir vermektedir:

Tablo : 18-16 W3Schools Belge Çözümleyici İstatistikleri (Haziran 2009)
Belge Çözümleyici Kullanım Yüzdesi
Internet Explorer (Sürüm 6) 14.9
Internet Explorer (Sürüm 7) 18.7
Internet Explorer (Sürüm 8) 7.1
FireFox (Sürüm 2) 2.5
FireFox (Sürüm 3) 43.4
FireFox (Sürüm 3.5) 1.2
Chrome 6
Safari 3.1
Opera 2.1

Yukarıda görülen kullanıcı istatistikleri, kullanıcıların genel olarak yarı yarıya Internet ve FireFox Kullandıkları ve Chrome, Safari, Opera gibi belge çözümleyicilerinin kullanımlarının ise, henüz marjinal olduğunu göstermektedir. Bu bilgilere göre, kullanıcılar kullandıkları belge çözümleyicilerinin en son sürümlerini indirip kullanmakta fazla istekli değillerdir. Bu istatistiklerin verdiği iyi haberler ise, kullanıcıların tamamının yeni nesil belge çözümleyicileri olan IE 5.5 den yukarısını ve FireFox 2.0 dan yukarısını kullanmakta olduklarıdır. Yani, genel kullanıma açık sayfalarda

ECMA-262 spesifikasonuna uyumlu JavaScript programlama dili desteklenebilmektedir. Aynı şekiilde CSS 2.1 ve en azından W3C-DOM düzey 2 spesifikasyonun destekleneceğinin olasılığının yüksek olacağını göstermektedir. Ayrıca aynı istatistikler, Oacak 2009 itibariyle kullanıcı belge çözümleyicilerinin %95 inde JavaScript desteğinin açık olduğunu belirtmektedir. Bu durumda, genel kullanıma açık bir sayfa, genel olarak bu spesifikasyonları kullanması durumunda, ortalama bir kullanıcı tarafından okunabilirlik olasılığı yüzde yüze yakın olacaktır. Yani, genel kullanıma açık sayfalarda, kritik bilgilerin, standart dışı metotlar kullanılarak sunulmasından kaçınılması gerekmektedir.

Belge çözümleyici üreticilerin de kendi özel yöntemlerini zorlamak yerine genel Web standartlarını desteklemeye yoğunlaşmaları kullanıcılar için daha yararlı olacaktır. Genel kullanıma açık sayfaların anacak belirli belge çözümleyicilerde desteklenebilecek yöntemler kullanması akla yakın olmayacaktır. Örnek olarak, Mozilla tarafından geliştirilen JavaScript 1.5 ECMA-262 standardına göre daha ileri olmasına karşılık, genel yayına açık sitelerde kullanım şansı bulunmamaktadır.

Genel yayına açık sitelerde, ECMA-262 satandardı dışına çıkılmaması gerekir. Biz çalışmalarda daima standartlar içinde kalmayı ve bu şekilşde yazınlanacak sayfaları daima geel destek alabilmelerini gözetiyoruz. Bu konuda iki noktada zorlanabiliriz. Bunlardan ilki, JavaScript programların sadece Internet Explorer tarafından desteklenen dosyalama desteği, diğeri de W3C tavsiyesi olmasına karşılık, Microsoft'un inatla desteklemediği addEventListener() metodudur. İlk konuda genel yayına açık asayfalarda dosyalama çaıllşması yapılmaması ve bunun özel sanal sunucu (localhost) ile sınırlı tutulmaması iyi bir fikir olacaktır. Çünkü, zaten kullanıcı Firewall programları gibi koruma programları, kullanıcı dosya sistemine iyi niyetle bile olsa girilmesine olanak tanımayacaktır. İkinci yöntemin kullanılması için hiçbir engel yoktur. Bu konuda genel olan yöntem, belge çözümleyicinin değil metot desteğinin kontrol edilmesidir. Bu konuda temel yöntem b18.5.2-uyg-js.htm dosyasında görüldüğü gibi, belge çözümleyicinin metodu destekleyip desteklemediğinin kontrol edilmesi ve iki alternatiften hangisini destekliyorsa onu kullanmasıdır. Genel kanıya göre Microsoft addEventListener() metodunu eninde sonunda destekleyecektir. O gün gelinceye kadar programlarda addEventListener()ve attachEvent() alternatiflerinin birlikte kullanılması gerekecektir.

Detaylı analizler yaparak kullanıcının belge çözümleyicisi üzerinde bilgi alınmasını sağlayan bir program, ultimate-browser-check.htm adlı bir programdır.. bu programın kaynak kodları incelenerek istenilen bilgiler yazdırılabilir.

Genel kullanıma açık sayfaların indirildirildiği kullanıcı belge çözümleyicilerinde, JavaScript desteğinin açık olup olmadığının saptanarak açık olmaması durumunda bir uyarı mesajının görüntülenmesi, <noscript> mesaj</noscript> şeklinde belirtilebilir.