Warning:
This wiki has been archived and is now read-only.

HTML5/browsers

From HTML5 Chinese Interest Group Wiki
Jump to: navigation, search

网页加载过程

此部分介绍的功能最直接的应用到 Web 浏览器。话虽如此,除了另行规定之外,此部分需求定义应用于所有用户代理,无论这些用户代理是否为 Web 浏览器。

浏览上下文

一个浏览上下文是一个将 Document 对象呈现给用户的环境。

注:在一个 Web 浏览器内,一个标签页或窗口常包含一个浏览上下文,如一个 iframe 或一个 frameset 内的若干 frame

每个浏览上下文都有一个对应的WindowProxy 对象。

一个浏览上下文都有一个会话历史,它列出了这个浏览上下文Document 对象以呈现过的,正在呈现的,或将要呈现的内容。无论何时,Document 这个概念在每个浏览上下文中,都特指为激活的文档对象

每一个 Document 都关联一个 Window 对象。一个浏览上下文中的 WindowProxy 对象转发所有内容到浏览上下文中的激活文档Window 对象。

注:通常情况下,Window 对象一对一映射到 Document 对象。在特定情况下,在同一个浏览上下文Window 可以被重用来展示第二个 Document,这样的映射就是二对一。这种情况发生在由于替代激活,一个浏览上下文从最初的 about:blank Document 导航到另一个文档。
注:一个Document并不一定就有一个浏览上下文与之关联。尤其是,数据挖掘工具或许从不实例化浏览上下文。

一个浏览上下文可以拥有一个浏览上下文创建者,并对它的创建者负责。如果以一个浏览上下文拥有父级浏览上下文, 那就是说父级内容是浏览上下文创建者。否则如果浏览上下文拥有开启的新浏览器内容,那就是说本身是浏览上下文创建者。否则,说明这个浏览上下文不拥有浏览上下文创建者

如果某个浏览上下文 A 拥有浏览上下文创建者,那么它的 Document 就是浏览上下文创建者在创建 A 之时由创建文档建立的激活文档

当首次创建浏览上下文,它必须在会话历史中创建仅有的一个 Document,其地址是 about:blank,即标记为一个 HTML文档,其字符编码为 UTF-8。这个 Document 必须有唯一一个 HTML 节点,此节点必须有唯一一个 BODY 子节点。

注:如果浏览上下文创建了具体的立即导航,那么最初的导航将会被替代激活

Document 被创建后设置 about:blank Document来源,如果这个新的 浏览上下文拥有它的浏览上下文创建者,那么这个 about:blank Document 源自它的 文档创建者来源。否则,about:blank Document 来源于新浏览上下文被创建时分配的全局唯一标识符。

嵌套的浏览上下文

某些元素(例如:iframe 元素)可以生成更多的浏览上下文实例。这被称作嵌套的浏览上下文。 如果一浏览上下文 P 存在一个 Document D 和一个元素 E,这个元素内又嵌套另一个浏览上下文 C , 那么就可以说 C 通过 D 嵌套,并且 E 可以说是 C 的 浏览上下文容器。 如果这个浏览上下文容器 元素 E 在 Document D 之内,则 P 可以被称为 C 的父浏览上下文,同时 C 可以被称作 P 的一个子浏览上下文。否则,这个嵌套的浏览上下文 C 就没有父浏览上下文

一个浏览上下文 A 被认为是另一个浏览上下文 B 的祖先,如果 A 存在一个子浏览上下文 A', 这个子浏览上下文自身又是 B 的祖先。如果存在 A 的子浏览上下文 P, 它就是 B 的父浏览上下文

一个浏览上下文没有嵌套的浏览上下文也自身也没有父浏览上下文,那么它就是所有浏览上下文的顶级浏览上下文祖先浏览上下文

父浏览上下文传递祖先浏览上下文列表闭包给嵌套的浏览上下文

一个 Document d 的 后代浏览上下文(有序)列表由以下算法返回:

  1. 建立一个空列表;
  2. Document d 中,根据元素的嵌套树顺序,遍历 d 中每一个通过元素嵌套的 子浏览上下文,执行以下子步骤:
    1. 追加子浏览上下文到列表清单。
    2. 追加子浏览上下文激活文档后代浏览上下文列表到列表清单。
  3. 返回构造完成的列表。

当一个 Document 在它的浏览上下文内是激活文档时,它被称为完全激活。它的浏览上下文要么是一个顶级浏览上下文,要么它有一个父浏览上下文,并且这个 Document 通过嵌套使它自身完全激活

因为它们是通过元素嵌套,在他们的父浏览上下文子浏览上下文总是针对特定的 Document。用户代理必须不允许用户在 Document 没有完全激活时与元素的子浏览上下文交互。

嵌套的浏览上下文可以有一个无缝浏览上下文标识设置,如果它是通过 iframe 元素和一个 seamless 属性嵌入。

注:嵌套的浏览上下文可能会被从它的父浏览上下文中取出(例如:从 Document 中移除一个 iframe 元素)。在这种情况下,嵌套的浏览上下文父浏览上下文,但它仍具有相同的浏览上下文容器,目前仍在通过该元素的 Document 嵌套。这种嵌套的浏览上下文不是一个顶级浏览的上下文,并且不能保证 Document完全激活的。此外,如果浏览上下文容器(如一个 iframe )移动到另一个 Document,那么它嵌套的浏览上下文父浏览上下文将会改变。
导航在 DOM 中嵌套的浏览上下文
 此框内容是非标准的,执行要求在此框下面给出。
window . top
返回作为 顶级浏览上下文WindowProxy 对象。
window . parent
返回作为 父浏览上下文WindowProxy 对象。
window . frameElement
返回作为 浏览上下文容器Element 对象。
如果没有返回 null。
在跨域情况下抛出 SECURITY_ERR 异常。

浏览上下文 b 内 DocumentWindow 对象的 top IDL 属性,必须返回它的 顶级浏览上下文WindowProxy 对象(如果它本身就是一个顶级浏览上下文,这将返回它自身的 WindowProxy 对象),如果它有的话,或除非它拥有自己的 WindowProxy 对象(例如,如果它是一个分离的 #nested-browsing-context嵌套浏览上下文)。

浏览上下文 b 内 DocumentWindow 对象的 parent IDL 属性,必须返回它的 父浏览上下文 ,如果它有的话有(即 b 是一个 子浏览上下文),或除非 浏览上下文 b 拥有自身的 WindowProxy 对象(即,如果它是顶级浏览上下文或分离的嵌套浏览上下文)。

获取一个 Dcoument d 的 Window 对象中的 frameElement IDL 属性,必须执行以下算法:

  1. 如果 d 不是在一个嵌套的浏览上下文中,返回 null 并中止执行此后步骤。
  2. 如果 浏览上下文容器Dcoument 不具有 相同的 有效脚本源入口脚本,就抛出一个 SECURITY_ERR 异常。
  3. 否则,返回的 d 的浏览上下文容器

辅助浏览上下文

它有可能创建被关联到一个顶级浏览上下文的新浏览上下文,而不用不通过嵌套元素访问。这样的浏览上下文被称为辅助浏览上下文。辅助浏览上下文永远是顶级浏览上下文

一个 辅助浏览上下文 有一个 浏览上下文开启工具 。它是从 辅助浏览上下文 中建立的浏览上下文。

在DOM中导航辅助浏览上下文

Window 对象的 opener IDL 属性,在取值时,必须返回从当前浏览上下文中创建的浏览上下文(它是浏览上下文开启工具)的 WindowProxy 对象,如果它有的话,如果它依然有效,而且如果当前浏览上下文并没有断绝与它的开启工具的关系。在设置时,如果新的值是null,则当前浏览上下文必须断绝与其开启工具的关系,如果新值是其他任何值,则用户代理必须忽略这个新值。

次级浏览上下文

用户代理可以支持次级浏览上下文,它是一个浏览上下文,除了主要的内容区域外,是用户代理接口的构成部分。

安全性

如果符合下列条件之一,浏览上下文 A 允许访问 浏览上下文 B :

  1. A 的 当前文档 与 B 的 当前文档同源 的,或
  2. 浏览上下文 A 是具有 顶级浏览上下文嵌套浏览上下文,并且它的 顶级浏览上下文 是 B,或
  3. 浏览上下文 B 是一个 辅助浏览上下文,并且 A 被 允许访问 B 的 浏览上下文开启工具,或
  4. 浏览上下文 B 不是一个 顶级浏览上下文,但存在一个 B 的 祖先浏览上下文,其 当前文档 与 A 的 当前文档同源 的(可能就是 A 自身)。

如果元素的 Dcoument 的浏览上下文是一个 顶级浏览上下文,或如果元素的所有 祖先浏览上下文当前文档 来源 与元素 Dcoument来源均是 同源 的,元素就拥有浏览上下文来源范围。如果元素拥有 浏览上下文来源范围 则它的值是这个元素的 Dcoument 来源

浏览上下文分组

每一个浏览上下文定义了一个或多个直接可访问浏览上下文的列表。它们是:

  1. 浏览上下文本身。
  2. 所有浏览上下文子浏览上下文
  3. 浏览上下文父浏览上下文
  4. 所有的浏览上下文已经为他们的浏览上下文开启工具中的浏览上下文
  5. 浏览上下文浏览上下文开启工具启工具。

所有浏览上下文所传递的闭包可以直接可访问浏览上下文相关浏览上下文的一个单元

每个相关浏览上下文单元再进一步划分为最少数量的组群,这样每个组的每个成员的当前文档都具有一个有效的脚本源,通过操作相应的 document.domain 属性,使它可以等同于组的其他成员,但不能被用作等同于其他组的成员。每一个组是涉及同类源的浏览上下文单元

每个相关的同类源浏览上下文单元可以有一个入口脚本用于被获取,除其他事项外,脚本的基础URL用以确定在他们的相关的同类源浏览上下文单元中的脚本运行中的相对URL定位。起初,没有入口脚本。它被修改算法为跳到一个代码入口点

浏览上下文名称

浏览上下问可以有一个浏览上下文名称。默认情况下,一个浏览上下文没有名称(它的名称没有被设置)。

一个有效的浏览上下文名称是任意以不为U+005F下划线字符开始的至少有一个字符的字符串(名称以下划线开始是用于保留特殊的关键字)。

一个有效的浏览上下文名称或关键字可以是任意字符,无论他是一个有效的浏览上下文名称或是匹配如下中一个 大小写不敏感的 ASCII 字符串: _blank, _self, _parent, 或 _top。


选择浏览内容浏览上下文名称的规则如下。该规则假定他们正应用于一个浏览上下文中。

  1. 如果给定的浏览上下文的名称是空字符串或 _self,则选择浏览内容必须是当前的。

如果给定的浏览上下文名称是 _self,那么这就是一个明确的自导航覆盖,该无缝浏览上下文标志的覆盖行为设置于无缝属性的 iframe 元素之上。

  1. 如果给定的浏览上下文名称是 _parent,然后选择的浏览上下文必须是当前的父浏览上下文。除非在一个父浏览上下文也没有的情况下,选择的浏览上下文必须是当前的浏览上下文。
  2. 如果给定的浏览上下文名称是 _top,然后选择的浏览上下文必须是当前的一个顶级浏览上下文,如果不存在顶级浏览赏析文,那么应当使用当前的浏览上下文。
  3. 如果给定的浏览上下文名称不是 _blank ,并且已存在的浏览上下文名称与给定的浏览上下文名称相同,并且当前浏览上下文允许被导航到那个浏览上下文,并且用户代理确定了这两个浏览上下文足够相关,如果它们相互到达,则浏览上下文必须选择其一。如果有多个匹配的浏览上下文,用户代理应以一些任意连贯的方式选取其中一个,如最近打开的,最近专注的,或关系更为密切的。

如果浏览上下文选择了此步到当前的浏览上下文,那么这也是一个明确的自导航覆盖

  1. 否则,一个新的浏览上下文被请求,并且会发生什么情况将取决于用户代理的配置和/或能力:

如果当前浏览上下文内,当它的活动文档被创建时,沙箱导航浏览上下文标志被设置。

用户代理可提供创建一个新的顶级浏览上下文或重用现有的顶级浏览上下文。如果用户采用其中之一,则指定的浏览上下文必须选择一个(浏览上下文的名字为没有设置成给定的浏览上下文名称)。

如果用户代理处于这种情况下有这样的配置,它会创建一个新的浏览上下文,并且浏览上下文被要求遵循一个超链接的组成部分,其链接类型包括 noreferrer 关键字

一个新的顶级浏览上下文必须被创建。如果给定的浏览上下文名称不为 _blank,则新的顶级浏览上下文必须给定浏览上下文名称(否则它没有名字)。所选择浏览内容必须是新的浏览上下文。

注:如果是立即被导航,则导航将完成替代激活

如果用户代理存在此类配置,在这种情况下它会创建一个新的浏览上下文并且不应用 noreferrer 关键字。

必须创建一个新的具有#opener-browsing-context浏览上下文开启器辅助浏览上下文。如果给定的浏览上下文的名称不为_blank,那么新的辅助浏览上下文的名称必须是给定的浏览上下文的名称(否则它没有名字)。所选择浏览上下文必须是这个新的浏览上下文。

注:如果是立即被导航,则导航将完成替代激活

如果用户代理存在此类配置,在这种情况下将重用当前的浏览上下文。

所选择浏览上下文为当前浏览上下文。

如果用户代理存在此类配置,在这种情况它不会找到浏览上下文。

所选择浏览上下文必须一个都没有。

用户代理实现被鼓励使用一种方式,即使用者设定用户代理始终重用当前浏览内容。

Window对象

[可更替命名的属性]
interface Window {
  // 当前浏览上下文
  只读属性 WindowProxy window;
  只读属性 WindowProxy self;
  只读属性 Document document;
      属性 DOMString name; 
  [PutForwards=href] 只读属性 Location location;
  只读属性 History history;
  [可更替] 只读属性 Barprop locationbar;
  [可更替] 只读属性 Barprop menubar;
  [可更替] 只读属性 Barprop personalbar;
  [可更替] 只读属性 Barprop scrollbars;
  [可更替] 只读属性 Barprop statusbar;
  [可更替] 只读属性 Barprop toolbar;
  void close();
  void stop();
  void focus();
  void blur();

  // 其它浏览上下文
  [可更替] 只读属性 WindowProxy frames;
  [可更替] 只读属性 unsigned long length;
  只读属性 WindowProxy top;
      属性 WindowProxy opener;
  只读属性 WindowProxy parent;
  只读属性 Element frameElement;
  WindowProxy open(in optional DOMString url, in optional DOMString target, in optional DOMString features, in optional 
DOMString replace);
  getter WindowProxy (in unsigned long index);
  getter any (in DOMString name);

  // 用户代理
  只读属性 Navigator navigator; 
  只读属性 External external; 
  只读属性 ApplicationCache applicationCache;

  // 用户提示
  void alert(in DOMString message);
  boolean confirm(in DOMString message);
  DOMString prompt(in DOMString message, in optional DOMString default);
  void print();
  any showModalDialog(in DOMString url, in optional any argument);

  // 事件句柄 IDL 属性
      属性 函数 onabort;
      属性 函数 onafterprint;
      属性 函数 onbeforeprint;
      属性 函数 onbeforeunload;
      属性 函数 onblur;
      属性 函数 oncanplay;
      属性 函数 oncanplaythrough;
      属性 函数 onchange;
      属性 函数 onclick;
      属性 函数 oncontextmenu;
      属性 函数 oncuechange;
      属性 函数 ondblclick;
      属性 函数 ondrag;
      属性 函数 ondragend;
      属性 函数 ondragenter;
      属性 函数 ondragleave;
      属性 函数 ondragover;
      属性 函数 ondragstart;
      属性 函数 ondrop;
      属性 函数 ondurationchange;
      属性 函数 onemptied;
      属性 函数 onended;
      属性 函数 onerror;
      属性 函数 onfocus;
      属性 函数 onhashchange;
      属性 函数 oninput;
      属性 函数 oninvalid;
      属性 函数 onkeydown;
      属性 函数 onkeypress;
      属性 函数 onkeyup;
      属性 函数 onload;
      属性 函数 onloadeddata;
      属性 函数 onloadedmetadata;
      属性 函数 onloadstart;
      属性 函数 onmessage;
      属性 函数 onmousedown;
      属性 函数 onmousemove;
      属性 函数 onmouseout;
      属性 函数 onmouseover;
      属性 函数 onmouseup;
      属性 函数 onmousewheel;
      属性 函数 onoffline;
      属性 函数 ononline;
      属性 函数 onpause;
      属性 函数 onplay;
      属性 函数 onplaying;
      属性 函数 onpagehide;
      属性 函数 onpageshow;
      属性 函数 onpopstate;
      属性 函数 onprogress;
      属性 函数 onratechange;
      属性 函数 onreadystatechange;
      属性 函数 onredo;
      属性 函数 onreset;
      属性 函数 onresize;
      属性 函数 onscroll;
      属性 函数 onseeked;
      属性 函数 onseeking;
      属性 函数 onselect;
      属性 函数 onshow;
      属性 函数 onstalled;
      属性 函数 onstorage;
      属性 函数 onsubmit;
      属性 函数 onsuspend;
      属性 函数 ontimeupdate;
      属性 函数 onundo;
      属性 函数 onunload;
      属性 函数 onvolumechange;
      属性 函数 onwaiting;
};
Window implements EventTarget;

安全性

window对象的任意一个成员属性或方法被非同源的脚本访问时,用户代理必须产生一个security_err。具体错误表达如下:

当一个脚本和Document对象下的Window对象不同源时,若该脚本尝试访问Window对象的属性或者方法时,用户代理必须保证Window对象的属性操作,修改,访问都不能完成。

对于那些返回对象的成员,每一个与Document下的Window对象不同源的成员必须被提供一组不同设置的对象。这些对象必须包含原型链属性,用于脚本中对象的创建(这些不是适用于创建Window全局对象的脚本)。

举个例子,如果两个Iframe的Document是不同的,那么当它访问同一个Window的postMessage()方法时,返回的对象是不一样的

创建和按浏览上下文名称导航的API

 此框内容是非标准的,执行要求在此框下面给出。
window = window . open( [ url [, target [, features [, replace ] ] ] ] )
打开一个窗口来显示一个url对应的页面(默认情况下显示about:blank页面)。
target参数用于设置新窗口的名字。如果名字已经存在则重用该页面。
replace参数若为true,则从弹出窗口打开的任何页面都会从窗口的会话历史中删除。
features参数可以忽略
window . name [ = value ]
返回窗口的名字
也可以用于设置窗口的名字
window . close()
关闭窗口
window . stop()
取消页面加载

window对象里的open()方法提供了一个已存在或者已打开的浏览上下文辅助浏览上下文导航机制。

这个方法包含四个可选的参数。

第一个参数是url,而这个url必须是一个非空并有效的URL,用于在浏览上下文中加载页面。如果没有传递该参数,或者这个参数是一个空字符串,url的值就会被设为默认的“about:blank”。参数必须是一个绝对地址的URL,或者是一个相对入口脚本基地址的URL。

第二个参数target指定了浏览上下文的名字,它必须是一个有效的浏览上下文名词或者关键字。如果传入的参数少于两个,target参数的值默认设为“_blank”。

第三个参数features,没有意义,只是因为历史原因存在。用户代理或许会将这个值解释为用于设置浏览上下文的尺寸和位置的参数,但是我们还是鼓励大家完全忽略这个参数。

第四个参数replace,用于指定是否将新页面替换已在浏览上下文中加载的页面,而已存在的浏览上下文是由target参数识别的(相反会让当前页面留在浏览上下文的会话历史中)。当open的参数少于四个时,replace的值被默认设为false。

当该方法执行时,按照浏览上下文选择规则,用户代理必须选使用target参数作为名字来选择一个浏览上下文来导航页面,并且该浏览上下文会作为用户脚本执行的上下文环境,除非用户声明了一个优先级,如果声明了优先级浏览上下文可能会被用户声明的所替代。

访问其他浏览上下文

 此框内容是非标准的,执行要求在此框下面给出。
window . length
返回子浏览上下文的数量
window[index]
返回指定索引的子浏览上下文

Window对象上的length属性会返回自浏览上下文的数目,如果这个window的浏览上下文共享的事件轮询和整个脚本访问属性时的脚本浏览上下文一致,这些浏览上下文都是嵌套在当前处于活动状态的Document下的元素中。如果不一致,则返回0。

Window对象的索引属性是从0开始到n-1,n是由length接口属性返回的值。如果n是0则意味着支持的属性索引为0。

为了确定Window对象中一个已编入索引的值的索引值,用户代理必须返回Document对象下对应索引的子浏览上下文的WindowProxy对象,这些对象是嵌套在Doument对象中的元素中的,以元素嵌套的顺序排序。

这些属性就是动态嵌套浏览上下文属性。

Window对象中的name属性访问

 此框内容是非标准的,执行要求在此框下面给出。
window [name]
返回索引值对应的元素或者元素集合

Window对象支持以名词为属性访问的接口。支持的名词属性包括:

  • 活动document中含有name属性的,包括a, applet, area, embed, form, frame, frameset, iframe, img和object元素
  • 活动document中所有含有id属性的HTML元素

支持的属性也会有些变化。浏览器的行为会受到quirks模式的限制。阅读更多...

当通过name索引来访问Window对象中的某个值时,用户代理必须通过下面的步骤返回对应的值:

  • 在活动Document中含有name属性的元素整合到一起

注意:至少需要一个符合条件的元素

  • 如果元素包含一个iframe,那么就返回嵌套形式浏览上下文的WindowProxy对象,它是由符合条件的树顺序下的第一个iframe元素展示的。最后终止。。
  • 否则,如果只包含一个元素,那么返回这个元素并终止。
  • 不是上述情况,则返回一个Document根目录下的HTMLCollection对象,并只留下符合name值的元素。

垃圾收集和浏览上下文

浏览器界面元素

为了允许Web页面与Web浏览器整合,某些Web浏览器界面元素有限制地暴露给Web页面中的脚本。

每个界面元素表示为一个BarProp对象:

interface BarProp {
           attribute boolean visible;
};
此区块中不是标准描述,实现要求在下面给出。

window . locationbar . visible

如果地址栏可见,则返回真;否则返回假;

window . menubar . visible

如果菜单栏可见,则返回真;否则返回假;

window . personalbar . visible

如果个人栏可见,则返回真;否则返回假;

window . scrollbars . visible

如果滚动栏可见,则返回真;否则返回假;

window . statusbar . visible

如果状态栏可见,则返回真;否则返回假;

window . toolbar . visible

如果工具栏可见,则返回真;否则返回假;

对于visible属性,在获取时,必须返回真或者由用户代理根据下面的描述决定的最接近该对象表示的用户界面元素的可见状态的值。在设置时,必须丢弃新值。

下列BarProp对象存在于浏览器上下文中的每个Document对象。这些对象所表示的某些用户界面元素可能在不同用户代理中不相同;对于这些用户代理,除非另外说明,其对象的行为必须与其存在且可见相同(例如,其visible属性必须返回真)。

  • 地址栏BarProp对象
    表示包含显示活跃文档URL的控件的用户界面元素,或其他相似界面。
  • 菜单栏BarProp对象
    表示包含以菜单形式显示的命令列表的控件的用户界面元素,或其他相似界面。
  • 个人栏BarProp对象
    表示包含链接到用户收藏夹页面的控件的用户界面元素,或其他相似界面。
  • 滚动栏BarProp对象
    表示包含滚动机制的控件的用户界面元素,或其他相似界面。
  • 状态栏BarProp对象
    表示与用户的媒介适应的紧跟在文档之下或之后的用户界面元素。如果用户代理没有这样的用户界面元素,则对象的行为可以与没有相应的用户界面元素相同(例如,其visible属性可以返回假)。
  • 工具栏BarProp对象
    表示与用户的媒介适应的紧跟在文档之上或之前的用户界面元素。如果用户代理没有这样的用户界面元素,则对象的行为可以与没有相应的用户界面元素相同(例如,其visible属性可以返回假)。

locationbar属性必须返回地址栏BarProp对象

menubar属性必须返回菜单栏BarProp对象

personalbar属性必须返回个人栏BarProp对象

scrollbars属性必须返回滚动栏BarProp对象

statusbar属性必须返回状态栏BarProp对象

toolbar属性必须返回工具栏BarProp对象

WindowProxy对象