1. 8 Web 应用 API
    1. 8.1 脚本
      1. 8.1.1 简介
      2. 8.1.2 代理和代理集群
        1. 8.1.2.1 与 JavaScript 代理形式的集成
        2. 8.1.2.2 与 JavaScript 代理集群形式的集成
      3. 8.1.3 脚本处理模型
        1. 8.1.3.1 运行时脚本错误
        2. 8.1.3.2 未处理的 Promise 拒绝
      4. 8.1.4 模块说明符解析
        1. 8.1.4.1 解析算法
        2. 8.1.4.2 导入映射
        3. 8.1.4.3 与模块相关的宿主钩子
      5. 8.1.5 事件循环
      6. 8.1.6 事件
        1. 8.1.6.1 事件处理程序
        2. 8.1.6.2 元素、Document 对象和 Window 对象上的事件处理程序
    2. 8.2 WindowOrWorkerGlobalScope 混合
    3. 8.3 Base64 实用程序方法

8 Web 应用 API

8.1 脚本

8.1.1 简介

各种机制会导致作者提供的可执行代码在文档的上下文中运行。这些机制包括但不限于

8.1.2 代理和代理集群

8.1.2.1 与 JavaScript 代理形式的集成

JavaScript 定义了 代理 的概念。本节提供了该语言级概念到 Web 平台的映射。

从概念上讲,代理 概念是在其中运行 JavaScript 代码的与架构无关的理想化“线程”。此类代码可能涉及多个全局/ ,这些全局/域可以同步地相互访问,因此需要在单个执行线程中运行。

Web 平台上存在以下类型的代理

同源窗口代理

包含各种可能相互访问的 Window 对象,无论是直接访问还是使用 document.domain

如果包含的 代理集群是否基于源 为 true,则所有 Window 对象都将是 同源,可以直接相互访问,并且 document.domain 将不起作用。

两个 同源Window 对象可能位于不同的 同源窗口代理 中,例如,如果它们各自位于自己的 浏览上下文组 中。

专用工作线程代理

包含单个 DedicatedWorkerGlobalScope

共享工作线程代理

包含单个 SharedWorkerGlobalScope

服务工作线程代理

包含单个 ServiceWorkerGlobalScope

Worklet 代理

包含单个 WorkletGlobalScope 对象。

尽管给定的 worklet 可以有多个域,但每个此类域都需要自己的代理,因为每个域都可以独立地以及与其他域同时执行代码。

只有 共享专用工作线程代理 允许使用 JavaScript Atomics API 来潜在地 阻塞

8.1.2.2 与 JavaScript 代理集群形式的集成

JavaScript 还定义了 代理集群 的概念,本标准通过在创建代理时适当地放置代理来将其映射到 Web 平台。

代理集群 概念对于定义 JavaScript 内存模型至关重要,尤其是在 SharedArrayBuffer 对象的支持数据可以在哪些 代理 之间共享方面。

从概念上讲,代理集群 概念是将多个“线程”(代理)组合在一起的与架构无关的理想化“进程边界”。规范定义的 代理集群 通常比用户代理中实现的实际进程边界更严格。通过在规范级别强制执行这些理想化的划分,我们确保 Web 开发人员看到关于共享内存的可互操作行为,即使在面对各种变化的用户代理进程模型时也是如此。

以下全局对象对都位于同一个 代理集群 中,因此可以使用 SharedArrayBuffer 实例相互共享内存

以下全局对象对不在同一个 代理集群 中,因此无法共享内存

8.1.3 脚本处理模型

8.1.3.1 运行时脚本错误

reportError

所有当前引擎都支持。

Firefox93+Safari15.4+Chrome95+
Opera?Edge95+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
self.reportError(e)

以与未处理异常相同的方式,在给定值 e 的全局对象上分派 error 事件。

在各种情况下,用户代理可以通过在 Window 上触发 error 事件来报告异常。如果未取消此事件,则认为该错误未处理,并且可以报告给开发者控制台。

8.1.3.2 未处理的 Promise 拒绝

Window/rejectionhandled_event

所有当前引擎都支持。

Firefox69+Safari11+Chrome49+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS11.3+Chrome Android?WebView Android?Samsung Internet?Opera Android?

除了同步的 运行时脚本错误 之外,脚本还可能遇到异步 Promise 拒绝,通过 unhandledrejectionrejectionhandled 事件进行跟踪。

8.1.4 模块说明符解析

8.1.4.1 解析算法

解析模块说明符”算法是将模块说明符字符串转换为URL的主要入口点。当不涉及导入映射时,它相对简单,并简化为解析类似 URL 的模块说明符

当存在非空的导入映射时,行为会更加复杂。它会检查所有适用模块说明符映射中的候选条目,从最具体到最不具体的作用域(回退到顶层的无作用域导入),以及从最具体到最不具体的前缀。

最终,如果通过任何候选模块说明符映射都没有找到成功的解析,则解析模块说明符将抛出异常。因此,结果始终是URL或抛出的异常。

8.1.4.2 导入映射

一个导入映射允许控制模块说明符的解析。导入映射通过内联的script元素传递,其type属性设置为“importmap”,并且其子文本内容包含导入映射的 JSON 表示形式。

每个Document只处理一个导入映射。在看到第一个导入映射后,其他导入映射将被忽略,其对应的script元素会生成error事件。类似地,一旦任何模块被导入(例如,通过import()表达式或script元素,其type属性设置为“module”),则进一步的导入映射将被忽略。

这些限制以及对外部导入映射的支持不足是为了使该功能的初始版本保持简单。随着实现者带宽的增加,它们可能会随着时间的推移而解除。

导入映射最简单的用法是全局重新映射裸模块说明符

{
  "imports": {
    "moment": "/node_modules/moment/src/moment.js"
  }
}

这使得像import moment from "moment";这样的语句能够工作,获取并评估位于/node_modules/moment/src/moment.js URL 的 JavaScript 模块。

导入映射可以通过使用尾部斜杠将一类模块说明符重新映射到一类 URL,如下所示

{
  "imports": {
    "moment/": "/node_modules/moment/src/"
  }
}

这使得像import localeData from "moment/locale/zh-cn.js";这样的语句能够工作,获取并评估位于/node_modules/moment/src/locale/zh-cn.js URL 的 JavaScript 模块。此类尾部斜杠映射通常与裸说明符映射组合使用,例如

{
  "imports": {
    "moment": "/node_modules/moment/src/moment.js",
    "moment/": "/node_modules/moment/src/"
  }
}

以便“moment”指定的“主模块”和“moment/locale/zh-cn.js”等路径指定的“子模块”都可用。

裸说明符并不是导入映射可以重新映射的唯一类型的模块说明符。“类似 URL”的说明符,即那些可以解析为绝对 URL 或以“/”、“./”或“../”开头的说明符,也可以被重新映射

{
  "imports": {
    "https://cdn.example.com/vue/dist/vue.runtime.esm.js": "/node_modules/vue/dist/vue.runtime.esm.js",
    "/js/app.mjs": "/js/app-8e0d62a03.mjs",
    "../helpers/": "https://cdn.example/helpers/"
  }
}

请注意,要重新映射的 URL 以及要映射到的 URL 可以指定为绝对 URL,也可以指定为以“/”、“./”或“../”开头的相对 URL。(它们不能指定为没有这些起始符号的相对 URL,因为这些符号有助于将它们与裸模块说明符区分开来。)还要注意,尾部斜杠映射在此上下文中也能正常工作。

此类重新映射在规范化后的 URL 上进行操作,并且不需要在导入映射键中提供的字面字符串与导入的模块说明符之间进行匹配。例如,如果此导入映射包含在https://example.com/app.html上,那么不仅import "/js/app.mjs"会被重新映射,而且import "./js/app.mjs"import "./foo/../js/app.mjs"也会被重新映射。

所有以前的示例都通过在导入映射中使用顶层的“imports”键全局重新映射了模块说明符。顶层的“scopes”键可用于提供本地化重新映射,这些重新映射仅在引用模块与特定 URL 前缀匹配时才适用。例如

{
  "scopes": {
    "/a/" : {
      "moment": "/node_modules/moment/src/moment.js"
    },
    "/b/" : {
      "moment": "https://cdn.example.com/moment/src/moment.js"
    }
  }
}

使用此导入映射,语句import "moment"将具有不同的含义,具体取决于包含该语句的哪个引用脚本

作用域的典型用法是允许在 Web 应用程序中存在“相同”模块的多个版本,其中模块图的某些部分导入一个版本,而其他部分导入另一个版本。

作用域可以相互重叠,并与全局“imports”说明符映射重叠。在解析时,将按从最具体到最不具体的顺序咨询作用域,其中具体性是通过使用代码单元小于操作对作用域进行排序来衡量的。例如,“/scope2/scope3/”被视为比“/scope2/”更具体,后者又被视为比顶层(无作用域)映射更具体。

下面的导入映射说明了这一点

{
  "imports": {
    "a": "/a-1.mjs",
    "b": "/b-1.mjs",
    "c": "/c-1.mjs"
  },
  "scopes": {
    "/scope2/": {
      "a": "/a-2.mjs"
    },
    "/scope2/scope3/": {
      "b": "/b-3.mjs"
    }
  }
}

这将导致以下解析(为简洁起见,使用相对 URL)

说明符
"a""b""c"
引用者/scope1/r.mjs /a-1.mjs /b-1.mjs /c-1.mjs
/scope2/r.mjs /a-2.mjs /b-1.mjs /c-1.mjs
/scope2/scope3/r.mjs /a-2.mjs /b-3.mjs /c-1.mjs

导入映射还可以用于为模块提供完整性元数据,以用于子资源完整性检查。[SRI]

下面的导入映射说明了这一点

{
  "imports": {
    "a": "/a-1.mjs",
    "b": "/b-1.mjs",
    "c": "/c-1.mjs"
  },
  "integrity": {
    "/a-1.mjs": "sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7",
    "/d-1.mjs": "sha384-MBO5IDfYaE6c6Aao94oZrIOiC6CGiSN2n4QUbHNPhzk5Xhm0djZLQqTpL0HzTUxk"
  }
}

上面的示例提供了要对模块/a-1.mjs/d-1.mjs执行的完整性元数据,即使后者未在映射中定义为导入。


表示导入映射script元素的子文本内容必须符合以下导入映射编写要求

一个有效的模块说明符映射是一个满足以下要求的 JSON 对象

8.1.4.3 与模块相关的宿主钩子

JavaScript 规范定义了模块的语法,以及其处理模型中的一些与宿主无关的部分。本规范定义了其处理模型的其余部分:如何通过script元素(其type属性设置为“module”)引导模块系统,以及如何获取、解析和执行模块。[JAVASCRIPT]

尽管 JavaScript 规范以“脚本”与“模块”的方式进行描述,但总的来说,本规范以经典脚本模块脚本的方式进行描述,因为它们都使用script元素。

modulePromise = import(specifier)

返回由specifier标识的模块脚本的模块命名空间对象的 Promise。这允许在运行时动态导入模块脚本,而不是静态地使用import语句形式。说明符将相对于活动脚本进行解析

如果给出无效的说明符,或者在获取或评估生成的模块图时遇到错误,则返回的 Promise 将被拒绝。

此语法可以在经典模块脚本中使用。因此,它为从经典脚本世界进入模块脚本世界提供了一个桥梁。

url = import.meta.url

返回活动模块脚本基本 URL

此语法只能在模块脚本中使用。

url = import.meta.resolve(specifier)

返回specifier,相对于活动脚本进行解析。也就是说,这将返回通过使用import(specifier)导入的 URL。

如果给出无效的说明符,则会抛出TypeError异常。

此语法只能在模块脚本中使用。

模块映射用于确保导入的模块脚本每个Document工作线程仅获取、解析和评估一次。

由于模块映射以(URL,模块类型)为键,因此以下代码将在模块映射中创建三个单独的条目,因为它导致了三个不同的(URL,模块类型)元组(全部具有“javascript-or-wasm”类型)

import "https://example.com/module.mjs";
import "https://example.com/module.mjs#map-buster";
import "https://example.com/module.mjs?debug=true";

也就是说,URL查询片段可以有所不同以在模块映射中创建不同的条目;它们不会被忽略。因此,将执行三个单独的获取和三个单独的模块评估。

相反,以下代码只会创建模块映射中的单个条目,因为在将URL 解析器应用于这些输入后,生成的URL 记录是相等的。

import "https://example.com/module2.mjs";
import "https:example.com/module2.mjs";
import "https://///example.com\\module2.mjs";
import "https://example.com/foo/../module2.mjs";

因此,在这个第二个示例中,只会发生一次获取和一次模块评估。

请注意,此行为与共享工作线程如何通过其解析的构造函数 URL进行键控相同。

由于模块类型也是模块映射键的一部分,因此以下代码将在模块映射中创建两个单独的条目(第一个的类型为“javascript-or-wasm”,第二个的类型为“css”)。

<script type=module>
  import "https://example.com/module";
</script>
<script type=module>
  import "https://example.com/module" with { type: "css" };
</script>

这可能导致执行两次单独的获取和两次单独的模块评估。

在实践中,由于尚未指定的内存缓存(请参阅问题#6110),资源可能只在基于 WebKit 和 Blink 的浏览器中获取一次。此外,只要所有模块类型都是互斥的,获取单个模块脚本中的模块类型检查对于至少一个导入都会失败,因此最多只会发生一个模块评估。

模块映射键中包含类型的目的是,类型属性错误的导入不会阻止具有相同说明符但类型正确的不同导入成功。

从另一个 JavaScript 模块导入时,JavaScript 模块脚本是默认的导入类型;也就是说,当import语句缺少type导入属性时,导入的模块脚本的类型将为 JavaScript。尝试使用带有type导入属性的import语句导入 JavaScript 资源将失败。

<script type="module">
    // All of the following will fail, assuming that the imported .mjs files are served with a
    // JavaScript MIME type. JavaScript module scripts are the default and cannot be imported with
    // any import type attribute.
    import foo from "./foo.mjs" with { type: "javascript" };
    import foo2 from "./foo2.mjs" with { type: "js" };
    import foo3 from "./foo3.mjs" with { type: "" };
    await import("./foo4.mjs", { with: { type: null } });
    await import("./foo5.mjs", { with: { type: undefined } });
</script>

8.1.5 事件循环

为了协调事件、用户交互、脚本、渲染、网络等,用户代理必须使用本节中描述的事件循环。每个代理都有一个关联的事件循环,该循环对于该代理是唯一的。

同源窗口代理关联的事件循环称为窗口事件循环事件循环专用工作线程代理共享工作线程代理服务工作线程代理关联的事件循环称为工作线程事件循环。而与工作线程代理关联的事件循环称为工作线程事件循环

事件循环不一定对应于实现线程。例如,多个窗口事件循环可以在单个线程中协作调度。

但是,对于分配了设置为 true 的 [[CanBlock]] 的各种工作线程代理,JavaScript 规范确实对它们关于向前推进提出了要求,在这些情况下,实际上相当于要求专用每个代理线程。

8.1.6 事件

8.1.6.1 事件处理程序

Events/Event_handlers

许多对象可以指定事件处理程序。这些充当在其上指定的对象的非捕获事件侦听器[DOM]

事件处理程序以两种方式公开。

第一种方式(所有事件处理程序都通用)是作为事件处理程序 IDL 属性

第二种方式是作为事件处理程序内容属性HTML 元素上的事件处理程序以及Window对象上的一些事件处理程序以此方式公开。

对于这两种方式,事件处理程序通过名称公开,该名称是一个始终以“on”开头并后跟处理程序预期事件名称的字符串。


大多数情况下,公开事件处理程序的对象与添加相应事件侦听器的对象相同。但是,bodyframeset元素公开了几个事件处理程序,这些事件处理程序作用于元素的Window对象(如果存在)。在任何一种情况下,我们都将该对象称为事件处理程序作用于该事件处理程序目标


事件处理程序 IDL 属性是特定事件处理程序的 IDL 属性。IDL 属性的名称与事件处理程序名称相同。


事件处理程序内容属性是特定事件处理程序的内容属性。内容属性的名称与事件处理程序名称相同。

事件处理程序内容属性在指定时,必须包含有效的 JavaScript 代码,该代码在解析后将与FunctionBody生成在自动分号插入后匹配。

此示例演示了事件侦听器调用的顺序。如果用户在此示例中单击按钮,页面将显示四个警报,文本分别为“ONE”、“TWO”、“THREE”和“FOUR”。

<button id="test">Start Demo</button>
<script>
 var button = document.getElementById('test');
 button.addEventListener('click', function () { alert('ONE') }, false);
 button.setAttribute('onclick', "alert('NOT CALLED')"); // event handler listener is registered here
 button.addEventListener('click', function () { alert('THREE') }, false);
 button.onclick = function () { alert('TWO'); };
 button.addEventListener('click', function () { alert('FOUR') }, false);
</script>

但是,在以下示例中,事件处理程序在其初始激活(及其事件侦听器已移除)后被停用,然后在稍后重新激活。页面将依次显示五个警报,文本分别为“ONE”、“TWO”、“THREE”、“FOUR”和“FIVE”。

<button id="test">Start Demo</button>
<script>
 var button = document.getElementById('test');
 button.addEventListener('click', function () { alert('ONE') }, false);
 button.setAttribute('onclick', "alert('NOT CALLED')"); // event handler is activated here
 button.addEventListener('click', function () { alert('TWO') }, false);
 button.onclick = null;                                 // but deactivated here
 button.addEventListener('click', function () { alert('THREE') }, false);
 button.onclick = function () { alert('FOUR'); };       // and re-activated here
 button.addEventListener('click', function () { alert('FIVE') }, false);
</script>

EventHandler回调函数类型表示用于事件处理程序的回调。

在 JavaScript 中,任何Function对象都实现此接口。

例如,以下文档片段

<body onload="alert(this)" onclick="alert(this)">

...在文档加载时导致显示“[object Window]”的警报,并在用户在页面中单击任何内容时导致显示“[object HTMLBodyElement]”的警报。

函数的返回值会影响事件是否被取消:如果返回值为 false,则事件会被取消。

由于历史原因,平台中存在两个例外。

由于历史原因,onerror处理程序具有不同的参数。

window.onerror = (message, source, lineno, colno, error) => {};

类似地,onbeforeunload处理程序具有不同的返回值:它将被转换为字符串。

8.1.6.2 元素、Document对象和Window对象上的事件处理程序

以下是所有HTML 元素支持的事件处理程序(及其相应的事件处理程序事件类型),既作为事件处理程序内容属性也作为事件处理程序 IDL 属性;并且所有DocumentWindow对象都支持,作为事件处理程序 IDL 属性

事件处理程序 事件处理程序事件类型
onabort

HTMLMediaElement/abort_event

所有当前引擎都支持。

Firefox9+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
abort
onauxclick

Element/auxclick_event

Firefox53+SafariNoChrome55+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android53+Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
auxclick
onbeforeinput beforeinput
onbeforematch beforematch
onbeforetoggle beforetoggle
oncancel

HTMLDialogElement/cancel_event

所有当前引擎都支持。

Firefox98+Safari15.4+Chrome37+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome AndroidNoWebView Android?Samsung Internet?Opera Android?
cancel
oncanplay

HTMLMediaElement/canplay_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
canplay
oncanplaythrough

HTMLMediaElement/canplaythrough_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
canplaythrough
onchange

HTMLElement/change_event

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView AndroidSamsung InternetOpera Android10.1+
更改
onclick

元素/click_event

所有当前引擎都支持。

Firefox6+Safari3+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android6+Safari iOS1+Chrome AndroidWebView AndroidSamsung InternetOpera Android12.1+
点击
onclose 关闭
oncontextlost contextlost
oncontextmenu contextmenu
oncontextrestored contextrestored
oncopy

元素/copy_event

所有当前引擎都支持。

Firefox22+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
复制
oncuechange

HTMLTrackElement/cuechange_event

所有当前引擎都支持。

Firefox68+Safari10+Chrome32+
Opera19+Edge79+
旧版 Edge14+Internet Explorer不支持
Firefox AndroidSafari iOSChrome AndroidWebView Android4.4.3+Samsung InternetOpera Android19+
cuechange
oncut

元素/cut_event

所有当前引擎都支持。

Firefox22+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
剪切
ondblclick

元素/dblclick_event

所有当前引擎都支持。

Firefox6+Safari3+Chrome1+
Opera11.6+Edge79+
旧版 Edge12+Internet Explorer8+
Firefox Android6+Safari iOS1+Chrome Android不支持WebView AndroidSamsung InternetOpera Android12.1+
双击
ondrag 拖动
ondragend 拖动结束
ondragenter 拖动进入
ondragleave 拖动离开
ondragover 拖动经过
ondragstart 拖动开始
ondrop 拖放
ondurationchange

HTMLMediaElement/durationchange_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
durationchange
onemptied

HTMLMediaElement/emptied_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
emptied
onended

HTMLMediaElement/ended_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
ended
onformdata formdata
oninput

HTMLElement/input_event

所有当前引擎都支持。

Firefox6+Safari3.1+Chrome1+
Opera11.6+Edge79+
旧版 Edge不支持Internet Explorer🔰 9+
Firefox AndroidSafari iOSChrome AndroidWebView AndroidSamsung InternetOpera Android12+
input
oninvalid invalid
onkeydown

元素/keydown_event

所有当前引擎都支持。

Firefox6+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView AndroidSamsung InternetOpera Android12.1+
keydown
onkeypress keypress
onkeyup

元素/keyup_event

所有当前引擎都支持。

Firefox6+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView AndroidSamsung InternetOpera Android12.1+
keyup
onloadeddata

HTMLMediaElement/loadeddata_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
loadeddata
onloadedmetadata

HTMLMediaElement/loadedmetadata_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
loadedmetadata
onloadstart

HTMLMediaElement/loadstart_event

所有当前引擎都支持。

Firefox6+Safari4+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
loadstart
onmousedown

元素/mousedown_event

所有当前引擎都支持。

Firefox6+Safari4+Chrome2+
Opera11.6+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView Android37+Samsung InternetOpera Android12.1+
mousedown
onmouseenter

元素/mouseenter_event

所有当前引擎都支持。

Firefox10+Safari7+Chrome30+
Opera?Edge79+
旧版 Edge12+Internet Explorer5.5+
Firefox AndroidSafari iOSChrome AndroidWebView Android37+Samsung InternetOpera Android
mouseenter
onmouseleave

元素/mouseleave_event

所有当前引擎都支持。

Firefox10+Safari7+Chrome30+
Opera?Edge79+
旧版 Edge12+Internet Explorer5.5+
Firefox AndroidSafari iOSChrome AndroidWebView Android37+Samsung InternetOpera Android
mouseleave
onmousemove

元素/mousemove_event

所有当前引擎都支持。

Firefox6+Safari4+Chrome2+
Opera11.6+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView Android37+Samsung InternetOpera Android12.1+
mousemove
onmouseout

元素/mouseout_event

所有当前引擎都支持。

Firefox6+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView Android37+Samsung InternetOpera Android12.1+
mouseout
onmouseover

元素/mouseover_event

所有当前引擎都支持。

Firefox6+Safari4+Chrome2+
Opera9.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView Android37+Samsung InternetOpera Android10.1+
mouseover
onmouseup

元素/mouseup_event

所有当前引擎都支持。

Firefox6+Safari4+Chrome2+
Opera11.6+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView Android37+Samsung InternetOpera Android12.1+
mouseup
onpaste

元素/paste_event

所有当前引擎都支持。

Firefox22+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOS3+Chrome AndroidWebView Android37+Samsung InternetOpera Android12.1+
粘贴
onpause

HTMLMediaElement/pause_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
暂停
onplay

HTMLMediaElement/play_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
播放
onplaying

HTMLMediaElement/playing_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
正在播放
onprogress

HTMLMediaElement/progress_event

所有当前引擎都支持。

Firefox6+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
进度
onratechange

HTMLMediaElement/ratechange_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
ratechange
onreset 重置
onscrollend

Document/scrollend_event

Firefox109+Safari不支持Chrome114+
OperaEdge114+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

元素/scrollend_event

Firefox109+Safari不支持Chrome114+
OperaEdge114+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
scrollend
onsecuritypolicyviolation

元素/securitypolicyviolation_event

所有当前引擎都支持。

Firefox63+Safari10+Chrome41+
Opera?Edge79+
旧版 Edge15+Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
securitypolicyviolation
onseeked

HTMLMediaElement/seeked_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
seeked
onseeking

HTMLMediaElement/seeking_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
seeking
onselect

HTMLInputElement/select_event

所有当前引擎都支持。

Firefox6+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView AndroidSamsung InternetOpera Android12.1+

HTMLTextAreaElement/select_event

所有当前引擎都支持。

Firefox6+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView AndroidSamsung InternetOpera Android12.1+
选择
onslotchange

HTMLSlotElement/slotchange_event

所有当前引擎都支持。

Firefox63+Safari10.1+Chrome53+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
slotchange
onstalled

HTMLMediaElement/stalled_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
stalled
onsubmit

HTMLFormElement/submit_event

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOS1+Chrome AndroidWebView AndroidSamsung InternetOpera Android10.1+
提交
onsuspend

HTMLMediaElement/suspend_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
suspend
ontimeupdate

HTMLMediaElement/timeupdate_event

所有当前引擎都支持。

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
timeupdate
ontoggle 切换
onvolumechange

HTMLMediaElement/volumechange_event

所有当前引擎都支持。

Firefox6+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOS3+Chrome AndroidWebView Android37+Samsung InternetOpera Android12.1+
volumechange
onwaiting

HTMLMediaElement/waiting_event

所有当前引擎都支持。

Firefox6+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOS3+Chrome AndroidWebView Android37+Samsung InternetOpera Android12.1+
等待
onwebkitanimationend webkitAnimationEnd
onwebkitanimationiteration webkitAnimationIteration
onwebkitanimationstart webkitAnimationStart
onwebkittransitionend webkitTransitionEnd
onwheel

元素/wheel_event

所有当前引擎都支持。

Firefox17+Safari7+Chrome31+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOS不支持Chrome AndroidWebView AndroidSamsung InternetOpera Android
滚轮

以下是所有事件处理程序(以及它们对应的事件处理程序事件类型),除了bodyframeset元素之外,所有HTML 元素都支持,作为事件处理程序内容属性事件处理程序 IDL 属性;所有Document对象都支持,作为事件处理程序 IDL 属性;所有Window对象都支持,作为事件处理程序 IDL 属性,在Window对象本身,以及在该Window对象的关联的Document拥有的所有bodyframeset元素上公开的相应的事件处理程序内容属性事件处理程序 IDL 属性

事件处理程序 事件处理程序事件类型
onblur

元素/blur_event

所有当前引擎都支持。

Firefox24+Safari3.1+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView AndroidSamsung InternetOpera Android12.1+

Window/blur_event

所有当前引擎都支持。

Firefox6+Safari5.1+Chrome5+
Opera12.1+Edge79+
旧版 Edge12+Internet Explorer11
Firefox AndroidSafari iOSChrome AndroidWebView Android37+Samsung InternetOpera Android12.1+
失去焦点
onerror

Window/error_event

所有当前引擎都支持。

Firefox6+Safari5.1+Chrome10+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView Android37+Samsung InternetOpera Android
错误
onfocus

元素/focus_event

所有当前引擎都支持。

Firefox24+Safari3.1+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView AndroidSamsung InternetOpera Android12.1+

Window/focus_event

所有当前引擎都支持。

Firefox6+Safari5.1+Chrome5+
Opera12.1+Edge79+
旧版 Edge12+Internet Explorer11
Firefox AndroidSafari iOSChrome AndroidWebView Android37+Samsung InternetOpera Android12.1+
获得焦点
onload

加载
onresize 调整大小
onscroll

文档/滚动事件

所有当前引擎都支持。

Firefox6+Safari2+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView AndroidSamsung InternetOpera Android12+

元素/滚动事件

所有当前引擎都支持。

Firefox6+Safari1.3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox AndroidSafari iOSChrome AndroidWebView AndroidSamsung InternetOpera Android12.1+
滚动

我们将此表第一列列出的集合中的名称称为事件处理程序Window反映主体元素事件处理程序集


以下是Window对象支持的事件处理程序(及其对应的事件处理程序事件类型),作为Window对象本身上的事件处理程序IDL属性,以及相应的事件处理程序内容属性事件处理程序IDL属性,这些属性在所有由该Window对象的关联的Document拥有的bodyframeset元素上公开。

事件处理程序 事件处理程序事件类型
onafterprint

Window/afterprint_event

所有当前引擎都支持。

Firefox6+Safari13+Chrome63+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
afterprint
onbeforeprint

Window/beforeprint_event

所有当前引擎都支持。

Firefox6+Safari13+Chrome63+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
beforeprint
onbeforeunload

Window/beforeunload_event

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera12+Edge79+
Edge (旧版)12+Internet Explorer4+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12+
beforeunload
onhashchange

Window/hashchange_event

所有当前引擎都支持。

Firefox3.6+Safari5+Chrome8+
Opera10.6+Edge79+
旧版 Edge12+Internet Explorer8+
Firefox Android?Safari iOS5+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
hashchange
onlanguagechange

Window/languagechange_event

所有当前引擎都支持。

Firefox32+Safari10.1+Chrome37+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android4+Safari iOS?Chrome Android?WebView Android?Samsung Internet4.0+Opera Android?
languagechange
onmessage

Window/message_event

所有当前引擎都支持。

Firefox9+Safari4+Chrome60+
Opera?Edge79+
旧版 Edge12+Internet Explorer8+
Firefox Android?Safari iOS4+Chrome Android?WebView Android?Samsung Internet?Opera Android47+
message
onmessageerror

HTMLMediaElement/error_event

所有当前引擎都支持。

Firefox6+Safari3.1+Chrome3+
Opera11.6+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12+

Window/messageerror_event

所有当前引擎都支持。

Firefox57+Safari16.4+Chrome60+
Opera?Edge79+
Edge (旧版)18Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android47+
messageerror
onoffline

Window/offline_event

所有当前引擎都支持。

Firefox9+Safari4+Chrome3+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android?
offline
ononline

Window/online_event

所有当前引擎都支持。

Firefox9+Safari4+Chrome3+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android?
online
onpageswap pageswap
onpagehide pagehide
onpagereveal pagereveal
onpageshow pageshow
onpopstate

Window/popstate_event

所有当前引擎都支持。

Firefox4+Safari5+Chrome5+
Opera11.5+Edge79+
Edge (旧版)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android11.5+
popstate
onrejectionhandled

Window/rejectionhandled_event

所有当前引擎都支持。

Firefox69+Safari11+Chrome49+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS11.3+Chrome Android?WebView Android?Samsung Internet?Opera Android?
rejectionhandled
onstorage

Window/storage_event

所有当前引擎都支持。

Firefox45+Safari4+Chrome1+
Opera?Edge79+
Edge (旧版)15+Internet Explorer9+
Firefox Android?Safari iOS4+Chrome Android?WebView Android37+Samsung Internet?Opera Android?
storage
onunhandledrejection

Window/unhandledrejection_event

所有当前引擎都支持。

Firefox69+Safari11+Chrome49+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS11.3+Chrome Android?WebView Android?Samsung Internet?Opera Android?
unhandledrejection
onunload

Window/unload_event

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera4+Edge79+
Edge (旧版)12+Internet Explorer4+
Firefox AndroidSafari iOS1+Chrome AndroidWebView AndroidSamsung InternetOpera Android10.1+
unload

以下是作为事件处理程序IDL属性Document对象上支持的事件处理程序(及其对应的事件处理程序事件类型)。

事件处理程序 事件处理程序事件类型
onreadystatechange readystatechange
onvisibilitychange

Document/visibilitychange_event

所有当前引擎都支持。

Firefox56+Safari14.1+Chrome62+
Opera49+Edge79+
Edge (旧版)18Internet Explorer🔰 10+
Firefox Android?Safari iOS?Chrome Android?WebView Android62+Samsung Internet?Opera Android46+
visibilitychange

8.2 WindowOrWorkerGlobalScope 混合

WindowOrWorkerGlobalScope 混合用于要公开在 WindowWorkerGlobalScope 对象上的 API。

鼓励其他标准使用 partial interface mixin WindowOrWorkerGlobalScope { … }; 以及适当的引用来进一步扩展它。

self.isSecureContext

返回此全局对象是否表示安全上下文[SECURE-CONTEXTS]

self.origin

返回全局对象的来源,序列化为字符串。

self.crossOriginIsolated

返回在此全局中运行的脚本是否允许使用需要跨源隔离的 API。这取决于`Cross-Origin-Opener-Policy` 和 `Cross-Origin-Embedder-Policy` HTTP 响应标头以及“cross-origin-isolated”功能。

强烈建议开发人员使用 self.origin 而不是 location.origin。前者返回环境的来源,后者返回环境的 URL。想象一下以下脚本在 https://stargate.example/ 上的文档中执行

var frame = document.createElement("iframe")
frame.onload = function() {
  var frameWin = frame.contentWindow
  console.log(frameWin.location.origin) // "null"
  console.log(frameWin.origin) // "https://stargate.example"
}
document.body.appendChild(frame)

self.origin 是一个更可靠的安全指标。

8.3 Base64 实用程序方法

atob()btoa() 方法允许开发人员将内容转换为 Base64 编码和从 Base64 编码转换。

在这些 API 中,出于助记的目的,“b”可以认为代表“二进制”,而“a”代表“ASCII”。但是,实际上,主要由于历史原因,这两个函数的输入和输出都是 Unicode 字符串。

result = self.btoa(data)

获取输入数据,以 Unicode 字符串的形式,该字符串仅包含范围 U+0000 到 U+00FF 内的字符,每个字符分别表示值分别为 0x00 到 0xFF 的二进制字节,并将其转换为其 Base64 表示形式,然后返回。

如果输入字符串包含任何超出范围的字符,则抛出InvalidCharacterError DOMException 异常。

result = self.atob(data)

获取输入数据,以 Unicode 字符串的形式,该字符串包含 Base64 编码的二进制数据,对其进行解码,并返回一个字符串,该字符串由范围 U+0000 到 U+00FF 内的字符组成,每个字符分别表示值分别为 0x00 到 0xFF 的二进制字节,对应于该二进制数据。

如果输入字符串不是有效的 Base64 数据,则抛出InvalidCharacterError DOMException 异常。