JS中模板字符串中的HTML元素

Posted

技术标签:

【中文标题】JS中模板字符串中的HTML元素【英文标题】:HTML elements in template strings in JS 【发布时间】:2018-06-05 21:42:54 【问题描述】:

我有问题,在我的模板字符串添加html元素。我想在我的<li>元素添加新的生产线,但<br>这样解释的字符串。

let movieDescription = document.createTextNode(`$moviesData[i].title <br> $moviesData[i].year <br> $moviesData[i].genre <br>$moviesData[i].summary`);

如何在模板字符串添加&lt;br&gt;元素? P>

【问题讨论】:

您可以创建一个TextNode,所以这是正确的行为。使用@如果987654326 @要解析的字符串。 SPAN> 为什么创建时,你会想到什么不同一个 “文本节点” i> SPAN> 你应该看看diffhtml。它有一些非常漂亮的函数做到这一点,吨其他的东西用的模板标签。 SPAN> 【参考方案1】:

如您所知,&lt;br&gt; 是 HTML 而不是文本。因此,您需要解析 Template Literal 才能正确呈现换行符。最常见的方法是使用属性.innerHTML,尽管我已经阅读了大量posts 和blogs 关于它的糟糕程度,但我从来没有遇到过问题。在这个例子中,我们使用insertAdjacentHTML()(注意模板字面量有&lt;div&gt;s 和&lt;hr&gt;s):

var movieDescription = `
<hr>
<div>Title: $moviesData[i].title</div> 
<div>Year: $moviesData[i].year</div> 
<div>Genre: $moviesData[i].genre</div> 
<div>Summary: $moviesData[i].summary</div>
<hr>`;

 document.querySelector('.dock').innerHTML = movieDescription;

另一种方法是insertAdjacentHTML()。这就像innerHTML 使用类固醇。

优点:

innerHTML更快更安全

它允许我们具体确定插入应该与目标元素相关的位置:

beforebegin: 插入的 HTML &lt;div&gt;target element&lt;/div&gt;

afterbegin: &lt;div&gt; 插入的 HTML target element&lt;/div&gt;

beforeend: &lt;div&gt;target element 插入的 HTML &lt;/div&gt;

afterend:&lt;div&gt;target element&lt;/div&gt;插入的 HTML

它不会像 innerHTML 那样覆盖内容。

缺点:

很冗长。

演示

var dock = document.querySelector('.dock');
var i;
var moviesData = [
  title: 'Pulp Fiction',
  year: '1994',
  genre: 'Drama-Crime',
  summary: "You will know , my name is the Lord, when I lay my vengance upon thee!"
, 
  title: 'Reservoir Dogs',
  year: '1992',
  genre: 'Drama-Crime',
  summary: "Clowns to the left of me, jokers to the right! Here I am stuck in the middle with you"
];

for (i = 0; i < moviesData.length; i++) 

  var movieDescription = `
<hr>
<div>Title: $moviesData[i].title</div> 
<div>Year: $moviesData[i].year</div> 
<div>Genre: $moviesData[i].genre</div> 
<div>Summary: $moviesData[i].summary</div>
<hr>`;

  dock.insertAdjacentHTML('beforeend', movieDescription);
&lt;div class='dock'&gt;&lt;/div&gt;

【讨论】:

【参考方案2】:

一个文本节点包含……嗯……文本。它不包含其他 html 元素,因此当您创建一个元素时,它会将&lt;br&gt; 解释为文本并按原样显示。

您想要的是 TextNode 和 HTMLBRElement 的集合。

const movieDescription = [
    document.createTextNode(moviesData[i].title),
    document.createElement('br'),
    document.createTextNode(moviesData[i].year),
    document.createElement('br'),
    document.createTextNode(moviesData[i].genre),
    document.createElement('br'),
    document.createTextNode(moviesData[i].summary)
];

这样做很尴尬。相反,您可能希望在要添加此描述的元素上使用 Element.innerHTML

const html = `$moviesData[i].title <br> $moviesData[i].year <br> $moviesData[i].genre <br>$moviesData[i].summary`;
document.querySelector('.my-movie-description').innerHTML = html;

存在一种类似的方法来将单个 TextNode 添加到元素。这是Element.innerText

【讨论】:

【参考方案3】:

我已经编写了一个 html 模板引擎来在浏览器上呈现动态数据。

Codepen example

var moviesData = [];
for(var i = 0; i < 10; i++)
   moviesData.push( 
      "title" : "title " + i,
      "year" : 2000 + i,
      "genre" : "action",
      "summary" : "summary " + i
   );

body 
  background-color: #a3d5d3;

.movie 
  margin: 0.5em 1em ;
  padding : 0.2em 0.5em;
  border: 1px solid;

<div jstl-autorun jstl-foreach="$moviesData" jstl-foreach-var="movieData">
   <div class="movie">
      $movieData.title
      <br/>
      $movieData.year
      <br/>
      $movieData.genre
      <br/>
      $movieData.summary
   </div>      
</div>

here is the link for the template engine

希望对你有用。

【讨论】:

以上是关于JS中模板字符串中的HTML元素的主要内容,如果未能解决你的问题,请参考以下文章

js中数组中元素之间的逗号如何去掉

如何利用Vue.js库中的v-html指令添加html元素

是否普遍支持 html 电子邮件模板中的 span 元素?

如何利用Vue.js库中的v-html指令添加html元素

在 Vue.js 模板中定位内部 html

使用 vanilla javascript 将 es6 模板字符串转换为 html 元素