首页 > 其他分享 >js 旧 IE 中的 innerHTML

js 旧 IE 中的 innerHTML

时间:2024-01-24 17:04:42浏览次数:32  
标签:元素 innerHTML element 插入 world js IE 节点

在所有现代浏览器中,通过 innerHTML 插入的<script>标签是不会执行的。而在 IE8 及之前的版 本中,只要这样插入的<script>元素指定了 defer 属性,且<script>之前是“受控元素”(scoped element),那就是可以执行的。<script>元素与<style>或注释一样,都是“非受控元素”(NoScope element),也就是在页面上看不到它们。IE 会把 innerHTML 中从非受控元素开始的内容都删掉,也就 是说下面的例子是行不通的:

```js

// 以下都可行

div.innerHTML = "_<script defer>console.log('hi');<\/script>";

div.innerHTML = "<div>&nbsp;</div><script defer>console.log('hi');<\/script>"; div.innerHTML = "<input type=\"hidden\"><script defer>console. log('hi');<\/script>";

```


第一行会在<script>元素前面插入一个文本节点。为了不影响页面排版,可能稍后需要删掉这个 文本节点。第二行与之类似,使用了包含空格的<div>元素。空<div>是不行的,必须包含一点内容, 以强制创建一个文本节点。同样,这个<div>元素可能也需要事后删除,以免影响页面外观。第三行使 用了一个隐藏的<input>字段来达成同样的目的。因为这个字段不影响页面布局,所以应该是最理想的 方案。

在 IE 中,通过 innerHTML 插入<style>也会有类似的问题。多数浏览器支持使用 innerHTML 插 入<style>元素:

```js

div.innerHTML = "<style type=\"text/css\">body {background-color: red; }</style>"; 但在 IE8 及之前的版本中,<style>也被认为是非受控元素,所以必须前置一个受控元素:

```

 


```js

div.innerHTML = "_<style type=\"text/css\">body {background-color: red; }</style>";

   div.removeChild(div.firstChild);

```

## 3. outerHTML 属性

读取 outerHTML 属性时,会返回调用它的元素(及所有后代元素)的 HTML 字符串。在写入 outerHTML 属性时,调用它的元素会被传入的 HTML 字符串经解释之后生成的 DOM 子树取代。比如 下面的 HTML 代码:

```js

<div id="content">

<p>This is a <strong>paragraph</strong> with a list following it.</p> <ul>

       <li>Item 1</li>

       <li>Item 2</li>

       <li>Item 3</li>

</ul> </div>

```

在这个<div>元素上调用 outerHTML 会返回相同的字符串,包括<div>本身。注意,浏览器因解 析和解释 HTML 代码的机制不同,返回的字符串也可能不同。(跟 innerHTML 的情况是一样的。)

如果使用 outerHTML 设置 HTML,比如:

```js

div.outerHTML = "<p>This is a paragraph.</p>";

```

则会得到与执行以下脚本相同的结果:

```js

let p = document.createElement("p"); p.appendChild(document.createTextNode("This is a paragraph.")); div.parentNode.replaceChild(p, div);

```

新的<p>元素会取代 DOM 树中原来的<div>元素。

## 4. insertAdjacentHTML()与 insertAdjacentText()

关于插入标签的最后两个新增方法是 insertAdjacentHTML()和 insertAdjacentText()。这两 个方法最早源自 IE,它们都接收两个参数:要插入标记的位置和要插入的 HTML 或文本。第一个参数 必须是下列值中的一个:

 "beforebegin",插入当前元素前面,作为前一个同胞节点;

 "afterbegin",插入当前元素内部,作为新的子节点或放在第一个子节点前面;

 "beforeend",插入当前元素内部,作为新的子节点或放在最后一个子节点后面;

 "afterend",插入当前元素后面,作为下一个同胞节点。 注意这几个值是不区分大小写的。第二个参数会作为 HTML 字符串解析(与 innerHTML 和

outerHTML 相同)或者作为纯文本解析(与 innerText 和 outerText 相同)。如果是 HTML,则会 在解析出错时抛出错误。下面展示了基本用法1 假设当前元素是<p>Hello world!</p>,则"beforebegin"和"afterbegin"中的"begin"指开始标签<p>;而 "afterend"和"beforeend"中的"end"指结束标签</p>。

   注意 Firefox在内容类型为application/xhtml+xml的XHTML文档中对innerHTML 更加严格。在 XHTML 文档中使用 innerHTML,必须使用格式良好的 XHTML 代码。否 则,在 Firefox 中会静默失败。


```js

 // 作为前一个同胞节点插入

element.insertAdjacentHTML("beforebegin", "<p>Hello world!</p>"); element.insertAdjacentText("beforebegin", "Hello world!");

// 作为第一个子节点插入

element.insertAdjacentHTML("afterbegin", "<p>Hello world!</p>"); element.insertAdjacentText("afterbegin", "Hello world!");

// 作为最后一个子节点插入

element.insertAdjacentHTML("beforeend", "<p>Hello world!</p>"); element.insertAdjacentText("beforeend", "Hello world!");

// 作为下一个同胞节点插入

element.insertAdjacentHTML("afterend", "<p>Hello world!</p>"); element. insertAdjacentText("afterend", "Hello world!");

```

标签:元素,innerHTML,element,插入,world,js,IE,节点
From: https://blog.51cto.com/u_16251183/9400039

相关文章

  • js 自定义数据属性
    HTML5允许给元素指定非标准的属性,但要使用前缀data-以便告诉浏览器,这些属性既不包含与渲染有关的信息,也不包含元素的语义信息。除了前缀,自定义属性对命名是没有限制的,data-后面跟什么都可以。下面是一个例子:<divid="myDiv"data-appId="12345"data-myname="Nicholas"></div>......
  • js 焦点管理
    HTML5增加了辅助DOM焦点管理的功能。首先是document.activeElement,始终包含当前拥有焦点的DOM元素。页面加载时,可以通过用户输入(按Tab键或代码中使用focus()方法)让某个元素自动获得焦点。例如:letbutton=document.getElementById("myButton");button.focus();......
  • js CSS 类扩展
    自HTML4被广泛采用以来,Web开发中一个主要的变化是class属性用得越来越多,其用处是为元素添加样式以及语义信息。自然地,JavaScript与CSS类的交互就增多了,包括动态修改类名,以及根据给定的一个或一组类名查询元素,等等。为了适应开发者和他们对class属性的认可,HTML5增加了......
  • js matches()
    matches()方法(在规范草案中称为matchesSelector())接收一个CSS选择符参数,如果元素匹配则该选择符返回true,否则返回false。例如:if(document.body.matches("body.page1")){//true}使用这个方法可以方便地检测某个元素会不会被querySelector()或querySelectorAll()方......
  • js DOM 扩展
    尽管DOMAPI已经相当不错,但仍然不断有标准或专有的扩展出现,以支持更多功能。2008年以前,大部分浏览器对DOM的扩展是专有的。此后,W3C开始着手将这些已成为事实标准的专有扩展编制成正式规范。本章所有内容已经得到市场占有率名列前茅的所有主流浏览器支持,除非特别说明。Java......
  • python创建json文件并换行
     在Python中,您可以使用内置的json 模块创建和操作JSON文件。以下是如何创建一个JSON文件的步骤:1、Json格式JSON数据的书写格式是键(名称)/值对。JSON值可以是:字符串(在双引号中)、数组(在中括号中)、数字(整数或浮点数)、逻辑值(true或false)、对象(在大括号中)、null。JSON......
  • 共话 AI for Science | 北京大学王超名:BrainPy,迈向数字化大脑的计算基础设施
    导读:2023和鲸社区年度科研闭门会以“对话AIforScience先行者,如何抓住科研范式新机遇”为主题,邀请了多个领域的专家学者共同探讨人工智能在各自领域的发展现状与未来趋势。在脑科学领域,数字化大脑通过数学模型和计算机仿真对大脑进行精确的建模和重构,可以更好地理解和探索大脑......
  • [转]JavaScript:解决计算精度问题/mathjs/bignumber.js/big.js/decimal.js
    原文地址:JavaScript:解决计算精度问题/mathjs/bignumber.js/big.js/decimal.js_js计算精度问题-CSDN博客一、计算精度现象举例举例1、加法 举例2、减法 举例3、乘法 举例3、除法 二、JS为什么会有计算精度的问题JavaScript内部只有一种数字类型Number,也就是说,Java......
  • JS逆向实战27——pdd的anti_content 分析与逆向
    声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!本文已在微信公众号发布目标网站aHR0cHM6Ly9tb2JpbGUucGluZHVvZHVvLmNvbS8=任务获取商品列表接口......
  • 使用Java中的HttpClient进行网络请求
    使用Java中的HttpClient进行网络请求是一种常见的操作,它可以帮助我们轻松地发送HTTP请求并获取响应。以下是使用Java中的HttpClient进行网络请求的基本步骤:1. 添加依赖:首先,确保您的项目中包含了HttpClient的依赖。如果您使用的是Maven项目,请在pom.xml文件中添加以下依赖:2. xml复......