页面动态加入<script>标签并执行代码

  在页面中动态追加html片段的时候,有时候动态添加的代码会含有<script>标签,比如用了一些模板引擎,或者你的代码有些复杂的时候。然而我们用DOM提供的innerHTML方式来添加代码的时候,<script>标签中的代码并不能执行,如果有src属性,指向的外联文件也不会被加载,这并不是浏览器的bug,因为w3c文档就是这么规定的。

那我们有什么办法可以恢复追加的<script>标签的代码执行能力呢?

重新构造<script>标签

     这个思路其实非常简单,用innerHTML添加的<script>无法执行,但是我们script创建节点,并用appendChild追加上去是可以的,所以我们只需要做一下二次工作就可以了,看下面的例子:

页面上有个容器:

<div id="cont"></div>

  js代码如下:

var html = ‘<div>html</div><script>alert(1);<\/script>‘;
var cont = document.getElementById(‘cont‘);
cont.innerHTML = html;
var oldScript = cont.getElementsByTagName(‘script‘)[0];
cont.removeChild(oldScript);
var newScript = document.createElement(‘script‘);
newScript.type = ‘text/javascript‘;
newScript.innerHTML = oldScript.innerHTML;
cont.appendChild(newScript);

  这只是内联<script>的方法,如果是引用的外部js文件,那么我们需要为新创建的script节点指定src属性。

eval大法

     虽然eval因为其安全性不推荐使用,但是在此特殊场景,使用eval确是非常简单的解决方案,就是把<script>标签中的代码eval一下手动执行,就ok了,看下面代码:

var html = ‘<div>html</div><script>alert(1);<\/script>‘;
var cont = document.getElementById(‘cont‘);
cont.innerHTML = html;
var oldScript = cont.getElementsByTagName(‘script‘)[0];
cont.removeChild(oldScript);
var scriptText = oldScript.innerHTML;
eval(scriptText);

  对于内联的代码,简单而有效,如果是外部js文件,那么还是使用上面的方法,为新创建的script节点指定src属性。

document.write大法

此方法可以在页面上直接输出任何html内容,包含<script>标签的话会立即执行,所以也是一种方案,如下:

var html = ‘<div>html</div><script>alert(1);<\/script>‘;
document.write(html);

  代码就直接执行了。但是他的缺点是如果代码写在文档底部,输出的内容会把页面上的其他内容全部覆盖,相当于清空了页面。解决的办法只有这样了:

<div id="cont"><script type="text/javascript">document.write(html);</script></div>

  直接把它放在标签中,就会往这个标签中输出东西了。

使用jQuery的html()

     上面的方法说来说去,都不如jQuery简单,因为jQuery的html()方法内部已经做了处理,如果参数中含有<script>标签,内部会使用上面的方法一和方法二进行处理,不论是内联的js代码还是外联的js文件,都可以正常执行,同时在执行完后删去<script>标签。所以,使用jQuery你只需要这样:

var html = ‘<div>html</div><script>alert(1);<\/script>‘;
$(‘#cont‘).html(html);

  这个alert就妥妥的执行了。到这里,我真想说:jQuery,你真是俺亲娘!

时间: 2024-08-07 21:18:52

页面动态加入<script>标签并执行代码的相关文章

javascript动态创建script标签,加载完成后调用回调

代码如下: var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript'; script.charset = 'GBK'; script.onload = script.onreadystatechange = function() { if (!this.readyState || this.r

js兼容性 - 动态删除script标签后 ,定义的函数是否执行

hello.js function hello(){ alert('hello'); } hello.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script id="hello" src="hello.js">

JS在当前页面插入&lt;script&gt;标签,并执行

将<script>标签绑定到<html>上, html可换成body,header等其他存在的标签. var htmm =document.getElementsByTagName("html")[0]; var scri = document.createElement("script"); scri.async="async" scri.src="http://www.xxx.com/dummy.js&quo

原生js动态添加script标签

var scriptElement = document.createElement('script'); document.body.appendChild(scriptElement); scriptElement.src = "https://static.mlinks.cc/scripts/dist/mlink.min.js" 原文地址:https://www.cnblogs.com/jongsuk0214/p/9372053.html

&lt;script&gt;标签的加载解析执行

转自原文 <script>标签的加载解析执行 看了很多网上的文章,都是大同小异.总结一下.内部原理还没有搞清楚,有机会再学习. 一.<script>标签的加载解析执行顺序 html页面中的<script>标签中的内容(直接写入或者引用外部文件都一样)是以顺序加载执行的,每个<script>标记内容可以当成一个独立的块,同步的情况下一个块加载解析然后执行完后才加载下一块.当然这时也会阻塞其他页面元素的加载.所以网上说的变量调用: <script type

如何将 JavaScript 代码添加到网页中,以及 &lt;script&gt; 标签的属性

Hello, world! 本教程的这一部分内容是关于 JavaScript 语言本身的. 但是,我们需要一个工作环境来运行我们的脚本,由于本教程是在线的,所以浏览器是一个不错的选择.我们会尽可能少地使用浏览器特定的命令(比如 alert),所以如果你打算专注于另一个环境(比如 Node.js),你就不必多花时间来关心这些特定指令了.我们将在本教程的下一部分中专注于浏览器中的 JavaScript. 首先,让我们看看如何将脚本添加到网页上.对于服务器端环境(如 Node.js),你只需要使用诸如

html解析和渲染过程 与 Script标签和脚本执行顺序

几个首要特性: script标签(不带defer或async属性)的会阻止文档渲染.相关脚本会立即下载并执行. document.currentScript可以获得当前正在运行的脚本(Chrome 29+, FF4+) 脚本顺序再默认情况下和script标签出现的顺序一致 有defer或async属性(defer和async没有完全兼容所有浏览器) 仅有async属性,脚本会异步执行 仅有defer属性,脚本会在文档解析完毕后执行 两个属性都没有,脚本会被同步下载并执行(顺序下载,顺序执行),期

script标签里的defer属性

入职新公司,看代码的时候注意到有的script标签中有一个defer属性,查了一下.在这里分享出来. 需要注意的有三点,其中前两点是在错误中分辨出来的: 错误来源:http://www.w3school.com.cn/tags/att_script_defer.asp 1,defer属性只有IE支持:应该说是在主流浏览器都是支持的: http://www.runoob.com/tags/att-script-defer.html 中说了,在所有主流浏览器都支持defer属性:在Chrome,FF

动态创建 script 实现跨域请求数据

动态创建script标签 (由事件触发) 在我们需要请求数据的时候我们就可以动态的创建 script 标签 src设置为我们需要请求数据的地址 另外我们可以附加参数 ?后面附加参数 例如 :?参数=1&callbacl=cb    我们还可以指定回调函数 回调函数就是我们在得到数据之后需要做什么处理 给这个函数传一个参数 即我们想要的数据 btn.onclick=function(){ var value = numbers.value; // 必须在点击事件之后获取 这样或取得才是当前的 值