HTML sayfalarına CSS, Javascript, resim video, ses vd. dosyaları ekleyebilirken diğer html dosyalarını eklemek için iframe, ajax isteği ile veya çakma script dosyası gibi gösterilmiş html dosyaları ile ekleyerek yapıyorduk/yapıyoruz. HTML import ile artık html dosyalarımızı html içine ekleyebileceğiz.

HTML kodlama yapımızı değiştirecek bu yapıyı henüz sadece Chrome ve Chrome alt yapısını kullanan tarayıcılar(Opera ve Chrome mobil) destekliyor.

HTML içine HTML’i eklerken normal CSS ve Javascript ekler gibi ekliyoruz. Bir iki farklı yanı var. İlk fark rel=”import” kısmı. İkinci fark ise direk HTML içine eklenmiyor içerik. Bu kod ile tarayıcı yüklüyor, sahne arkasında saklanarak kulanıma hazır hale geliyor. Biz kullanmak istediğimizde javascript ile bu içeriği ekliyoruz.

Kullanımı;

<head>
  <link rel="import" href="/sablonlar/ekmek.html">
</head>

Önemli bir not: Bu yöntem ile aynı domain altındaki dosyaları ekleyebiliyoruz. Farklı domain’den çağıralacak dosyalar için CORS özelliğinin açılması gerekmektedir.

Daha sonra işin içine javascript giriyor.

<link rel="import" id="sablon" href="ekmek.html">

İlk olarak javascript ile daha kolay erişmek için import koduna bir id=”sablon” ekleyelim. Daha sonra ayrı html dosyası oluşturalım mevcut HTML’in içine ekleyeceğimiz.

ekmek.html;

<section id="icerik">Ekmke 1 TL</section>

Mevcut HTML’in body kısmında javascript ile import elemanını yakalayalım.

var ekmekAl = document.querySelector('#sablon');

Sonra içe aktracağımız HTML’in içindeki elemanı yakalayalım.

var ekmekIci = ekmekAl.import.querySelector('#icerik');

Son olarakta aldığımız bu içeriği mevcut HTML içine ekleyelim.

document.body.appendChild(document.importNode(ekmekIci, true));

Sonuç aşağıdaki ekran görüntüsündeki gibi olacaktır.

HTML import

Örnek bir dokümanı oluşturup, kendi bilgisayarınızda açtığınızda yukarıdaki sonucu göremeyeceksiniz. Görmek için bir Server’a ihtiyacınız olacak. Örneğin http://localhost gibi bir urlde erişmeniz gerekecek.

Eklenen html dosyası CSS ve Javascript dosyaları gibi mevcut HTML’in yüklenmesini bloklayacaktır. Bunu engellemek için async özniteğini eklemek yeterlidir.

<link rel="import" id="sablon" href="ekmek.html" async>

Desteklemeyen tarayıcılar için

Bu özelliği başta belirttiğim gibi sadece Chrome tabanlı tarayıcılar desteklemektedir. Peki desteklemeyenler için bir çözüm yokmudur derseniz. İlk olarak bu özelliği taracının destekleyip desteklemediğini kontrol etmek için

if ('import' in document.createElement('link')) {
    // HTML imports destekleniyor
} else {
    // HTML imports desteklenmiyor.
}

böyle bir javascript kodu var. Ayrıca Polymer grubunun ürettiği HTMLImports adlı bir çözüm var.

Sonuç

Bir çok alanda kullanılabilecek güzel bir yapı. Benim ilk duyduğumda sadece html ile yapılan bir yapı olduğunu düşünmüştüm. Sonra işin içine javascript girdiğini öğrendiğimde biraz soğudum, ama buda iyidir. Sadece html ile yapmak daha güzel olurdu.

Sonuç olarak güzel bir özellik ama bazı sorunlarıda beraberinde getiriyor. Örneğin sonradan javascript yardımı ile eklenen html arama motorlarının tarama alanı dışana çıkması sorunu oluşturacaktır. Google’un javascriptleri yorumlayacağı durumda bu sorun olmaktan çıkacak gibi. Ama henüz erken.

Kaynaklar

HTML’de bir dokümanı kullanıcıya indirtmek için bir bağlantı verdiğimizde parantez içinde “sağ tılayın ve çıkan menüden farklı kaydet’e basın” ibaresini yazardık. Bu konuda farklı çözümler var; tarayıcıya eklenti kuranlar, .htcacces’den ayar yapanlar filan. Tabi kullanıcılar için çok iyi bir deneyim değil ve kod yazanlar için ayrı bir uğraş gerektiren çözümler. W3C bunu fark etmiş olmalı ki bize basit ve güzel bir çözüm üretmiş.

HTML5 download özniteliği

Kullanımı çok basit;

<a href="dersin_dokumani.pdf" download>Dersi indir</a>

Yukarıda görüldüğü gibi gayet basit bir çözüm var.

Ayrıca bu özniteliğe bir değer atayıp indirilen dosya ismini belirleyebiliyoruz.

<a href="dersin_dokumani.pdf" download="html5">Dokümanı indir</a>

Dinamik üretilen bağlantılar için güzel bir çözüm bence;

<a href="rapor_20141223.pdf" download="rapor">Raporu indir</a>

Ayrıca inidirilecek dokümanın formatını değiştirebiliyoruz.

<a href="https://fatihhayrioglu.com/last-child-secisi/index.html" download="last_child.txt">last-child seçicisi makalesini indir(txt)</a>

Örnek: last-child seçicisi makalesini indir(txt)

Dosya eğer bağlantı ile aynı domain değilse Firefox eski indirme alışkanlıklarına dönüyor.

Tarayıcı Desteği

Chrome explorer Firefox
14 - 20

Mobil Tarayıcılar

Android Mobil Safari Chrome
4.4 - 39

Kaynaklar

Sahibinden.com’da angularjs ile çalışıyoruz. Bazı sorunlarla karşılaşıyoruz. Bunları buraya yazmanın benzer sorunları yaşayanlar için güzel bir kaynak olacağını düşündüm.

Başlıkta tam olarak açıklayamadığım sorunu şöyle anlatabilirim; Bir inputumuz olsun, biz bu inputa girilen değeri başka bir alanda kullanıcı yazarken göstermek isteyelim. İşte sorun da tam bu noktada oluyor. Eğer bu değerini alacağımız inputa bir form kontrolü tanımlandı isek mesela ng-minlength=”5” başka bir alanda göstermek istediğimiz bu girdi değeri bu içerik 5 karakter olana kadar görüntülenmiyor. Sorun input doğrulanmadığı için değeri model’e yazılmamasından kaynaklanıyor.

Çözüm için bir direktif yazmak gerekiyor. Şu kod işimi gördü.

Angularjs 1.3 sürümünde bu sorun çözülmüş bu arada :D

## Kaynak