让innerHtml中的script跑起来

本文介绍了一种跨浏览器兼容的方法来设置innerHTML,确保插入的内容包括脚本和样式能在IE、Firefox和Opera等浏览器中正常工作。此外,还提供了解决HTML代码中包含document.write导致页面破坏的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多人都可能遇到过这种情况:设置 innerHTML 的时候,插入的 HTML 代码中包含脚本,但这些脚本却不生效,或者在 IE 上生效在其它浏览器上就不生效。原因很简单:不同浏览器对插入 innerHTML 中的脚本有不同的处理方法。经过实践,归纳如下:

对于IE,首先 script 标签必须带 defer 属性,其次在插入时刻,innerHTML 的所属节点必须在 DOM 树中;对于 Firefox 和 Opera,在插入时刻,innerHTML 的所属节点不可以在 DOM 树中。

根据上面结论,给出通用的设置 innerHTML 方法:

/* * 描述:跨浏览器的设置 innerHTML 方法 * 允许插入的 HTML 代码中包含 script 和 style * 作者:kenxu <ken@ajaxwing.com> * 日期:2006-03-23 * 参数: * el: 合法的 DOM 树中的节点 * htmlCode: 合法的 HTML 代码 * 经测试的浏览器:ie5+, firefox1.5+, opera8.5+ */var setInnerHTML = function (el, htmlCode) { var ua = navigator.userAgent.toLowerCase(); if (ua.indexOf('msie') >= 0 && ua.indexOf('opera') < 0) { htmlCode = '<div style="display:none">for IE</div>' + htmlCode; htmlCode = htmlCode.replace(/<script([^>]*)>/gi, '<script$1 defer="true">'); el.innerHTML = htmlCode; el.removeChild(el.firstChild); } else { var el_next = el.nextSibling; var el_parent = el.parentNode; el_parent.removeChild(el); el.innerHTML = htmlCode; if (el_next) { el_parent.insertBefore(el, el_next) } else { el_parent.appendChild(el); } }}

还有某些情况,我们事先不清楚要插入到 innerHTML 的 HTML 代码包含什么,如果包含 document.write 语句,那么就会破坏整个页面。对于这种情况,可以通过重新定义 document.write 来避免。代码如下:

/* * 描述:通过重定义 document.write 函数,避免在使用 setInnerHTML 时, * 插入的 HTML 代码中包含 document.write ,导致原页面受到破坏的情况。 */document.write = function() { var body = document.getElementsByTagName('body')[0]; for (var i = 0; i < arguments.length; i++) { argument = arguments[i]; if (typeof argument == 'string') { var el = body.appendChild(document.createElement('div')); setInnerHTML(el, argument) } }}

### 回答1: 可以在使用highlight.js之前先对代码进行处理去除多余的缩进。可以使用javascript的replace()方法将每一行前面的缩进都去掉。 具体代码如下: ``` var code = document.getElementById("code").innerHTML; code = code.replace(/^\s+/gm, ""); document.getElementById("code").innerHTML = code; ``` 在这段代码中,首先通过getElementById()方法获取到代码所在的标签,再使用replace()方法将其中每一行前面的缩进都替换为空字符。最后再将处理后的代码重新赋值给标签。 ### 回答2: 在使用highlight.js时,如果code标签前面有很多缩进,导致高亮的代码跑到展示框的右边,可以通过以下方法解决: 首先,在需要使用highlight.js的页面中添加CSS样式,将code标签的padding设置为0,并设置white-space属性为pre-wrap。这样可以去除代码块前面的缩进,并保持代码在展示框内部显示。 ```css <style> code { padding: 0; white-space: pre-wrap; } </style> ``` 接下来,在使用highlight.js的代码块中加入自定义的CSS类名,例如"code-highlight": ```html <pre><code class="code-highlight"> <!-- 在此处插入需要高亮的代码 --> </code></pre> ``` 最后,使用highlight.js的JavaScript库来对该代码块进行高亮处理: ```html <script src="path/to/highlight.min.js"></script> <script> // 引入其他需要高亮的语言库 hljs.registerLanguage('language', languageModule); // 对所有带有class="code-highlight"的代码块进行高亮处理 document.querySelectorAll('code.code-highlight').forEach((block) => { hljs.highlightBlock(block); }); </script> ``` 通过上述方法,将代码块前面的缩进去除,并保持高亮的代码在展示框内显示,解决了高亮代码跑到展示框右边的问题。 ### 回答3: 在使用highlight.js时,code标签前面出现很多的缩进是由于使用了pre标签或某个父级容器添加了额外的缩进或样式。这个问题可以通过设置CSS样式来解决。 首先,要确保代码嵌套在正确的HTML结构中。需要使用pre标签将代码包裹起来,并在pre标签内使用code标签。例如: ```html <pre> <code class="language-javascript"> // 你的代码 </code> </pre> ``` 接下来,我们可以在CSS中定义样式来调整代码的缩进。通过对pre和code标签应用样式来解决这个问题。例如: ```css pre { margin: 0; /* 移除pre标签的外边距 */ padding: 0; /* 移除pre标签的内边距 */ } pre code { display: block; /* 将code标签显示为块级元素 */ white-space: pre; /* 保持代码中的空白符和换行符原样显示 */ margin: 0; /* 移除code标签的外边距 */ padding: 1em; /* 添加适当的内边距来调整代码缩进 */ background-color: #f7f7f7; /* 可选:设置代码块的背景颜色 */ } ``` 通过以上样式,我们可以将代码块的缩进问题解决掉,确保代码在展示框中正确显示。根据需要可以调整padding的数值以达到适当的缩进效果,也可以根据喜好设置代码块的背景颜色。