[HTML] innerHTML插入含script的文本

使用innerHTML插入含<script>的文本,这些<script>会被加入DOM中,但不会执行

(1)插入script片段

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8"/>
        <title>Document</title>
    </head>
    <body>
        <div id="div1"></div>
        <script src="1.js"></script>
    </body>
</html>

//1.js
document.getElementById('div1').innerHTML='<script>alert();</script>';

结果:script中的代码片段,不会执行

<div id="div1"><script>alert();</script></div>

(2)插入含src的script

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8"/>
        <title>Document</title>
    </head>
    <body>
        <div id="div1"></div>
        <script src="1.js"></script>
    </body>
</html>

//1.js
document.getElementById('div1').innerHTML='<script src="2.js"></script>';

//2.js
alert();

结果:2.js不会被请求执行

<div id="div1"><script src="2.js"></script></div>

注:
(1)<script></script>标签之间不能包含文本</script>因为会被看做html结束标签
例如:

<script>
    document.getElementById('div1').innerHTML='<script>alert();</script>';
</script>

结果:Uncaught SyntaxError: Unexpected token ILLEGAL

(2)如果想要执行script,可以用正则匹配,然后通过动态创建script标签的方式实现。
例如:

var source='123<script>alert(1)</script>456<script>alert(2)</script>';
var regexp=/<script>(.*?)<\/script>/g;

var codes=[];
var result=source.replace(regexp,function(script,code){
    codes.push(code);
    return '';
});

var container=document.getElementById('div1');
container.innerHTML=result;
codes.forEach(function(code){
    var script=document.createElement('script');
    script.innerHTML=code;
    container.appendChild(script);
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • HTML标签解释大全 一、HTML标记 标签:!DOCTYPE 说明:指定了 HTML 文档遵循的文档类型定义(D...
    米塔塔阅读 3,377评论 1 41
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,180评论 19 139
  • HTML5 标签comment 注释标签用于在源文档中插入注释。注释内容不会被浏览器显示。为代码编写注释的好处是...
    才気莮孒阅读 4,127评论 1 25
  • 一、JS前言 (1)认识JS 也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HT...
    凛0_0阅读 2,817评论 0 8
  • 原来的班长还挺好的,至少早自习不去没关系,但不知为什么就被集体围攻了。墙倒众人推,之后就是各种的嫌弃,也是醉了。
    清洲小菜阅读 95评论 0 0