【JavaScript入门-28】使用字符串以及模板字符串创建HTML

举报
搞前端的半夏 发表于 2022/05/31 11:18:53 2022/05/31
【摘要】 前言在上文中,我们使用了createElement创建标签并添加属性,使用appendChild将创建的标签加载到页面上!除了这种方法,其实还有很多方法可以创建元素,本文我们就来说一说,如何使用字符串和模板字符串创建元素!首先我们先来看一个属性-innerHTML。我们有下面结果的HTML代码, <h1>搞前端的半夏 <p style="display: none;">...

前言

在上文中,我们使用了createElement创建标签并添加属性,使用appendChild将创建的标签加载到页面上!除了这种方法,其实还有很多方法可以创建元素,本文我们就来说一说,如何使用字符串和模板字符串创建元素!

首先我们先来看一个属性-innerHTML。我们有下面结果的HTML代码,

    <h1>搞前端的半夏
        <p style="display: none;">我是内部p</p>
        <style>
            h1 {
              color: red;
            }
          </style>
    </h1>
    

我们选择h1并输出innnerHTML

     const h1 = document.querySelector("h1");
      console.log("innerHTML:", h1.innerHTML);

可以看到的是innnerHTML输出的是h1内部所有的代码!

image-20220531082105334

如果我们尝试给innnerHTML赋值会发生什么?

h1.innerHTML="<h2>我是h2</h2>"
console.log("innerHTML:", h1.innerHTML);

可以看到h1内部的元素已经更新了,如果输入的字符串是可用的HTML,他会自动将字符串转换成HTML并挂载到页面里!

image-20220531104743000

如果我们使用模板字符串,我们就可以来编写复杂的HTML字符串。它不仅比使用document.createElement或类似方法的步骤少,而且它还能够轻松地插入值。我们可以使用类似的反引号语法${variable},它允许我们将变量直接插入到我们拥有的字符串模板中。

const src = ``;
const desc = "我是图片的desc";  
h1.innerHTML=`
        <h2>我是h2</h2>
        <h3>我是h3</h3>
        <img src="${src}" alt="${desc}"/>
      `

缺点

我们现在假设一个场景:我们有如下一个网页代码,其中src和desc是来源用户的输入!

const src = ``;
const desc = "我是图片的desc";  
h1.innerHTML=`
        <h2>${desc}</h2>
        <img src="${src}" alt="${desc}"/>`

假设用户的输入如下:

const desc = ` <h1>我是带有标签的图片描述</h1>`;

此时页面上会出现一个不是我们创建的h1标签!如果这段代码是保存到数据库中,每个用户查看网页的时候,都会拼接字符串,看到h1标签!如果输入的是带有<style>*{display:none;}</style>。那你的网页就没有东西可见!

image-20220531110624770

这种缺点还不是最致命的,最致命的是可能会引起XSS跨站脚本攻击!想象一下,您正在登录您的网上银行,您的银行要求您输入您的姓名,并且您包含了一个脚本标签。你可以做任何你想做的事情,包括删除东西、汇款、任何类型的恶意行为。具体的我们会在后面的文章继续讲解!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。