Your Ad Here

Javascript Yazılım Kuralları (JS)

22 Aralık 2007

DHTML


Javascript kodlarının en çok kullanıldığı alan DHTML'dir (Dynamik Hypertext Markup Language). Dosdoğru konuşmak gerekirse DHTML Javascript kodlarını HTML öğelerinin CSS stillerini değiştirmek için kullanır. Tüm tarayıcılar burada anlatılandan çok daha fazlasını desteklerler. Bu nedenle anlatımda dördüncü kuşak tarayıcılar üzerinde odaklanılacaktır. Eski tarayıcılar DHTML olanaklarını sınırlar ve ancak temel DHTML komutlarını desteklerler. Ama hala açılan menüler, kayan mesajlar, fare izleyiciler ve düşen kar etkilerini destekleyecek esneklikleri vardır.

Bu sayfanın bir parçasının görünmesini ya da saklanmasını (gizlenmesini) gerektirir. Bu, güvenilir biçimde, "div" öğesi kullanarak gerçekleştirilir. Bir çok kez "span" öğesi "position: absolute;" ya da "position: relative;" stiliyle yerleştirildiğinde (görüntüleme biçimini değiştirme dışında) kullanılır. Aslında "div" öğesini hemen herşey için kullanabilmek kolaylığı vardır. Bazı eski tarayıcıların (Netscape 4 gibi) "span" yerleşiminde "position: absolute;" ile sorunları olur.

Bir kez HTML hazırladıktan sonra (hatalar için düzeltmeler ve olayı çevirme kodları da kullandıktan sonra) yerleşmiş bir öğeye başvurabilirsiniz. Bu başvuruyla görünebilirlilik (visibility), yerleşim (position), art alan rengi (background color), z-index, kesme (clipping) ve yerleştirilmiş öğenin boyutlarında değişiklik yapabilirsiniz. Yerleşmiş bir öğenin içeriğini değiştirebilirsiniz ya da sayfa yüklendikten sonra başka öğeler yaratabilirsiniz. DHTML tüm sayfanın art alan rengini değiştirmenizi de sağlar. Her öğenin görünme stilini değiştirme olanağı verir.

Üzücü ama DHTML her zaman tarayıcı bağımlıdır. Diğer bir deyimle her tarayıcı değişik komutlar ister. Teknikleri kullanarak, bunları yapmak zor değildir. Tarayıcı hangi yazım kuralını kabul ederse etsin, kodlama neyi denetleyeceğini bilir ve doğru kullanır. Bir çok kodlayıcı bir tarayıcıyı yakalayınca, diğer özelliklerin çalışacağını varsayar ya da bir özelliğin çalıştığını bulunca diğerlerinin de çalışacağını varsayar. Bu tür hatalı varsayımlara burada yer verilmemiştir.

Dördüncü Kuşak Tarayıcılar


Bazı tarayıcılarda DHTML yapılabilir. Bunlara 'sürüm 4' ya da 'Dördüncü kuşak' denir. Kendi sürüm sayıları farklı olabilir. Aşağıdaki liste değişik tarayıcılar için özellikleri tanımlar. Bu tarayıcının yorumlayıcıları başka tarayıcılar tarafından da kullanılır.

  • Internet Explorer (Win) yorumlayıcısı Maxthon, Avant, birçok AOL sürümleri, ve diğerleri tarafından kullanılır.
  • Gecko yorumlayıcı Camino, K-Meleon, Flock, ve diğerlerinde kullanılır.
  • Opera yorumlayıcı birçok donanımda ve birçok uygulamada kullanılır.
  • KHTML/Webkit yorumlayıcı OmniWeb ve Shiira'da kullanılır.

Büyük/Bilinen/Önemli Tarayıcılar

Internet Explorer 5+ (Win)
document.getElementById ve document.all kullanır
Mozilla Gecko (FireFox, Netscape 6+)
document.getElementById (aynı zamanda gizlice document.all kullanır)
Opera 7+
document.getElementById ve document.all
KDE KHTML/WebKit (Safari, Konqueror 3+, OmniWeb 4.5+)
document.getElementById (Safari 3 aynı zamanda gizlice document.all kullanır)

Orta Ölçek tarayıcılar

(Internet) Explorer 5 (Mac)
document.getElementById ve document.all
iCab 3
document.getElementById ve document.all

Küçük tarayıcılar

Bu tarayıcılar çok kullanılmaz ya da tarayıcıların son sürümleri değildir. Bazılarında belirgin hatalar vardır. Kapasiteleri sınırlıdır ya da olay algılamada sınırlıdır.

Bunların bazıları Mozilla Organizasyonunun Java tabanlı Rhino Javascript makinasını (yorumlayıcını) kullanır. Rhino Javascript makinası yalnız Javascript dili yorumlayıcısını güçlendirir, web sayfasıyla javascript arasındaki ilişkiyi yönetmez. Her tarayıcının kendi DHTML (ya da DOM) uyarlaması vardır.
Internet Explorer 4 (Win)
document.all kullanır
(Internet) Explorer 4 (Mac)
document.all kullanır
Opera 5-6
document.getElementById kullanır
Mozilla Rhino engine (ICEbrowser)
document.getElementById ve document.all kullanır
Mozilla Rhino makinası (Escape/Evo 5)
document.getElementById ve document.all kullanır
Mozilla Rhino makinası (Escape 4)
document.layers kullanır
Mozilla Rhino makinası (Clue browser)
document.getElementById ve document.all kullanır
Tkhtml+EES (Tkhtml Hv3)
document.getElementById kullanır
Netscape 4
document.layers kullanır
OmniWeb 4.2-
document.layers (aynı zamanda seçmeli olarak document.all destekler) kullanır
iCab 2
document.getElementById ve document.all kullanır
Konqueror 2
document.getElementById ve document.all kullanır

Televizyon ya da mobil donanım tarayıcıları

Üzerinde çalıştığı donanımın sınırlamaları nedeniyle bu tarayıcıların olay algılama yetenekleri sınırlıdır.
NetFront
document.getElementById kullanır
Pocket Internet Explorer
document.all kullanır
Netgem 4 browser (NetBox)
document.getElementById kullanır
OpenTV
document.getElementById kullanır
iPanel MicroBrowser with advanced modules
document.getElementById kullanır
WebTV (MSN TV) Plus and extended Classic
document.all (ve iç içe geçmemiş layers seçeneği) kullanır

Daha fazla bilgi

Bu tarayıcılar için daha çok bilgi 'Dördüncü Kuşak' Tarayıcılar. listesinden elde edilebilir.

(Bu siteyi de oldukça tamamlanmış listei olarak kullanabilirsiniz).

Konqueror 2'de birçok Javascript ve DHTML işlevleri çalışsa da tarayıcı olayları algılamada yetersizdi. Bu nedenle birçok DHTML sayfası çalışmaz. Konqueror 3 yeniden ele alındığı için daha iyidir. Burada Konqueror 3+ karşılaştırmalarına yer verilmiştir.

NetBox, iPanel MicroBrowser ve OpenTV yetenekleri konusunda bir bilgi yoktur. Netboz sitesinde yarım CSS 2 desteği olduğu yazılıdır. Bu kısaca CSS yerleştirme diye varsayılabilir. Aynı sitede W3C DOM 1 olduğu yazıldığına göre DHTML varsayımı yapılabilir. OpenTV mutlak CSS ve DOM DHTML olduğunu ileri sürer. iPanel MicroBrowser için EIS ileri modüllerinin DOM kodunu algıladığını ileri sürülür. Bunlar innerHTML desteklemiyor olabilirler, çünkü bu özellik DOM standartları arasında yoktur.

Escape 4, Netscape 4 gibi layers türü tarayıcıdır. Netscape yazım kurallarını destekler. Aynı zamanda stil nesneleriyle öğelerin stilini değiştirmeyi de yapabilir (kesme/clipping yoktur). WebTV 2.8+ her iki yazım kuralını da destekler ama özel DOM tarayıcısıdır.

HTML kurma/hazırlama

İlgi çeken iki tür yerleştirme vardır. Mutlak (absolute) ve göreceli (relative). Mutlak yerleştirme, öğenin istenilen herhangi bir yere konumlanmasını sağlar. Göreceli yerleştirme, öğenin olması gereken yerini konumlanmasını sağlar. Ve belirlenen uzaklığa (offset) konumlanır.

DHTML sayfalarının birçoğu mutlak yerleştirilmiş öğelerdir. Göreceli yerleştirilen öğeler 'clip' (küpüri/kesme) stilini kabul etmez. Göreceli yerleştirilen öğelerin önemi, mutlak yerleştirilen öğelere taşıyıcılık etmeleridir. Yani mutlak yerleştirilen bir öğeyi, göreceli yerleştirilen bir öğenin içinde tanımlarsanız, onun yerleşimi görecelinin yerleşimiyle bağlantılıdır. Ana sayfayla ilgisi olmaz...

Aşağıdakini kullanarak mutlak yerleştirilen öğe yapabilirsiniz:
<div id="mydiv" style="position: absolute; left: 10px; top: 120px;">
    contents
</div>
Ve göreceli yerleştirilmiş bir öğeyi aşağıdaki gibi tanımlarsınız:
<div id="mydiv" style="position: relative; left: 10px; top: 120px;">
    contents
</div>
ID önemlidir. Yerleştirilmiş bir öğeye erişim onunla yapılır. Layers tarayıcıları bu yerleştirilmiş öğelere 'layers' adını verirler.

Hatalar ve Hatayı Geçme

'document.write' kullanarak yerleştirilmiş öğe yaratacak olunuzsa Netscape 4 sayfayı yükleyemez. Hata verir. O halde bu türün kullanımını kaldırmalısınız. Gerçekten desteklemez istiyorsanız o zaman <layer ...> biçimini mutlak yerleştirilen öğeler için kullanırsınız. <ilayer ...> biçimini ise göreceli yerleştirilen öğeler için kullanırsınız. Eğer kullanacaksaniz (document.layers) ile varlığını denetlemeyelibilirsiniz.

Aynı biçimde Netscape 4'de satır içi stil nitelikleri kullanan stilleri, yerleştirilmiş öğelerde kullanmak sayfanın yüklenmesine neden olur. Bunlar yerine öğeler için 'class' tanımlamak ve onları ana stilsayfasına yerleştirmek sorunu çözer.

Yerleştirilmiş öğeye başvuru/erişim

  • iCab 2- yerleştirmeyi desteklemez, ama yerleştirilmemiş öğelere başvuru yapabilir.

Yerleştirilmiş öğelere erişim için birçok yol vardır. W3C DOM standartı bu işin resmi yoludur. Var olan tarayıcılarla desteklenen bir yoldur. Eski tarayıcılar için iki seçenek daha vardır. Bu seçeneklerden birinin iki değişik sürümü vardır.

DOM

DOM tarayıcıları bir öğeye erişim için document.getElementById yöntemini kullanırlar. Bu yöntemi kullanmak için bzasit bir if deyimi yeterlidir.
if( document.getElementById ){
	var myReference = document.getElementById('divID');
}

Tescilli DOM


Tescilli DOM tarayıcıları document.all birikimini öğeye erişim için kullanırlar. Bazı tarayıcılar hem DOM hem de tescilli DOM erişim yöntemlerini birlikte kullanırlar.
if( document.all ){
	var myReference = document.all['divID'];
}

Katmanlar (Layers)

Layers tarayıcıları document.layers birikimini öğelere erişimde kullanırlar. 'layers' birikimindeki katmanlara ya ID ya da sayısal dizin değeriyle erişilebilir. Bunlar document.divID (divID belirtilen 'div'in 'id' değeridir) ile de öğeye erişebilir. Netscape 4 ana 'layer' tarayıcısıdır ve ilk DHTML destekleyen tarayıcıydı. Bugünün tarayıcılarında 'layers' yaklaşımı kullanılmamaktadır.
if( document.layers ){
	var myReference = document.layers['divID'];
}
Katmanların bir başka davranışı var ki, diğer yaklaşımlardan farklı olmalarına neden olur. Eğer yerleştirilmiş bir öğe diğer yerleştirilmiş öğenin içinde olursa, içerde olan 'layers' (katmanlar) birikimin içindeymiş gibi görünmez. Aslında dış katmandaki belge nesnesinin içindeymiş gibi davranır. Bunun anlamı ID değeriyle bir katmana erişmek için belgedeki tüm katman birikimlerinin tarayıp uygun olanı bulunca durulmalıdır. ID değerleri tüm belgede tekil olmak zorunda olduğundan, bu tür taramanın gereksiz bir emek olduğu doğrudur. Zaten bu yüzden yöntem de terk edildi.

Yaklaşımları birleştirme

Üç teknik bir işlev altında toplanabilir. DOM yöntemi (eğer varsa) kullanılır. Eğer hata olursa, tescillli DOM kullanılır, o da çalışmazsa katmanlar kullanılır. Eğer belgenin katman birikimleri arasında da bulunmazsa katmanların içindeki katmanları arar ve tekrar döngüye girer.
function getRefToDiv(divID,oDoc) {
  if( document.getElementById ) {
    return document.getElementById(divID); }
  if( document.all ) {
    return document.all[divID]; }
  if( !oDoc ) { oDoc = document; }
  if( document.layers ) {
    if( oDoc.layers[divID] ) { return oDoc.layers[divID]; } else {
      //tüm çocuk katmanlarda yineleyerek ara
      for( var x = 0, y; !y && x < oDoc.layers.length; x++ ) {
        //başarıda o katmanı döndür aksi halde hiçbir şey döndürme
        y = getRefToDiv(divID,oDoc.layers[x].document); }
    return y;
    }
  }
  return false;
}

Görünürlüğü Değiştirme

  1. iCab 2- görünürlüğü desteklemez (visibility).
  2. OmniWeb 4.2- görünürlülükte sıkça hata yapar.
  3. Birçok donanım tarayıcıları görünürlülüğü küçük ekran kalıplama konumundayken dikkate almaz.
Görünürlülük stilini değiştirmek yerleştirilmiş öğenin görünemsine ya da kaybolmasına neden olur. 'visible' ya da 'hidden' değerini alır. Katmanlı tarayıcılar 'show! ve 'hide' kullanır. Bazı katmanlı tarayıcılar her ikisini de destekler. Buradaki kod hangisinin geçerli olduğunu bulur ve onu kullanır. Birisini bulup diğerini varsaymak yerine bu daha uygundur.

Bir kez yerleştirme öğesine eriştiniz mi, hemen onun stiline erişmek istersiniz. katamansız tarayıcılarda erişimin sonuna '.style' eklemeniz gerekir. Katmanlı tarayıcılarda stiilleri, öğenin doğrudan özellikleri olarak yorumlamak gerekir. Hangisini kullanmak gerektiğini saptamak için stil özelliğinin varlığının denetlenmesi gerekir. Doğru değer şöyle hazırlanır:

Bunların hepsinden sonra, yerleştirilmiş bir öğeyi görünebilir yapmak için:
function showDiv(divID_as_a_string) {
  //yukarıdaki gibi bir erişim elde et...
  myReference = getRefToDiv(divID_as_a_string);
  if( !myReference ) {
    window.alert('Nothing works in this browser');
    return; //daha ileri gitme
  }
  //now we have a reference to it
  if( myReference.style ) {
    //DOM & tescilli DOM
    myReference.style.visibility = 'visible';
  } else {
    //katmanlar yazım kuralı
    myReference.visibility = 'show';
  }
}

showDiv('myDiv');

...   ...

<div style="position:absolute;left:0px;top:0px;" id="myDiv">
    içerikler
</div>

Denemeyi burada yap gizli öğeyi burada göster. gizli öğeyi göster.

Bu yerleştirilmiş öğe saklanmıştı. Onu yine gizle.


Tabi ki uyarı mesajında 'bu tarayıcıda hiçbir şey çalışmıyor' yerine onlara daha neşeli bir kodlama önermek gerekirdi.

Yerleşmeyi Değiştirme

  • iCab 2- yerleşmeyi desteklemez.
  • OmniWeb 4.2- göreceli yerleştirmeyi anlamaz, mutlak yerleştirmede hatalar yapar.
  • WebTV yalnız yatay yerleştirmeyi değiştirebilir, düşeyi değiştiremez.
  • Clue tarayıcı bazen yalnız yatay yerleştirmeyi değiştirebilir ve bazen yerleşimin değiştirilmesini değiştirmez.
Yerleştirmeyi 'left' ve 'top' değerlerini kullanarak ayarlarsınız aynı görünebilirliği belirttiğiniz gibi... (Biliniz ki buradaki 'top frameset' erişimindeki window.top ile aynı değildir). 'left' ve 'top' özelliklere erişmek için 'top' ve 'left' stil tanımı değerleri satıriçi stil yazım kurallarıyla ya da Javascript ile ilk değer vererek belirlenir.

Eğer doğrudan "doctype" kullanılırsa, bir çok tarayıcı doğru birim (20px, 20 değil) kullanılmasını ister. Bir çok eski tarayıcı bunu anlamaz. Opera 5 gibi (yalnız top), katman tarayıcıları, WebTV vb. Tarayıcının birimleri doğru anladığını belirten hiçbir yöntem yok. Bazı değerleri kabul edebilecektir ama desteklemeyebilir. Bu nedenle DOM destekleme açısından document.childNodes temel bir gereksinimdir. DOM stillerinde birimlerin kullanılması istenir ve bu nedenle DOM anlayabilen tarayıcılar birimleri de anlayabilir.

Bu örnekte 'left' ve 'top' başlangıçta ikiside 10px olarak atanmıştır (satıriçi stil niteliğiyle). Kodlama önce '.style' erişiminin kullanılabilirliğine bakar ve eğer öyleyse stil nesnesini değiştirebilir. Sonra o anki değerleri alır, üzerine yenilerini ekler ve bunu yeni değer olarak atar. O anki değeri alırsa, parseInt kullanarak sayı elde eder. Çünkü değerin içinde birim de bulunabilir.
<div style="position:absolute;left:10px;top:10px;" ...

... ...

var noPx = document.childNodes ? 'px' : 0;
if( myReference.style ) { myReference = myReference.style; }
myReference.left = ( parseInt(myReference.left) + 10 ) + noPx;
myReference.top = ( parseInt(myReference.top) + 20 ) + noPx;
'div' 10 px aşağıya ve 20 px sağa kaydırılır. Şu andali koordinatları top: 30px; left: 20px; olur.

Burada dene: Bu öğeyi taşı.


Bu zaman sayacıyla birlikte kullanılırsa, her birkaç milisaniyede bir yerleştirilmiş bir öğeyi kayma aralığıyla orantılı yeniden yerleştirebilir. Böylece ekranda durmuş gibi görünür (position: fixed; hala IE tarafından pek desteklenmemektedir).

Art alan rengini değiştir

  • Eski Gecko tarayıcıların çabuk geçiştirilebilecek hataları vardır.
  • WebTV ve OmniWeb 4.2- art alan rengini değiştirmenize izin vermez.

Yazı rengini değiştirmek de istenebilir. Ama katman tarayıcıları bunu yapamaz. Art alan rengini değiştirmenin üç yolu vardır. Katman tarayıcıları bgColor kullanır. DOM ve tescilli DOM tarayıcıları background ve backgroundColor kullanır. Opera 5.x yalnız artalan stilini değiştirebilir, diğerleri (Opera 6+ dahil) her ikisini de değiştirir. 'myReference' yukarıdaki gibi elde edilir. Not: Opera 5'in bazı sürümleri eğer açıkça belirtilmişse ve kalıtımsal değilse, yalnız art alan rengini değiştirir.

Eğer bgColor denemesi yaparsanız, Opera 7-7 'Warning' mesajını döndürür. Eğer hangisi diye deneme yapıyorsanız bunu en son kullanın.
if( myReference.style ) { myReference = myReference.style; }
if( myReference.background ) {
  //tarayıcıların çoğunda desteklenir
  //Gecko tarayıcısı gibi olanlar ve IE serisi
  myReference.background = '#00ff00';
} else if( myReference.backgroundColor ) {
  //çoğu tarayıcılar destekler
  myReference.backgroundColor = '#00ff00';
} else if( myReference.bgColor ) {
  //katman tarayıcıları kullanır
  myReference.bgColor = '#00ff00';
} else {
  //HATA, art alan rengi değiştirme olanağı yoktur.
}
Yanlış olanı atamak sorun çıkartmadığına göre aşağıdaki gibi kısaltma yapılabilir:
if( myReference.style ) { myReference = myReference.style; }
myReference.bgColor = '#00ff00';
myReference.background = '#00ff00';
myReference.backgroundColor = '#00ff00';

z-index değiştirmek

  • iCab 2- yerleştirmeyi desteklemez bu nedenle z-index desteklemez.
  • WebTV ve Clue tarayıcı z-index desteklemez.
Yerleştirilmiş öğelerin z-index değerleri bir biri üzerine istiflenmiştir. z-index positif bir sayı olmalıdır. z-index yüksek olursa onun üzerine istiflenmiş öğe sayısı da çok olur. İki öğenin z-index değeri aynı olamaz. yerleştirilmiş bir öğenin z-index değerini okumak için daha önceden inline yazım kuralıyla tanımlanmış olması gerekir.
if( myReference.style ) { myReference = myReference.style; }
myReference.zIndex = 100;
Burada deneyin: öğenin üzerindeki bağı tıklayın ki onun z-index değeri diğerinin üstüne çıksın.

Küpür Kesme (clipping) değiştirmek

  • Opera 6-, Konqueror 3.0-, OmniWeb 4.2-, WebTV, NetFront 3.3-, iCab 2- ve Tkhtml Hv3 küpür kesmeyi desteklemez (iCab 2- yerleştirmeyi desteklemediğinden kesme de yapamaz).
  • Internet Explorer "standart rendering model" konusunda bugünkü standartları izlemez ve aşağıdaki gibi özel ilgi gerektirir.
  • Opera 7-7.1 (daha sonraki sürümlerde düzeltildi), art alan rengi küpür kesme (clipping) sırasında kesilen küpürde gözükür. Çözümü bir öğeyi kesince renkli bir öğeyi içinde tutmaktır.
  • Escape 4.x stil nesnelerini desteklese de, sytle.clip yazım kuralını desteklemez.
Küpür kesme yalnız mutlak yerleştirilmiş öğelerde geçerlidir.

Bu teknik çoğunlukla mesaj kaydırmada kullanılır. Küpür kesme desteklemeyen tarayıcılarda aynısını iframe ile sağlama olanağı vardır. Böylece onun içinde kaydırma yapılabilir.

Küpür kesme bu öğede yapılabilir mi diye denemek isteyeceksinizdir (bunu yapmaya hiç gerek yok, çünkü tarayıcılar anlamazlarsa dikkate almadan atlarlar). Bunu anlamak da hiç kolay değildir. Opera 6- gibi tarayıcılarda 'clip style' sorulduğunda 'rect()' der ama onu hiç kullanamaz. Bunu geçmenin bir yolu da yoktur. Yapılabilecek en iyi şey myReference.innerHTML ve myReference.clip destekleniyor mu onu bulmaktır. Bir tarayıcı innerHTML destekliyor ama kesmeyi desteklemiyorsa bunun sorun olması diye bir şey olmaz. Ama 'clip' stili arandığında 'rect()' yanıtı alısa bile küpür kesmeyi desteklemez. Escape stil nesnelerini destekler ama style.clip yazım kuralını desteklemez.
if( myReference.clip ) {
  myReference.clip.left = 0;
  myReference.clip.top = 0;
  myReference.clip.right = 10;
  myReference.clip.bottom = 10;
} else if( myReference.style ) {
  //sıralama şöyledir: top right bottom left
  myReference.style.clip = 'rect(0px,10px,10px,0px)';
} else {
  //HATA, hiçbir şey çalışmıyor
}

Burada denetin: Aşağıdaki yerleştirilmiş öğe için küpür kesme dikdörgeni seçin. Art alan kaydırılacak yazının nereye gizlendiğini gösterecektir.

Yerleştirilmiş öğenin birinci satırı.                 Tarayıcınız küpür kesmeyi desteklemiyor.
Yerleştirilmiş öğenin ikinci satırı.

Artalan Artalan Artalan
Artalan Artalan Artalan

Her ne kadar CSS 2.1 standartları tarayıcıların 'rect()' işlevinin parametreleri arasında virgül olmasını istese de IE 6 ve 7 bu kuralı uygulamaz (CSS 2.0 tanımlarındaki bir hatadan dolayı). Hata, stiller stil sayfaları arasında olursa karıştırılırken, kodlama içinde olursa doğru yazım kuralıyla hatasız çalışır. O halde stil sayfalarında bu özellik nedeniyle bir virgülle ayrılmış parametreler kullanarak, bir de virgül kullanmadan yazmak yararlıdır. Tarayıcılar hangi yöntemi kullanacaklarını kendileri bulurlar.

Boyut değiştir

  • WebTV öğe boyutunu değiştiremez.
  • Escape/Evo 5 document.childNodes için hata verir.
  • ICEbrowser öğe boyutlarını değiştirir ama tarayıcı penceresi boyutları değişinceye dek belli etmez.
  • iCab 2- tuhaf üst üste binmelere neden olur çünkü, yerleştirmeyi desteklemez.
  • Clue tarayıcıda öğe kaybolur.
Katman tarayıcıları 'resizeTo' yöntemini kullanmanızı bekler. Bazı tarayıcılar stil nesnesinin pixelWidth ve pixelHeight özelliklerinin değiştirilmesini ister. Kalan tarayıcılar stil nesnesinin height ve width özelliklerini değiştirir. Nasıl olsa bu son iki özellik değiştirilir. Tarayıcı neyi anlar çok önemli değildir. Tarayıcı anlamadığını atlar. Katmanlı tarayıcılarda bu 'clip.bottom' ve 'clip.right' değerleri o anki boyutları okumak için gerekli özelliklerdir. Katman her iki kesmenin (clip) ötesine çok doğru olmasa da bu tür tarayıcıların sunabildiği en iyi değerdir. Katmanlı tarayıcılarda en ve boy değiştirilir, sağ ve alt özellikleri kesme nesnesinde değiştirilir.

Bazı tarayıcılar bazı öğeleri içeriğinden daha çok küçültmez. Bazıları içeriği yeni boyutlara göre keser. Bazıları öğenin boyutlarını küçültür ama içeriği olduğu gibi bırakır (görüntülenmiş olarak).

Öğe yerleşiminde olduğu gibi, bazı eski tarayıcılar boyuttan sonra ölçü birimi (px) yazılmasını istemez, ama yeni tarayıcılar 'doctypes' için zorunlu tutar. Yine küçük bir denetim, iyi ile az iyi tarayıcıları belirler. Bunlar aşağıda tanımlamıştır:
if( myReference.style ) { myReference = myReference.style; }
if( myReference.resizeTo ) {
  myReference.resizeTo( newWidth, newHeight );
}
var noPx = document.childNodes ? 'px' : 0;
myReference.width = newWidth + noPx;
myReference.pixelWidth = newWidth;
myReference.height = newHeight + noPx;
myReference.pixelHeight = newHeight;

Burada deneyin: öğe için yeni boyut belirle:

Dene
Dene

İçeriği yine yazmak

  • Opera 6- ve OmniWeb 4.2- yerleştirilmiş öğelerin içeriğini yazamaz.
  • WebTV program kırılır.
  • Katmanlı tarayıcılar mutlak yerleştirilmiş öğelerin içeriğini değiştirebilir.
  • Netscape 4 yerleştirilmiş öğelerde içerik yine yazıldığında stillerini kaybeder.
  • Clue tarayıcısında, öğe altındaki öğeyle birlikte birden yok olabilir.
Aşağıdaki örnekte, myReference önceki gibi elde edilir. Birçok tarayıcı innerHTML özelliğini sunar. Yeni HTML ile yine yazabilirsiniz. Katmanlı tarayıcılar document nesnesinde yöntem açma, yazma ve kapatma işlemini yapmanızı sağlar. Opera gibi tarayıcılar yerleştirilmiş öğenin document özelliğini kullanıma sunar ama erişim ana belge ile olur. Yine yazmanın sorunların bitmesini sağlamaz. Bu nedenle bunun ilk seçenek olmadığını bilmek gerek.
if( typeof( myReference.innerHTML ) != 'undefined' ) {
  //tüm tarayıcılarla kullanılır
  myReference.innerHTML = 'bazı yeni içerik';
} else if( myReference.document && myReference.document != window.document ) {
  //katmanlı tarayıcılarla kullanılır
  myReference.document.open();
  myReference.document.write('bazı yeni içerik');
  myReference.document.close();
}
'iframe' tanımlayarak Opera 5 ve Opera 6 destekleyecek biçimde yetenekleri genişletmek olanağı vardır (bu 'name' niteliğinde olmalıdır). Yüklendiği denenmeli sonra içeriğinin yine yazılması sağlanmalıdır:
if( typeof( myReference.innerHTML ) != 'undefined' ) {
  //şu andaki tüm tarayıcılarla kullanılır.
  myReference.innerHTML = 'some new content';
} else
  if( myReference.document && myReference.document != window.document ) {
  //katmanlı tarayıcılarda kullanılır
  myReference.document.open();
  myReference.document.write('some new content');
  myReference.document.close();
} else
  if( window.frames && window.frames.length && window.frames['nameOfIframe'] ) {
  //Opera 6- gibi tarayıcılarda kullanılır.
  myReference = window.frames['nameOfIframe'].window;
  myReference.document.open();
  myReference.document.write('some new content');
  myReference.document.close();
}

Burada deneyin: aşağıdaki yerleştirilmiş öğenin içeriğinin yine yazılması (Opera 5-6 çözümü eklenmemiştir).

Bu yerleştirilmiş öğedir. İçerik daha yine yazılmış değildir.

Yeni yerleştirilmiş öğeleri yaratma

  • Opera 6- ve OmniWeb 4.2-, NetFront 3.2- ve Clue tarayıcıları yerleştirilmiş öğeleri sayfa yüklenmişse yaratamaz.
  • WebTV innerHTML değerini her zaman yanlış algıladığı için boşluk biçiminde yorumlayarak üst öğenin tüm içeriğini değiştirir.
  • iCab 2- yerleştirilmiş öğeyi yaratamaz ve onu yerleştirilmemiş öğe olarak yaratır.
Sayfa yüklenirken yeni yerleştirilmiş öğe document.write ve düzgün HTML ile yaratılır. Sayfa bir kez yüklenince, 5. kuşak tarayıcılar herhangi bir yeni öğe yaratılmasını sağlar. Bazı 4. kuşak tarayıcılar sayfa yüklendikten sonra da yeni öğeler yaratılmasına olanak verir.

Bir çok tarayıcı bir öğenin innerHTML özelliğinin değiştirilmesine olanak verir (IE serisi aynı zamanda insertAdjacentHTML işlemini sunar ama diğer DOM tarayıcıların çoğu bunu işlemler arasına eklememiştir). Katmanlı tarayıcılar (Omniweb 4.2- hriç) yeni boş katman yaratan bir yapı sağlarlar. Bu yeni katmanın içine yazılabilir. Bunu kullanmadan önce geçerliliği denenmelidir. OmniWeb 4.2- katman yapılarını sunsa da, bunu kullanmak hataya neden olur. Bu nedenle document.classes ile OmniWeb 4.2- ayrılmış ve korunmuş olur.

Katman yazım kurallarıyla, yeni katman sayısal diziniyle katmanlar birikimine eklenmiş olur. Ama adlar birikimine eklenmez. Eğer istersek biz kendimiz onu o listeye (birikime) ekleriz. Biz bu katman için adıyla eninin büyüklüğünü tanımlamalıyız. Her katmanlı tarayıcıda başka türü görüntülenir. Gizlidir. Onun görünür olmasını sağlamalıyız. innerHTML yazım kuralıyla herhangi bir yeni içeriği yaratabiliriz. Tarayıcılar arası olması için yerleştirilmiş öğe olması gerekir.

Opera 7-7.1 innerHTML okunurken üst düzey öğenin tüm var olan biçimleri hatalı ayıklar, tuhaf bir etki yaratmış olur. Bu sorunu gidermek için insertAdjacentHTML kullanın (eğer tarayıcı destekliyorsa).

Aşağıdaki ilk örnekte, yerleştirilmiş öğe document (belgenin) çocuğu olarak yaratılır.
if( document.layers && window.Layer && document.classes ) {
  //350px eninde bir katman yarat
  document.layers['newName'] = new Layer( 350 );
  //içeriğini yaz
  document.layers['newName'].document.open();
  document.layers['newName'].document.write('yeni içerik');
  document.layers['newName'].document.close();
  //stil ver
  document.layers['newName'].left = 0;
  document.layers['newName'].top = 0;
  document.layers['newName'].visibility = 'show';
} else if( document.body ) {
  var theString = '
yeni içerik
'; if( document.body.insertAdjacentHTML ) { document.body.insertAdjacentHTML( 'beforeEnd', theString ); } else if( typeof( document.body.innerHTML ) != 'undefined' ) { document.body.innerHTML += theString; } else { //HATA, hiçbir şey çalışmıyor } } else { //HATA, hiçbir şey çalışmıyor }
Aşağıdaki örnek yerleştirilmiş bir öğenin çocuğu olarak yeni yerleştirilmiş öğe yaratır (myReference yukarıdaki gibi elde edilmiştir):
if( document.layers && window.Layer && document.classes ) {
  //350px eninde katman yarat
  document.layers['newName'] = new Layer( 350, myReference );
  //içeriğini yaz
  document.layers['newName'].document.open();
  document.layers['newName'].document.write('yeni içerik');
  document.layers['newName'].document.close();
  //stille
  document.layers['newName'].left = 0;
  document.layers['newName'].top = 0;
  document.layers['newName'].visibility = 'show';
} else {
  var theString = '
yeni içerik
'; if( myReference.insertAdjacentHTML ) { myReference.insertAdjacentHTML( 'beforeEnd', theString ); } else if( typeof( myReference.innerHTML ) != 'undefined' ) { myReference.innerHTML += theString; } else { //HATA, hiçbir şey çalışmıyor } }
Burada deneyin: yeni bir öğe yarat (yeni öğe renk açısından biraz daha farklıdır ve birbirlerinden azıcık kaymıştır (ne olduğu daha kolay belli olsun diye).

Burada deneyin: yeni öğe yaratın (yeni öğeler renkleri açısından farklı olacaktır ve azıcık birbirlerinden kaymış olarak görüntülenir (ne olduğu kolay belli olsun diye).

Bu yerleşirilmiş öğenin ilk içeriğidir. Bu değişmez.

  • Opera 5, OmniWeb 4.2- ve Escape/Evo belgenin art alan rengini değiştiremez (Escape art alan rengini değiştirir, ama yalnız belgenin en sonunda tüm içeriklerden sonra).
  • Opera 6 ve Clue tarayıcıları yalnız içeriğin ardındaki rengi değiştirebilir, İlk art alan rengi orada kalır (eğer içerik pencere boyundan küçükse).
  • NetFront 3.3- rengin değerini '' yapmanıza olanak verir, ama kaydırmadan hiçbir değişikliğe izin vermez.
Art alan rengini değiştirmenin üç yolu vardır. Eski tarayıcılar bgColor özelliğini kullanarak tüm belgenin stilini ayarlar. Yeni tarayıcılarda, HTML öğesi ve BODY öğesi ayrı ayrı değerlendirilir. Varsayılan olarak HTML öğesi BODy öğesinin birkaç pizel dışından dolanır. Ayrı stillendirilirler. Belgenin art alanını değiştirmek için her ikisinin de değiştirilmesi gerekir. HTML öğesi bu tarayıcılarda document.documentElement ile erişilir ve BODy normal document.body ile erişilir.

Yanlış olanı atamak hata oluşturmaz (var olduğu sürece), o halde hepsi birden aynı anda kullanılır.
if( document.documentElement && document.documentElement.style ) {
    document.documentElement.style.backgroundColor = 'red'; }
if( document.body && document.body.style ) {
    document.body.style.backgroundColor = 'red'; }
document.bgColor = 'red';

Burada deneyin: Bu belgenin art alan rengini:

Bir öğenin görüntülenme stilini değiştirme

  • WebTV display stilini desteklemez.
  • Uyarı: Netscape 4, Escape 4, Opera 6-, OmniWeb 4.2-, NetFront 3.2- ve Clue tarayıcılar display: none; stilini destekelr, ama javascript kodlamasının değiştirmesine izin vermez.
  • iCab 2- bazen display stilini değiştirme hata yapar ve 'block' yorumu 'varsayılana dön' (return to default) olur.
  • Birçok donanıma özel tarayıcılar display stilini dikkate almaz (küçük ekran yine kalıplama konumundayken).
  • Windows üzerindeki Internet Explorer 4 inline display konumunu hiç anlamaz.
  • Escape 4 gerçekte display stilini değiştirmenize izin verir (ama inline, block ve none layers ve ilayers altında kabul edilir) display stilinin en iyi kullanımı yerleştirilmemiş öğelerle olduğundan, bu değişiklikler Escape altında pencere boyutları değişmeden etkili olmaz.
NOT: Birçok ana tarayıcı display stilini destekler ve herhangi bir öğeyi satıriçi öğe gibi görüntülenmesine (display:inline;), blok öğe gibi olmasına (display: block;) ya da hiç görüntülenmemesine (display: none;) olanak tanır. Başkaları daha başka görüntü stillerini de destekler. Ama her tarayıcı display stilini javascript ile değiştirmenize izin vermez.

Bu nedenle display stilini sayfa tümüyle yüklendikten sonra kodlamayla değiştirilmelidir. Bunu anlamayan tarayıcılar yapılmak isteneni dikkate almayacaktır ve kullanıcının içeriği görüntülemesine izin verecektir.

Display stili görünebilirlik (visibility) stilinden çok farklıdır. Görünebilirliği 'hidden' yapmak, o öğenin görünmesini engellemektir ama sayfadaki yeri boş kalır. Display stilini 'none' yapmak onu görüntüden kaldırır ve boşluğu dolduracak biçimde sayfayı yeniden düzenler. Bu menü sistemleri için çok kullanışlı bir özelliktir. Çok küçük bir programlamayla tarayıcı sayfanın yeniden güzel görünmesini sağlamış olur.

Öğelerin kendi display stilleri olmasına izin veren tarayıcıların hepsi document.getElementById ya da document.all kullanırlar (document.layer değil). Bu da işi biraz kolaylaştırmış olur. Tabi ki kullanıcıya kodlamanın onun tarayıcısında çalışmayacağını söylenebilir. Bunun için önce display stil değiştirme olanağımız olup olmadığına bakılmalıdır. O zaman varsayılan değer: 'span' gibi öğeler için 'inline', paragraf ve 'div' gibi öğeler için block olur.

HTML

Bu örnekte paragraf içinde span vardır.

Bu bir paragraftır. Bu da bir paragraf içinde span'dır ve display stili, satıriçi stil tanımıyla 'inline' olarak belirtilmiştir. Bu da aynı paragrafta bir başka satırdır. Ama span içinde değildir.

JavaScript

function changeDisplay( elementId, setTo ) {
  var theElement;
  if( document.getElementById ) {
    //DOM
    theElement = document.getElementById( elementId );
  } else if( document.all ) {
    //tescilli DOM
    theElement = document.all[ elementId ];
  }
  if( !theElement ) {
    /* Yüklenmemiş sayfa, ya da tarayıcı 
    document.getElementById ya da document.all desteklediğini
    söylese bile, gerçekte kullanılamamaktadır */
    return;
  }
  //stile erişimi sağla
  if( theElement.style ) { theElement = theElement.style; }
  if( typeof( theElement.display ) == 'undefined' ) {
    //Tarayıcı display stilini değiştirmemize izin vermez
    //Anlamlı bir mesaj ver
    window.alert( 'Tarayıcınız bunu desteklemiyor');
    return;
  }
  //display stilini değiştir
  theElement.display = setTo;
}

Burada dene: aşağıdaki paragrafta span için görüntü stili seçme

Bu paragrafta, paragraf içinde tanımlanmış span vardır ve display stili 'inline' değerine atanmıştır. Bu da başka bir paragraftır ama span içinde değildir.