2010-02-14 18 views
5

JavaScript'te şablon oluşturmanın basit bir yolunu geliştirmeye çalışıyorum. Temel fikir, JavaScript'te bir nesnenin UI'sini ve bu HTML'deki JavaScript nesnesinin özellikleriyle değiştirilen değişkenleri temsil eden bir sayfada HTML olduğudur. JavaScript nesnelerini HTML sunumlarına bağlamak için bir teknik olarak düşünün.Basit bir JavaScript şablonlama tekniğini geliştirme

Herhangi bir eleştiri var mı? Bir şekilde belge parçaları kullanmalı mıyım? Aslında bu konuda bir kod incelemesi arıyorum. Herhangi bir geri bildirim için teşekkür ederiz. (Bu çerçeveden bağımsız olması gerektiğini unutmayın.) İşte bir çalışma exmaple.

<html> 
<body> 

    <!-- where templates will be injected into --> 
    <div id="thumbContainer"></div> 

    <!-- template used for thumbnails --> 
    <div id="thumbTemplate" style="display:none"> 
     <div class="thumb"> 
      <div>${caption}</div> 
      <div>${image}</div> 
     </div> 
    </div> 

</body> 

<script type="text/javascript"> 
(function() { 

    // Cache the templates' markup in case that template is used again 

    var cache = []; 

    // Magic 

    document.templatized = function(templateId, properties) { 

     // Get the template from cache or get template and add to cache 

     var template = cache[templateId] || (function() { 
      cache[templateId] = document.getElementById(templateId).innerHTML; 
      return cache[templateId]; 
     })(); 

     // Create the DOM elements that represent the markup 

     var shell = document.createElement('div'); 

     shell.innerHTML = template.replace(/\$\{(\w+)\}/g, function(match, key){ 
      return properties[key] || match; 
     }); 

     // Return those DOM elements 

     return shell.children[0].cloneNode(true); 
    }; 
})(); 

// Create DOM elements with values bound to thumbnail object 

var thumb = document.templatized('thumbTemplate', { 
    caption: 'Summer', 
    image: (function() { 
      // More complicated logic that requires conditions here... 
     return '<img src="test.png" />'; 
    })() 
}); 

// Display on page by inserting into DOM 

document.getElementById('thumbContainer').appendChild(thumb); 
</script> 
+0

+1 for magic – cherouvim

+0

Haha, teşekkürler! :) – JamesBrownIsDead

cevap

2

Kod temiz.

Şablonu bir html yorumuna sahip olsaydım, bu nedenle 1) oluşturulmuyor (görüntülemeye gerek yok: hack yok) ve 2) Doğrulamayan şeyler yapabilirim. doğrudan bir <tr>.

Ayrıca, herhangi bir html öğesiyle başlayan şablon parçacıklarını destekleyebilmem için kodlanmış 'div' oluşturmayı kaldırırdım.

Daha sonra, grafik gezinmeyi (ör. $ {Foo.bar}), yinelemeyi ve ifadeleri eklerdim.

2

+1 cherouvim: şablonu metin olarak kullanıyorsunuz, bu yüzden metin olarak saklayın. Senaryoya bir yorum olarak iletebilirsin, ya da sadece JSON kodlu bir dize olarak girebilirsin, ama bunun için işaretlemeyi kullanmak potansiyel olarak tehlikeli. Örneğin

:

<form method="${mymethod}"><table> 
    <tr><td> 
     <${mylisttype}> 
      <li> 
       <input name="foo" value="${myvalue}"> 
      </li> 
     </${mylisttype}> 
    </td></tr> 
    ${extrarow} 
</table></form> 

güvenilir şekilde döndü innerHTML geri işaretlemeyi 'şike' ve değişen tarayıcı nedeniyle şablon dilinde yapamaz bazı örnekler verilmiştir: formmethod="get" için mutasyona tabi tutulabilir (veya IE'de ihmal edilen FSR); XML modunda değilseniz, bir <tbody> öğesi eklenecektir; değişebilen eleman hiç çalışmayacaktır; ${extrarow} metni doğrudan bir tabloda geçersizdir; input.value, tarayıcıların form alanı değerlerini yeniden ayarlamaya çalıştıkça sayfa yükü üzerinde mutasyona uğrayabilir ve IE, alan değeri değişikliklerini öznitelikleri/içHTML olarak hatalı şekilde yansıtır.

Ayrıca, şiddetle bir HTML kodlamasını özelliğini (&lt; ile &amp; ile &, < değiştirilmesi ve benzeri referanslarla herhangi özellik değeri sınırlayıcıları) ekleyerek öneriyoruz. Şablonlama dilleriyle ilgili deneyim, belgeye bir metin dizesi eklemek yerine, işaretlemenin bir uzantısından çok daha yaygın olduğunu göstermiştir. Bunu yaptığınızda:

Hello, ${name}! 

değişken name kaçan uygulamadan, Çapraz site betik saldırılarına karşı uygulamayı açıyoruz. Modern şablonlar, HTML kodlamasını varsayılan olarak uygulayarak bunu önler çünkü kodlayıcılar elle yapmak için çok tembeldirler (eğer ilgili konuları bile anlarlarsa). Bu yüzden PHP uygulamalarının büyük çoğunluğu XSS saldırılarına karşı savunmasızdır.

Aynı sorunu istemci tarafına getirmeyin; yapabilirsiniz bir HTML yorumda onu kalmadan daha ziyade

<div>${caption}</div> 
<div>${image|markup}</div> 
+1

html kodlama özelliği harika olurdu – cherouvim

1

: Eğer çiğ işaretlemeyi eklemek istediğiniz (genellikle nispeten az) durumlar için kaçan istemiyoruz demek için bir bayrak sunan, varsayılan olarak kaçmayı yapmak örneğin, etiketleri koydu:

<script type="text/html" id="mytemplate"> 
    ... template here ... 
</script> 

burada güzellik olduğunu tüm tarayıcılar ve onları nasıl yorumlanacağı bilmiyor komut blokları yok sayacak tüm düzgün yazılmış robotlar; ve içeriğe kimliğe göre kolayca erişebilirsiniz (eğer bir div ise).

+0

Birçok jQuery templating eklentisinin yanı sıra Microsoft'un geçici teklifi de bu şekilde çalışıyor. http://wiki.github.com/nje/jquery/jquery-templates-proposal – R0MANARMY

İlgili konular