XHTML Strict target Sorunu isimli yazımda, Strict formundaki DTD’lerde target özelliğinin geçerlilik testinden geçmemesi konusu ve alternatif çözüm yollarına değinmiştim. Bu noktada standartlardan ödün vermek istemeyen, ama target özelliğini de kullanmak isteyen web geliştiricilerinin imdadına Javascript yetişiyor.
İlk olarak ham Javascript kullanarak linklerimizi yeni pencerede açtıralım. Her zamanki gibi önce XHTML içeriğimizi oluşturalım.
<p>Lorem ipsum <a href="http://www.yahoo.com" rel="disari"> dolor sit amet</a>, consectetur adipiscing elit. <a href="#">Aliquam at sem</a>. Aenean quis neque eu quam euismod commodo. Quisque dictum. Pellentesque vitae lectus. Duis non dolor. Morbi vehicula leo ut purus. <a href="http://www.adobe.com" rel="disari">Curabitur</a> ut quam. Quisque vehicula. Donec placerat, mi sollicitudin pellentesque congue,</p>
Yukarıda da görüldüğü gibi bir paragraf etiketinin içerisinde üç adet link (a) bulunmakta. Bunlardan ikisi harici bağlantılara giderken, bir tanesi dâhili bir sayfaya gidiyor. Harici linkleri javascript kullanarak seçebilmek için rel özelliğini kullanıyoruz. rel özelliğiyle, bir linkin hedef adresi ile olan ilişkisini tanımlarız.
Javascript kodumuzu yazarsak;
<script type="text/javascript">
<!--
// Javascript fonksiyonumuzu tanımlıyoruz
var yenipencere = function () {
//sayfadaki bütün linkleri seçiyoruz
var linkler = document.getElementsByTagName('a');
//bütün linkler içerisinde arıyoruz...
for (var i=0; i<linkler.length; i++) {
var Link =linkler[i];
// eğer linkin rel özelliği 'disari' ya eşitse
if(Link.getAttribute("rel") == 'disari') {
Link.target ="_blank"; //linki yeni pencerede açıyoruz
}
}
}
window.onload = yenipencere; // sayfa yüklendikten sonra çalıştırıyoruz...
-->
</script>
Kod üzerinde javascript kodunu açıklamaya çalıştım. Çalışan uygulamaya buradan ulaşabilirsiniz.
Şimdi, ham javascript ile yaptığımız bu işi JQuery kütüphanesini kullanarak yapalım…
<script type="text/javascript" src="jquery-131min.js"></script>
<script type="text/javascript">
<!--
// Sayfa yüklendikten sonra çalış
$(function() {
//rel = 'disari' olan bütün linkleri seç
$('a[rel=disari]')
.click(function() { //linklere tıklandığında
this.target="_blank"; //tıkladığını yeni pencerede aç
});
});
-->
</script>
Çalışan uygulamaya buradan ulaşabilirsiniz.
Böylece aynı işi gören iki javascript programcığı yazmış olduk. Dikkat edilirse JQuery kullanılarak aynı kodu, çok daha okunabilir ve kısa olarak yazmış olduk.
Bu şekilde Javascript kullanarak hem uygulamamızda target özeliğini kullanabiliyoruz, hem de W3C geçerlilik testinden sorunsuz geçmiş oluyoruz. Fakat burada gözden kaçmaması gereken önemli bir nokta var; o da, kullanıcıyı linki yeni pencerede açmaya zorlamamız. Bu noktada erişilebilirlik çerçevesinde düşündüğümüzde, yaptığımız sadece W3C’yi kandırmak olsa gerek.
Fırından yeni çıkmış yazılardan haberdar olmak için RSS yayınıma abone olabilir ya da beni Twitter'dan takip edebilirsiniz.
Yorumla BakalımBu Makale için toplam 8 adet yorum bulunmaktadır...
Bu Makale 6 February, 2009 ve saat 14:36 itibariyle Javascript/JQuery kategorisi altına kaydedilmiştir. Bu makale ile ilgili yorumları RSS 2.0 beslemesinden takip edebilirsiniz.. Bu makale için yorum yapabilir, veya kendi web sitenize trackback sağlayabilirsiniz...
6 February, 2009 ve saat 16:15:14'de gönderdi...
Öncelikle teşekkür ederim.
Sizinde dediğiniz gibi, bu yolun tek amacı valid tool’u kandırmak
target blank kullanmak, kullanıcı dostu olma uğraşında bize eksi puan kazandırıyor. Yani kullanıcı hangi linkin yeni pencerede açacağına kendi karar vermeli. Zaten bu yüzden standartlara aykırı diye nitelendiriliyor bu özellik.
Yine de, target blank kullanmak zorunda kaldığımız noktada, mutlaka işimize yarayacak bir yöntem. Teşekkür ederim.
Bu arada, js kod bloğunun son yorum satırında “// sayfa yüklendikten sonra çalıştırıyoruz… ” demişsiniz. windows.onload sayfa yüklenmeden önce çalışmasını sağlamıyor mu? yoksa ben mi karıştırıyorum?
6 February, 2009 ve saat 16:41:27'de gönderdi...
@Ertugrul merhaba, yazıya ilgin için teşekkürler…
window.onload sayfa yapısında DOM oluştuktan ve sayfa load işlemi hemen bittikten sonra devreye giriyor. Bu konuyla ilgili şurada da bir yazı var… Şurada JQuery çerçevesinde olaya nasıl yaklaşıldığı anlatılıyor…
Kolay gelsin…
27 April, 2009 ve saat 21:29:31'de gönderdi...
Teşekkür ederim Özgür. W3C ve sorunlarını irdeleyen fazla kişi bulunmuyor piyasada. Böyle bilgiler oldukça makbule geçiyor. Tekrar teşekkürler
27 April, 2009 ve saat 21:38:03'de gönderdi...
Ben teşekkür ederim Erhan, faydası olmasına sevindim…
Kolay gelsin…
14 June, 2009 ve saat 17:07:22'de gönderdi...
Merhabalar bende bu konuya değinmiştim zamanında.
JQuery ile çok kısa bir yolu daha var aslında..
$(document).ready(function(){
$(‘a.target’).attr(‘target’,'_blank’);
});
14 June, 2009 ve saat 18:07:07'de gönderdi...
@Akın yazıya katkından dolayı teşekkür ederim, verdiğin çözüm basit ve güzel… Benimkiyle olan farkı sen inline olarak target özelliğini XHTML içerisine yazdırıyorsun, ben ise target özelliğini XHTML içerisine yazdırmadan (tam unobtrusive) çözüm getirmeye çalışıyorum…
Teşekkürler tekrar
16 June, 2009 ve saat 11:53:45'de gönderdi...
Evet o benim kişisel egomdan kaynaklanıyor =) her olayda func çalıştırmaktansa bir kere sayfa yüklenmesinde işlem yaptırmak içimi rahatlatıyor. Bunun kayda değer bir performans (hatta hiçbir etkisi) olmadığını bilsemde içimi huzur kaplıyor =))
18 August, 2009 ve saat 14:59:41'de gönderdi...
Güzel bilgi teşekkürler…