handlebars.js是否用<br>替换换行符?

Uri*_*Uri 36 client-side-templating handlebars.js

试图使用handlebars.js进行模板化,但库似乎忽略了换行符.

处理换行符的正确方法是什么?是否应该在模板操作后手动更换?

Uri*_*Uri 84

它不会自动执行此操作,但使用帮助程序功能可以实现:

JS:

Handlebars.registerHelper('breaklines', function(text) {
    text = Handlebars.Utils.escapeExpression(text);
    text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
    return new Handlebars.SafeString(text);
});
Run Code Online (Sandbox Code Playgroud)

HTML模板:

<div>
    {{breaklines description}}
</div>
Run Code Online (Sandbox Code Playgroud)

  • 要在Meteor中使用它,必须将定义Handlebars.Utils的立即调用的函数表达式复制并粘贴到应用程序内的.js文件中.无论出于何种原因,通常都无法从Meteor内部访问.它位于`.meteor/local/build/server/node_modules/handlebars/lib/handlebars/utils.js`中. (3认同)
  • 为什么我们需要`toString()`?escapeExpression已经返回一个字符串,不是吗? (2认同)

Dou*_* II 28

通过插入三个括号而不是传统的两个括号,您可以指示把手停止其正常的转义html表达式的技巧,例如<br><p>;

例如,从车把网站:

"Handlebars HTML-escapes返回的值{{expression}}.如果您不希望Handlebars转义值,请使用"triple-stash",. {{{"

    <div class="entry">
      <h1>{{title}}</h1>
      <div class="body">
        {{{body}}}
      </div>
    </div>
Run Code Online (Sandbox Code Playgroud)

有了这个背景:

    {
      title: "All about <p> Tags",
      body: "<p>This is a post about &lt;p&gt; tags</p>"
    }
Run Code Online (Sandbox Code Playgroud)

结果是:

    <div class="entry">
      <h1>All About &lt;p&gt; Tags</h1>
      <div class="body">
        <p>This is a post about &lt;p&gt; tags</p>
      </div>
    </div>
Run Code Online (Sandbox Code Playgroud)

  • 除非您使用来自textarea的用户生成的内容,否则根本不会转义任何HTML,您现在有一个XSS向量,因为用户可以输入脚本标记. (4认同)
  • 哇,这么多人赞成引入 XSS 向量!!只有当您 100% 确定模板的内容时,才应使用三斜杠表达式。也就是说,几乎从来没有! (2认同)

Mat*_*ins 10

以下是我比目前接受的答案更喜欢的两种方法:

  1. 使用white-space: pre-wrap;white-space: pre;在要保留换行符的元素上(分别允许或抑制自然换行).如果你想要折叠空白序列,这就是HTML中文本的正常呈现方式,white-space: pre-line;请注意IE8及以下版本不支持这一点.https://developer.mozilla.org/en-US/docs/Web/CSS/white-space
  2. 或者这里是模板助手的一个版本,不需要复制和粘贴外部代码:

    Template.registerHelper('breaklines', function (text) {
      text = Blaze._escape(text);
      text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
      return new Spacebars.SafeString(text);
    });
    
    Run Code Online (Sandbox Code Playgroud)

    https://github.com/meteor/meteor/blob/devel/packages/blaze/preamble.jsBlaze._escape


小智 6

只需使用CSS属性white-space并将值设置为pre-line

以标记文件中的示例为例:

<p style="white-space: pre-line">
  {{text}}
</p>
Run Code Online (Sandbox Code Playgroud)

然后您可以传递包含断行的文本,如下所示

{text: "First line

        Second line"
}
Run Code Online (Sandbox Code Playgroud)

结果看起来像

First line

Second line
Run Code Online (Sandbox Code Playgroud)