JavaScript Temelleri

Bölüm 18

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

Bölüm 18 Sayfa 4

18.4 - window Nesnesinin Özellikleri

Burada sadece tek pencerelerle çalışılırken kullanılan özellikleri inceleyeceğiz. Çerçeve sistemleri ile çalışılırken kullanılacak özellikleri, çerçeveler (frames) konusunda ele alacağız.

18.4.1 - window.name Özelliği

Bu bölümde, daha önce incelenmiş olduğumuz pencere isimleri ile yeniden ilgileneceğiz. Pencere ismi, çerçeve (frame) ismi olarak da nitelendirilir. Pencere (çerçeve) isimleri, (X)HTML çözümleyicisinin (parser) bir belgeyi yüklemek için yararlandığı bir veridir. Bunu bir postacının bir mektubu, belirli bir adrese teslim etmek için, yararlandığı bir adres bilgisi gibi düşünmek, olayın daha kolay anlaşılması için yardımcı olabilir. Bu bilgiden sadece (X)HTML çözümleyicisi yararlanmaktadır. JavaScript yorumlayıcısı ise, çerçeve isimleriden yararlanmaz, belirli çerçeve ve içeriğine erişmek için, pencere (çerçeve) referans değerlerinden yararlanır.

(X)HTML çözümleyicisinin yeni bir belge çerçevesi açılabilmesı için sisteme istek yapabilmesi için yararlanabileceği için tek olanak, çapa elementidir. (X)HTML katı kuralcı (strict) DTD si altında, çapa elementi ile açılması istenen belgelerin açılacağı pencere ismini belirten target niteliği tanımlı değildir. Bu yüzden (X)HTML katı kuralcı DTD si altında, yüklenecek bir belgenin pencere adı, hiçbir şekilde önceden belirlenemez. (X)HTML katı kuralcı DTD si altında, yeni yüklenecek belge pencereleri daima isimsiz (anonim) (eski grekçe anonim isimsiz anlamına gelir). sistem pencereleri olarak açılır. Açılan pencereler daima geçerli sistem pencereleri olarak nitelendirilir ve (X)HTML katı kuralcı DTD si altında, (X)HTML çözümleyicisi, biligi alışverişini daima geçerli sistem penceresi ile gerçekleştirir.

(X)HTML katı kuralcı DTD si altında, çapa elementi ile belirli bir adresteki bilgiler, geçerli sistem penceresine yüklenmek istenirse, (X)HTML katı kuralcı DTD si altında, (X)HTML çözümleyicisi, ilk olarak sistemde açık bir sistem olup olmadığına bakar. Eğer önceden açık bir anonim (isimsiz) sistem penceresi varsa, bu pencerenin içeriği boşaltılıp, yeni içerik bu açık pencerenin yeni içeriği olacak şekilde yüklenir. (X)HTML strict DTD si altında, sistemde açık bir anonim sistem penceresi varken hiçbir şekilde yeni bir belge sistem penceresi açılamaz. Açık olan pencereye yeni bir belge yüklenir. Eğer yeni bir isimsiz sistem penceresi açılmak istenirse, yeni bir belge çözümleyicisi örneğinin açılması (yani iexplore.exe gibi belge çözümleyicisi programının yeniden çalıştırılması) gerekir. Ancak bu şekilde, sistemde, birbirinden bağımsız iki isimsiz sistem penceresi açılmış olacaktır.

(X)HTML frameset DTD si altında ise, <a href="uygulama11.htm" target="kaynak"> şeklinde, belgenin yükleneceği hedef pencere ismi belirtilebiir. (X)HTML frameset DTD si altında, (X)HTML çözümleyicisi, bilgi aılışverişinin yapılacağı sitem penceresini, pencere adından seçebilir.

Pencere isimleri sadece (X)HTML çözümleyicisi ile ilgilidir. JavaScript yorumlayıcısı, pencerenin içerdiği belgenin öğelerine erişmek için pencere isminden değil, bir JavaScript değişkeni olan, pencere referans değişkeninden yararlanır. Pencere referans değişkeni bir JavaScript program değişkenidir. JavaScript programı ile açılmış olan bir pencere, bir öntanımlı konukçu nesne örneği olduğundan, bellekte yerleştirilmiş olduğu yerin bellek işaretçisi (pointer) bu pencere rereferans değişkenin değeri olarak belirlenir. JavaScript yorumlayıcısı, tüm isimli pencere bilgilerine bu pencere referans değişkeni, (nesne örneği) yardımı ile erişebilir. Tüm nesne örnekleri ile çalışma yöntemi, bu mekanizmanın aynıdır.

Eğer bir pencere referans değişkeni adı belirtilmemişse, ister (X)HTML katı kuralcı DTD si altında, ister (X)HTML frameset DTD si altında çalışılsın, JavaScript yorumlayıcısı tüm bigi alışverişini geçerli( ilgi odağı üzerinde olan) sistem penceresi ile gerçekleştirir.

İsimli veya isimsiz, sistem penceresi veya alt pencere, hiçbir açık pencerenin ismi, (X)HTML yorumlayıcısı tarafından değiştirilemez. Bu işlem, ancak JavaScript window.name özelliği kullanılarak gerçekleştirilebilir.

window.name özelliği iki yönlüdür. İstendiğinde bir pencerenin (çerçevenin) ismini döndürebilir veya bir pencerenin (çerçevenin) ismini yenileyebilir.

Bu konuda bir program örneğinin, kodları aşağıda görülmektedir. Bu programda ekrandan girilen bir isimle yeni bir çerçevenin açılması yapılmakta ve yeni çerçevenin geçerli adı okunarak aynı çerçevede görüntülenmesi sağlanmaktadır. Bu program, bağlantılı olduğu uygulama sayfasında çalışmaktadır.

/* <![CDATA[  */

function nodEkle(pencere, metin, sonuç) {
var açıklama = '', p0 = new Object(), span0 = new Object(), belge = new Object();

p0 = pencere.document.createElement('p');
açıklama = pencere.document.createTextNode(metin);
p0.appendChild(açıklama);


span0 = pencere.document.createElement('span');
açıklama = pencere.document.createTextNode(pencere.name);
span0.appendChild(açıklama);
span0.style.color = 'red';
p0.appendChild(span0);


belge = pencere.document.getElementsByTagName(body).item(0);
belge.appendChild(p0);
}

function nodEkleMesaj(pencere, metin, renk) {

var text = '', span0 = new Object(), belge = new Object();

text = pencere.document.createTextNode(metin + ' ');
span0.appendChild(text);
span0.style.color = renk;


belge = pencere.document.getElementsByTagName(body).item(0);
belge.appendChild(span0);
}

function isimYaz(pRef) {
var mesaj1 = 'Bu İsim,', mesaj2= 'pencerenin (çerçevenin),', mesaj3= 'Yeni İsmini,', mesaj4= 'Belirtmektedir !', 
içerik = pRef.document.getElementsByTagName('p');

if(içerik. length === 0) {
nodEkle(pRef, 'Pencere İsmi = ', pRef.name);
nodEkleMesaj(pRef, mesaj1, 'green');
nodEkleMesaj(pRef, mesaj2, 'blue');
nodEkleMesaj(pRef, mesaj3, 'Indianred');
nodEkleMesaj(pRef, mesaj4, 'red');
}
}


function pencereAç(isim) {

var penRef = null;
penRef = window.open('', isim, 'left = 50, top = 200, width = 400,' + 
'height = 180, toolbar = yes, scrollbars = no');
return penRef;
}

function isimDeğiştir() {

var pencereRef = null, çerçeveİsmi = '', bilgi = []; 

bilgi = pRef.document.getElementsByTagName('input');
çerçeveİsmi = bilgi[2].value;
pencereRef = pencereAç(çerçeveİsmi);
isimYaz(pencereRef);
pencereRef.focus(); // Açık Pencere Nesne Sınıf Örneğini Yeniden İlgi Odağına Getir !
}




function başlat() {

var veri  = document.getElementsByTagName('input');
veri[3].onclick = isimDeğiştir;
}


sayfaYüklendiktenSonraÇalıştır(başlat);

/* ]]>  */
		

JavaScript yorumlayıcısı, sadece bağlantılı olduğu pencerelere ve kendisinin bir pencere referansı vererek açtığı pop-up pencerelere erişebilir. Bunun dışındaki pencerelere erişemez.

18.4.2 - window.closed Özelliği

window.closed Özelliği, sadece sistem pencerlerinin açık veya kapalı olup olmadığını kontrol eder. Eğer geçerli pencere kapalı ise, değeri true aksi halde değeri false olur. Kullanımı

window.closed
		

şeklindedir. Burada,

Bu özellik JavaScript programı ile açılmış olan bir pencerenin açık veya kapatılmış olmasını da kontrol edebilir. Bu durumda bu özelliğin değerine,

pencereReferansı.closed
		

şeklinde erişilir.

Bu özellik tek yönlü (salt okunur) bir özelliktir. Pencerenin açık olup olmadığını bildirir, pencerenin closed özelliğinin değerini değiştiremez.

Bu yöntemle işletim sistemi tarafından açılmış bir pencerenin kapanmış olup olmadığı kontrol edilirse, bir diyalog penceresi açılarak onay sorulur.

Bir alt pencerenin önce açılıp, kapatıldıktan sonra window.closed özelliğinin incelenmesi ile, açılmış alt pencerenin kapanmış olup olmadığının kontrol edildiği bir programının kodları aşağıda görülmektedir. Bu program bağlantılı olduğu sayfada çalışmaktadır.


/* <![CDATA[  */

function pencereAç(URI) {

/*Not: Eğer isim parametresi ile bir 
boş karakter dizgisi (str) literal veya _blank
değil geçerli bir karakter dizgisi (str) literal
veriliyorsa ve bu isim ile sistemde açık bir pencere varsa, 
yeni bir pencere (window) değil, aynı pencerede , içeriği, 
bu fonksiyonun URI argümanının işaret ettiği belgenin 
içeriği olan yeni bir belge (document) açılacaktır.
Yani, aynı isimli açık pencerenin içeriği değişecektir*/


pencereRef=window.open(URI, "Tarifeler",
'left = 400, top = 10, width = 600, height = 450,' +
'toolbar = no, menubar = no, location = no,' +
'directories = no, scrollbars = yes,' +
'resizable = no, status = yes');
pencereRef.focus();  // Açık pencere nesnesini yeniden ilgi odağına getir. 

return pencereRef;

}


function otobüsTarifesi() {
var
bağlantı = [], URI = '', penref = null;
			
bağlantı = document.getElementsByTagName('a');
			
URI = bağlantı[6].getAttribute('href');
penref = pencereAç(URI);
return penref;
}


function başlat() {

var
bağlantı = [], penRef = null;

bağlantı = document.getElementsByTagName('a');

bağlantı [6].onclick = function() {

penRef = otobusTarifesi();
return false;
}
			
bağlantı [7].onclick = function() {
			
if (penRef === null) {
alert('Pencere Hiç Açılmadı');
}

else {
if(penRef .closed === true) {
alert('Pencere Kapalı');
}

if(penRef .closed === false) {
alert('Pencere Açık');
}
}
}

}




sayfaYüklendiktenSonraÇalıştır(başlat);

/* ]]>  */
		

Yukarıdaki programda pencerenin hiç açılmamaış, açık veya kapalı olduğunun kontrolü yapılan kısmın akım şeması aşağıda görülmektedir:

flowchart

Bu akım şeması, Visustin adlı otomatik akım şeması oluşturma programı ile elde edilmiştir.

18.4.3 - window.defaultStatus Özelliği

Bu özellik, bir Web sayfasının en altında bulunan durum çubuğunda, görüntülecek varsayılan mesajı okur veya belirler. Bu özellik iki yönlüdür. Yani, hem okuma, hem de yazma yapabilir. Bu özelliğin varsayılan bir değeri yoktur. Kullanımı mesaji okurken,

'Mesaj' = window.defaultStatus;
		

Mesajı Belirlerken,

 
window.defaultStatus = 'Mesaj';
		

şeklindedir.

Durum çubuğuna bir mesaj yazdırken dikkat edilecek konu, genel olarak, kullanıcıların durum çubuğunda, bir mesajdan çok her zaman alışageldikleri görüntüyü tercih ettikleridir. Bir Web sayfası yüklenirken, durum çubuğunda, statik bir mesajın görüntülendiği ve okunduğu bir program verilmiştir. Kodları aşağıda görülmekte olan bu program, bağlantılı olduğu uygulama sayfasında çalışmaktadır.


/* <![CDATA[  */

function başlat() {
			
var Mesaj = '';
			
window.defaultStatus = 'Hoş Geldiniz, Umarız Bu Sayfadaki Bilgileri Yararlı Bulursunuz ! ';
Mesaj = window.defaultStatus;
alert(Mesaj);

window.defaultStatus = Mesaj;

}




sayfaYüklendiktenSonraÇalıştır(başlat);

/* ]]>  */
		

18.4.4 - window.status Özelliği

Bu özelik, window.defaultStatus özelliği ile karıştırılmamalıdır. Çünkü window.defaultStatus özelliği, pencere açıldığında varsayılan gibi hareket eden bir mesajı durum çubuğunda görüntülerken, window.status özelliği, sadece belirli, bir eylem gerçekleşince geçici bir mesajı durum çubuğunda görüntüler.

Kodları aşağıda verilen bir JavaScript programı, bir düğmenin tıklanması ile durum çubuğunda bir mesajı yazdırmaktadır. Bu program, bağlantılı olduğu, uygulama sayfasında çalışmaktadır.


/* <![CDATA[  */

function başlat() {

var bağlantı = [];

bağlantı = document.getElementsByTagName('a');

bağlantı [4].onclick = function() {

window . status = 'Düğmeye Bastınız !';
return false;
}
}


sayfaYüklendiktenSonraÇalıştır(başlat);


/* ]]>  */
		

18.4.5 - window.parent Özelliği

Bu özelliğin değeri, alt pencereyi açtıran pencerenin bellek referansıdır. Üst ve alt pencere arasında bilgi aktarımı gerektiğinde bu özellikten yararlanılabilir.

18.4.6 - window.self Özelliği

Bu özelliğin değeri, pencerenin bellek referansıdır. Bu değere aşağıdaki şekillerle de eşeğer olarak ulaşılabilir.

pencereReferansı = window.window;
			
pencereReferansı = window;
			
pencereReferansı = window.self;

pencereReferansı = self;
		

Bu özellik, programlarda, window sözcüğü yerine kullanılabilir. Örnek olarak window.close() yerine self.close() kullanılabilir.