Web 开发人员版 — 最后更新于 2024年9月12日
各种机制会导致作者提供的可执行代码在文档的上下文中运行。这些机制包括但不限于
script
元素。javascript:
URL。addEventListener()
注册,还是通过显式的 事件处理程序内容属性,通过 事件处理程序 IDL 属性,或其他方式。JavaScript 定义了 代理 的概念。本节提供了该语言级概念到 Web 平台的映射。
从概念上讲,代理 概念是在其中运行 JavaScript 代码的与架构无关的理想化“线程”。此类代码可能涉及多个全局/ 域,这些全局/域可以同步地相互访问,因此需要在单个执行线程中运行。
Web 平台上存在以下类型的代理
包含各种可能相互访问的 Window
对象,无论是直接访问还是使用 document.domain
。
如果包含的 代理集群 的 是否基于源 为 true,则所有 Window
对象都将是 同源,可以直接相互访问,并且 document.domain
将不起作用。
包含单个 SharedWorkerGlobalScope
。
包含单个 ServiceWorkerGlobalScope
。
包含单个 WorkletGlobalScope
对象。
尽管给定的 worklet 可以有多个域,但每个此类域都需要自己的代理,因为每个域都可以独立地以及与其他域同时执行代码。
只有 共享 和 专用工作线程代理 允许使用 JavaScript Atomics
API 来潜在地 阻塞。
JavaScript 还定义了 代理集群 的概念,本标准通过在创建代理时适当地放置代理来将其映射到 Web 平台。
代理集群 概念对于定义 JavaScript 内存模型至关重要,尤其是在 SharedArrayBuffer
对象的支持数据可以在哪些 代理 之间共享方面。
从概念上讲,代理集群 概念是将多个“线程”(代理)组合在一起的与架构无关的理想化“进程边界”。规范定义的 代理集群 通常比用户代理中实现的实际进程边界更严格。通过在规范级别强制执行这些理想化的划分,我们确保 Web 开发人员看到关于共享内存的可互操作行为,即使在面对各种变化的用户代理进程模型时也是如此。
所有当前引擎都支持。
self.reportError(e)
以与未处理异常相同的方式,在给定值 e 的全局对象上分派 error
事件。
在各种情况下,用户代理可以通过在 Window
上触发 error
事件来报告异常。如果未取消此事件,则认为该错误未处理,并且可以报告给开发者控制台。
所有当前引擎都支持。
除了同步的 运行时脚本错误 之外,脚本还可能遇到异步 Promise 拒绝,通过 unhandledrejection
和 rejectionhandled
事件进行跟踪。
“解析模块说明符”算法是将模块说明符字符串转换为URL的主要入口点。当不涉及导入映射时,它相对简单,并简化为解析类似 URL 的模块说明符。
当存在非空的导入映射时,行为会更加复杂。它会检查所有适用模块说明符映射中的候选条目,从最具体到最不具体的作用域(回退到顶层的无作用域导入),以及从最具体到最不具体的前缀。
最终,如果通过任何候选模块说明符映射都没有找到成功的解析,则解析模块说明符将抛出异常。因此,结果始终是URL或抛出的异常。
一个导入映射允许控制模块说明符的解析。导入映射通过内联的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"
将具有不同的含义,具体取决于包含该语句的哪个引用脚本
在位于/a/
下的脚本中,这将导入/node_modules/moment/src/moment.js
。
在位于/b/
下的脚本中,这将导入https://cdn.example.com/moment/src/moment.js
。
在位于/c/
下的脚本中,这将无法解析,因此会抛出异常。
作用域的典型用法是允许在 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。[JSON]
JSON 必须表示一个 JSON 对象,最多包含三个键“imports
”、“scopes
”和“integrity
”。
如果存在,则对应于“imports
”、“scopes
”和“integrity
”键的值本身必须是 JSON 对象。
如果存在,则对应于“imports
”键的值必须是有效的模块说明符映射。
如果存在,则对应于“scopes
”键的值必须是 JSON 对象,其键是有效的 URL 字符串,其值是有效的模块说明符映射。
如果存在,则对应于“integrity
”键的值必须是 JSON 对象,其键是有效的 URL 字符串,其值符合完整性属性的要求。
一个有效的模块说明符映射是一个满足以下要求的 JSON 对象
它的所有键都必须是非空的。
它的所有值都必须是字符串。
每个值必须是有效的绝对 URL或有效的 URL 字符串,并且以“/
”、“./
”或“../
”开头。
如果给定的键以“/
”结尾,则对应的值也必须以“/
”结尾。
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 >
为了协调事件、用户交互、脚本、渲染、网络等,用户代理必须使用本节中描述的事件循环。每个代理都有一个关联的事件循环,该循环对于该代理是唯一的。
与同源窗口代理关联的事件循环称为窗口事件循环。事件循环与专用工作线程代理、共享工作线程代理或服务工作线程代理关联的事件循环称为工作线程事件循环。而与工作线程代理关联的事件循环称为工作线程事件循环。
事件循环不一定对应于实现线程。例如,多个窗口事件循环可以在单个线程中协作调度。
但是,对于分配了设置为 true 的 [[CanBlock]] 的各种工作线程代理,JavaScript 规范确实对它们关于向前推进提出了要求,在这些情况下,实际上相当于要求专用每个代理线程。
许多对象可以指定事件处理程序。这些充当在其上指定的对象的非捕获事件侦听器。[DOM]
事件处理程序以两种方式公开。
第一种方式(所有事件处理程序都通用)是作为事件处理程序 IDL 属性。
第二种方式是作为事件处理程序内容属性。 HTML 元素上的事件处理程序以及Window
对象上的一些事件处理程序以此方式公开。
对于这两种方式,事件处理程序通过名称公开,该名称是一个始终以“on
”开头并后跟处理程序预期事件名称的字符串。
大多数情况下,公开事件处理程序的对象与添加相应事件侦听器的对象相同。但是,body
和frameset
元素公开了几个事件处理程序,这些事件处理程序作用于元素的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
处理程序,其中返回true会取消事件。
onbeforeunload
处理程序,其中返回任何非空且非未定义的值将取消事件。
由于历史原因,onerror
处理程序具有不同的参数。
window. onerror = ( message, source, lineno, colno, error) => { … };
类似地,onbeforeunload
处理程序具有不同的返回值:它将被转换为字符串。
Document
对象和Window
对象上的事件处理程序以下是所有HTML 元素支持的事件处理程序(及其相应的事件处理程序事件类型),既作为事件处理程序内容属性也作为事件处理程序 IDL 属性;并且所有Document
和Window
对象都支持,作为事件处理程序 IDL 属性。
事件处理程序 | 事件处理程序事件类型 |
---|---|
onabort 所有当前引擎都支持。 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 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 所有当前引擎都支持。 Firefox1+Safari3+Chrome1+ Opera9+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android10.1+ | 更改
|
onclick 所有当前引擎都支持。 Firefox6+Safari3+Chrome1+ Opera11.6+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android6+Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ | 点击
|
onclose | 关闭
|
oncontextlost | contextlost
|
oncontextmenu | contextmenu
|
oncontextrestored | contextrestored
|
oncopy 所有当前引擎都支持。 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 Android?Safari iOS?Chrome Android?WebView Android4.4.3+Samsung Internet?Opera Android19+ | cuechange
|
oncut 所有当前引擎都支持。 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 所有当前引擎都支持。 Firefox6+Safari3+Chrome1+ Opera11.6+Edge79+ 旧版 Edge12+Internet Explorer8+ Firefox Android6+Safari iOS1+Chrome Android不支持WebView Android?Samsung Internet?Opera 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 所有当前引擎都支持。 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 所有当前引擎都支持。 Firefox6+Safari3.1+Chrome1+ Opera11.6+Edge79+ 旧版 Edge不支持Internet Explorer🔰 9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12+ | input
|
oninvalid | invalid
|
onkeydown 所有当前引擎都支持。 Firefox6+Safari1.2+Chrome1+ Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ | keydown
|
onkeypress | keypress
|
onkeyup 所有当前引擎都支持。 Firefox6+Safari1.2+Chrome1+ Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera 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 所有当前引擎都支持。 Firefox6+Safari4+Chrome2+ Opera11.6+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+ | mousedown
|
onmouseenter 所有当前引擎都支持。 Firefox10+Safari7+Chrome30+ Opera?Edge79+ 旧版 Edge12+Internet Explorer5.5+ Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android? | mouseenter
|
onmouseleave 所有当前引擎都支持。 Firefox10+Safari7+Chrome30+ Opera?Edge79+ 旧版 Edge12+Internet Explorer5.5+ Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android? | mouseleave
|
onmousemove 所有当前引擎都支持。 Firefox6+Safari4+Chrome2+ Opera11.6+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+ | mousemove
|
onmouseout 所有当前引擎都支持。 Firefox6+Safari1+Chrome1+ Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+ | mouseout
|
onmouseover 所有当前引擎都支持。 Firefox6+Safari4+Chrome2+ Opera9.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android10.1+ | mouseover
|
onmouseup 所有当前引擎都支持。 Firefox6+Safari4+Chrome2+ Opera11.6+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+ | mouseup
|
onpaste 所有当前引擎都支持。 Firefox22+Safari3+Chrome1+ Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+ | 粘贴
|
onpause 所有当前引擎都支持。 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 所有当前引擎都支持。 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 Firefox109+Safari不支持Chrome114+ Opera?Edge114+ Edge (Legacy)?Internet Explorer不支持 Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? Firefox109+Safari不支持Chrome114+ Opera?Edge114+ 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 所有当前引擎都支持。 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 所有当前引擎都支持。 Firefox6+Safari1+Chrome1+ Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ HTMLTextAreaElement/select_event 所有当前引擎都支持。 Firefox6+Safari1+Chrome1+ Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera 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 所有当前引擎都支持。 Firefox1+Safari3+Chrome1+ Opera8+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera 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 Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+ | volumechange
|
onwaiting HTMLMediaElement/waiting_event 所有当前引擎都支持。 Firefox6+Safari3.1+Chrome3+ Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+ | 等待
|
onwebkitanimationend | webkitAnimationEnd
|
onwebkitanimationiteration | webkitAnimationIteration
|
onwebkitanimationstart | webkitAnimationStart
|
onwebkittransitionend | webkitTransitionEnd
|
onwheel 所有当前引擎都支持。 Firefox17+Safari7+Chrome31+ Opera?Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS不支持Chrome Android?WebView Android?Samsung Internet?Opera Android? | 滚轮
|
以下是所有事件处理程序(以及它们对应的事件处理程序事件类型),除了body
和frameset
元素之外,所有HTML 元素都支持,作为事件处理程序内容属性和事件处理程序 IDL 属性;所有Document
对象都支持,作为事件处理程序 IDL 属性;所有Window
对象都支持,作为事件处理程序 IDL 属性,在Window
对象本身,以及在该Window
对象的关联的Document
拥有的所有body
和frameset
元素上公开的相应的事件处理程序内容属性和事件处理程序 IDL 属性
事件处理程序 | 事件处理程序事件类型 |
---|---|
onblur 所有当前引擎都支持。 Firefox24+Safari3.1+Chrome1+ Opera11.6+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ 所有当前引擎都支持。 Firefox6+Safari5.1+Chrome5+ Opera12.1+Edge79+ 旧版 Edge12+Internet Explorer11 Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+ | 失去焦点
|
onerror 所有当前引擎都支持。 Firefox6+Safari5.1+Chrome10+ Opera?Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android? | 错误
|
onfocus 所有当前引擎都支持。 Firefox24+Safari3.1+Chrome1+ Opera11.6+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ 所有当前引擎都支持。 Firefox6+Safari5.1+Chrome5+ Opera12.1+Edge79+ 旧版 Edge12+Internet Explorer11 Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+ | 获得焦点
|
onload
| 加载
|
onresize | 调整大小
|
onscroll 所有当前引擎都支持。 Firefox6+Safari2+Chrome1+ Opera11.6+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12+ 所有当前引擎都支持。 Firefox6+Safari1.3+Chrome1+ Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ | 滚动
|
我们将此表第一列列出的集合中的名称称为事件处理程序的Window
反映主体元素事件处理程序集。
以下是Window
对象支持的事件处理程序(及其对应的事件处理程序事件类型),作为Window
对象本身上的事件处理程序IDL属性,以及相应的事件处理程序内容属性和事件处理程序IDL属性,这些属性在所有由该Window
对象的关联的Document
拥有的body
和frameset
元素上公开。
事件处理程序 | 事件处理程序事件类型 |
---|---|
onafterprint 所有当前引擎都支持。 Firefox6+Safari13+Chrome63+ Opera?Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? | afterprint
|
onbeforeprint 所有当前引擎都支持。 Firefox6+Safari13+Chrome63+ Opera?Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? | beforeprint
|
onbeforeunload 所有当前引擎都支持。 Firefox1+Safari3+Chrome1+ Opera12+Edge79+ Edge (旧版)12+Internet Explorer4+ Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12+ | beforeunload
|
onhashchange 所有当前引擎都支持。 Firefox3.6+Safari5+Chrome8+ Opera10.6+Edge79+ 旧版 Edge12+Internet Explorer8+ Firefox Android?Safari iOS5+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ | hashchange
|
onlanguagechange 所有当前引擎都支持。 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 所有当前引擎都支持。 Firefox9+Safari4+Chrome60+ Opera?Edge79+ 旧版 Edge12+Internet Explorer8+ Firefox Android?Safari iOS4+Chrome Android?WebView Android?Samsung Internet?Opera Android47+ | message
|
onmessageerror 所有当前引擎都支持。 Firefox6+Safari3.1+Chrome3+ Opera11.6+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12+ 所有当前引擎都支持。 Firefox57+Safari16.4+Chrome60+ Opera?Edge79+ Edge (旧版)18Internet Explorer不支持 Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android47+ | messageerror
|
onoffline 所有当前引擎都支持。 Firefox9+Safari4+Chrome3+ Opera?Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android? | offline
|
ononline 所有当前引擎都支持。 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 所有当前引擎都支持。 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 所有当前引擎都支持。 Firefox69+Safari11+Chrome49+ Opera?Edge79+ Edge (Legacy)?Internet Explorer不支持 Firefox Android?Safari iOS11.3+Chrome Android?WebView Android?Samsung Internet?Opera Android? | rejectionhandled
|
onstorage 所有当前引擎都支持。 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 所有当前引擎都支持。 Firefox1+Safari3+Chrome1+ Opera4+Edge79+ Edge (旧版)12+Internet Explorer4+ Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera 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
|
WindowOrWorkerGlobalScope
混合WindowOrWorkerGlobalScope
混合用于要公开在 Window
和 WorkerGlobalScope
对象上的 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
是一个更可靠的安全指标。
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
异常。