简体   繁体   English

在javascript中分配html代码段

[英]assign html snippet in javascript

There are times that I need to assign a html snippet to a javascript var, such as, 有时候,我需要将html代码段分配给javascript var,例如,

var homePage =
    '<div>' +
        '<div class="header"><h1>Page Slider</h1></div>' +
        '<div class="scroller">' +
                '<ul class="list">' +
                '<li><a href="#page1"><strong>Build Bot</strong></a></li>' +
                '<li><a href="#page2"><strong>Medi Bot</strong></a></li>' +
                '<li><a href="#page3"><strong>Ripple Bot</strong></a></li>' +
            '</ul>' +
        '</div>' +
    '</div>';

This can work good, but it makes editing a bit hard. 这可以很好地工作,但是会使编辑变得有些困难。 May I know any framework can do this elegantly? 我可以知道任何框架都可以优雅地做到这一点吗?

Use handlebars.js this is how is works: 使用handlebars.js,这是如何工作的:

Server side: 服务器端:

Send a JSON object back to javascript. 将JSON对象发送回javascript。 I usually use something like this: echo json_encode(array('object_name'=>$obj)); 我通常使用这样的东西: echo json_encode(array('object_name'=>$obj));

HTML 的HTML

  1. Create a container on your page. 在页面上创建一个容器。 <div id="#my_template_container"></div>

Javascript: Javascript:

usually in your AJAX success function: 通常在您的AJAX成功函数中:

  1. Parse your data into a JSON object: 将您的数据解析为JSON对象:
    var my_obj= JSON.parse(data);
  2. Create a reference to the template: 创建对模板的引用:
    var tmpl = $("#my_layout").html();
  3. Use the Handlebars engine to compile the template: 使用Handlebars引擎来编译模板:
    var theTemplate = Handlebars.compile(tmpl);
  4. Append the template to the HTML 将模板附加到HTML
    $('#my_template_container').html(theTemplate(my_obj));

Template 模板

  1. Access your object in the template by it's name, in this example it would be : object_name the variable I assigned in my echo json_encode(array('object_name'=>$obj)) statement from PHP. 通过名称访问模板中的对象,在本示例中为: object_name我在PHP中的echo json_encode(array('object_name'=>$obj))语句中分配的变量。
  2. Access properties of the object using {{Property_Name}} . 使用{{Property_Name}}访问对象的{{Property_Name}}
  3. To access properties of object children use the nested path operator: {{Propert_Name.ID}} 要访问对象子级的属性,请使用嵌套的路径运算符: {{Propert_Name.ID}}

   <script id="my_layout" type="text/x-handlebars-template">
        {{#object_name}}
         '<div>' +
                '<div class="header"><h1>Page Slider</h1></div>' +
                '<div class="scroller">' +
                        '<ul class="list">' +
                        '<li><a href="#page1"><strong>{{property1}}</strong></a></li>' +
                        '<li><a href="#page2"><strong>{{property2}}</strong></a></li>' +
                        '<li><a href="#page3"><strong>{{property3}}</strong></a></li>' +
                    '</ul>' +
                '</div>' +
            '</div>';
        {{/object_name}}

        </script>

I created a very light plugin, just for the times, when you just want to use some html inside js, and do not require a lot of options provided my templating frameworks and thus want to avoid heavy js. 当您只想在js内使用一些html ,并且我的模板框架不提供很多选项时,我就创建了一个非常轻巧的插件,仅此一次。

Coffee script 咖啡脚本

(($) ->
  utCache = {}
  $.fn.ut = (tmplID, obj) ->
    _tmpl = (str) ->
      fn = "var p=[]; p.push('" + str.replace(/[\r\t\n]/g, " ").replace(/'(?=[^%]*%>)/g, "\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g, "',$1,'").split("<%").join("');").split("%>").join("p.push('") + "'); return p.join('');"
      new Function("o", fn)
    _getData = (ele) ->
      $(ele).html utCache[tmplID](obj)
    @each ->
      ele = this
      utCache[tmplID] = _tmpl($(tmplID).html()) unless utCache[tmplID]
      _getData ele
) jQuery

Javascript Java脚本

(function($) {
  var utCache;
  utCache = {};
  return $.fn.ut = function(tmplID, obj) {
    var _getData, _tmpl;
    _tmpl = function(str) {
      var fn;
      fn = "var p=[]; p.push('" + str.replace(/[\r\t\n]/g, " ").replace(/'(?=[^%]*%>)/g, "\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g, "',$1,'").split("<%").join("');").split("%>").join("p.push('") + "'); return p.join('');";
      return new Function("o", fn);
    };
    _getData = function(ele) {
      return $(ele).html(utCache[tmplID](obj));
    };
    return this.each(function() {
      var ele;
      ele = this;
      if (!utCache[tmplID]) {
        utCache[tmplID] = _tmpl($(tmplID).html());
      }
      return _getData(ele);
    });
  };
})(jQuery);

You can use it simply like, 您可以像这样简单地使用它,

$('#my-div').ut("#my-template", { name: 'jashwant'});

when we have following HTML: 当我们有以下HTML时:

<div id='my-div'></div>

<script type='javascript' id='my-template'>
  <p><%=o.name %> welcomes you !</p>
</script>

Do it with Javascript's document methods. 使用Javascript的document方法来实现。

var topdiv = document.createElement('div');
var headerDiv = document.createElement('header');
var header = document.createElement('h1');
header.innerHTML = 'Page Slider';
headerDiv.appendChild(header);

// etc....

Or use templating. 或使用模板。

Just use backslashes to escape line breaks. 只需使用反斜杠即可避免换行。

Eg: 例如:

var homePage =
    '<div> \
        <div class="header"><h1>Page Slider</h1></div> \
        <div class="scroller"> \
                <ul class="list"> \
                <li><a href="#page1"><strong>Build Bot</strong></a></li> \
                <li><a href="#page2"><strong>Medi Bot</strong></a></li> \
                <li><a href="#page3"><strong>Ripple Bot</strong></a></li> \
            </ul> \
        </div> \
    </div>';

Use \\n\\ instead of \\ if you want to include the line breaks in the string. 如果要在字符串中包含换行符,请使用\\n\\代替\\

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM