2010-02-14 12 views
5

मैं जावास्क्रिप्ट में टेम्पलेट बनाने का एक आसान तरीका विकसित करने की कोशिश कर रहा हूं। मूल विचार यह है कि मुझे एक ऐसे पृष्ठ में HTML मिला है जो जावास्क्रिप्ट में किसी ऑब्जेक्ट के UI का प्रतिनिधित्व करता है, और उस HTML में चर जो जावास्क्रिप्ट ऑब्जेक्ट के गुणों के साथ प्रतिस्थापित होते हैं। एचटीएमएल प्रस्तुतियों को जावास्क्रिप्ट ऑब्जेक्ट्स को बाध्य करने के लिए तकनीक के रूप में सोचें।एक साधारण जावास्क्रिप्ट टेम्पलेटिंग तकनीक में सुधार

कोई आलोचना? क्या मुझे दस्तावेज़ खंडों का उपयोग किसी भी तरह से करना चाहिए? मैं अनिवार्य रूप से इस पर एक कोड समीक्षा की तलाश कर रहा हूँ। मैं किसी भी प्रतिक्रिया की सराहना करता हूं। (ध्यान दें कि यह ढांचा स्वतंत्र होना चाहिए।) यहां एक कामकाजी एक्समैपल है।

<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 // जादू – cherouvim

+0

हाहा के लिए धन्यवाद, धन्यवाद! :) – JamesBrownIsDead

उत्तर

2

कोड साफ है।

मेरे पास एक HTML टिप्पणी में टेम्पलेट होगा इसलिए 1) इसे प्रस्तुत नहीं किया जाता है (प्रदर्शन की कोई ज़रूरत नहीं है: कोई हैक नहीं) और 2) मैं ऐसी सामग्री प्राप्त कर पाऊंगा जो मान्य नहीं है, जैसे एक <tr> प्रत्यक्ष के रूप में।

इसके अलावा मैं हार्डकोडेड 'div' सृजन को हटा दूंगा ताकि मैं किसी भी HTML तत्व से शुरू होने वाले टेम्पलेट स्निपेट का समर्थन कर सकूं।

बाद में मैं ग्राफ नेविगेशन (जैसे $ {foo.bar}), पुनरावृत्ति और यदि कथन जोड़ता हूं।

2

+1 चेरौविम: आप टेम्पलेट का उपयोग टेक्स्ट के रूप में कर रहे हैं, इसलिए इसे टेक्स्ट के रूप में रखें। आप इसे अपनी स्क्रिप्ट पर टिप्पणी के रूप में पास कर सकते हैं, या आप इसे JSON-encoded स्ट्रिंग के रूप में पास कर सकते हैं, लेकिन इसके लिए मार्कअप का उपयोग संभावित रूप से खतरनाक है।

उदाहरण के लिए:

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

कुछ चीजें आप मज़बूती से ब्राउज़र 'फिक्सिंग' मार्कअप और बदलते लौटे innerHTML वापस की वजह से अपने templating भाषा में ऐसा नहीं कर सकते दिखाता है: formmethod="get" को उत्परिवर्तित किया जा सकता है (या, आईई में, छोड़ा गया एफएसआर); जब तक कि आप एक्सएमएल मोड में न हों, वहां <tbody> तत्व जोड़ा जाएगा; उत्परिवर्तनीय तत्व बिल्कुल काम नहीं करेगा; ${extrarow} टेक्स्ट सीधे तालिका के अंदर अमान्य है; input.value को पृष्ठ लोड पर उत्परिवर्तित किया जा सकता है क्योंकि ब्राउज़र फॉर्म फ़ील्ड मानों को फिर से सेट करने का प्रयास करते हैं और IE गलत रूप से फ़ील्ड मान परिवर्तन को विशेषता/आंतरिक HTML के रूप में दर्शाता है।

इसके अलावा, मैं दृढ़ता से एक HTML एन्कोड सुविधा (&lt; साथ &amp; साथ &, < की जगह और इसी तरह के संदर्भ के साथ किसी भी विशेषता मान सीमांकक) जोड़ने की सिफारिश करेंगे। टेम्पलेटिंग भाषाओं के साथ अनुभव ने दिखाया है कि मार्कअप के विस्तार की तुलना में दस्तावेज़ में टेक्स्ट स्ट्रिंग डालना चाहते हैं। जब आप ऐसा करेंगे:

Hello, ${name}! 

चर name से बचने लागू किए बिना, आप क्रॉस साइट स्क्रिप्टिंग आक्रमण-करने के लिए अपने आवेदन ऊपर खोल रहे हैं। आधुनिक टेम्पलेटिंग भाषाएं डिफ़ॉल्ट रूप से एचटीएमएल-एन्कोडिंग को लागू करके इससे बचती हैं, क्योंकि कोडर इसे मैन्युअल रूप से करने के लिए बहुत आलसी होते हैं (यदि वे शामिल मुद्दों को भी समझते हैं)। यही कारण है कि PHP ऐप्स का विशाल बहुमत XSS हमलों के लिए कमजोर है।

क्लाइंट-साइड में एक ही समस्या न लाएं; यह डिफ़ॉल्ट रूप से बचने के बनाने के लिए, आप (आम तौर पर अपेक्षाकृत कुछ) ऐसे मामलों में जहां आप कच्चे मार्कअप सम्मिलित करना चाहते हैं के लिए भागने नहीं करना चाहती कहने के लिए एक ध्वज की पेशकश: एक HTML टिप्पणी आप कर सकते हैं में यह होने के बजाय

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

एचटीएमएल एन्कोडिंग सुविधा बहुत अच्छी होगी – cherouvim

1

टैग में डाल दिया, उदाहरण के लिए:

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

सुंदरता यहाँ है कि सभी ब्राउज़रों और सभी ठीक से लिखा रोबोट स्क्रिप्ट अवरोध जहां यह उन्हें समझने के पता नहीं है पर ध्यान नहीं देगा; और आप आसानी से आईडी के माध्यम से सामग्री तक पहुंच सकते हैं (जैसे कि यह एक div था)।

+0

इस प्रकार कई jQuery टेम्पलेटिंग प्लगइन्स काम करते हैं साथ ही साथ माइक्रोसॉफ्ट के टेम्पलेटिंग प्रस्ताव भी काम करते हैं। http://wiki.github.com/nje/jquery/jquery-templates-proposal – R0MANARMY

संबंधित मुद्दे