From c900a017036e477fba5615bc8d3294cbe1eebc81 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Tue, 7 Apr 2020 10:31:05 +0800 Subject: [PATCH 01/16] Update article.md --- .../03-cross-window-communication/article.md | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/3-frames-and-windows/03-cross-window-communication/article.md b/3-frames-and-windows/03-cross-window-communication/article.md index cec6e55b9d..a0c5c38610 100644 --- a/3-frames-and-windows/03-cross-window-communication/article.md +++ b/3-frames-and-windows/03-cross-window-communication/article.md @@ -1,12 +1,12 @@ # 跨窗口通信 -"同源"策略限制了窗口之间的互相访问。 +“同源(Same Origin)”策略限制了窗口(window)和 frame 之间的相互访问。 -这个想法出于这样的考虑,如果我们打开了两个窗口:一个窗口来自 `john-smith.com`,另一个是 `gmail.com`,那么我们就不希望 `john-smith.com` 的脚本可以阅读我们的邮件。 +这个想法出于这样的考虑,如果一个用户有两个打开的窗口:一个窗口来自 `john-smith.com`,另一个是 `gmail.com`,那么用户将不希望 `john-smith.com` 的脚本可以读取 `gmail.com` 中的邮件。所以,“同源”策略的目的是保护用户免遭信息盗窃。 -## 同源 +## 同源 [#same-origin] -如果两个 URL 具有相同的协议,域名和端口,则称它们是"同源"的。 +如果两个 URL 具有相同的协议,域和端口,则称它们是“同源”的。 以下的几个 URL 都是同源的: @@ -14,12 +14,12 @@ - `http://site.com/` - `http://site.com/my/page.html` -但是下面几个不是: +但是下面这几个不是: -- http://www.site.com (`www.` 域名与其他不同) -- http://site.org (`.org` 域名与其他不同) -- https://site.com (协议与其他不同: `https`) -- http://site.com:8080 (端口与其他不同:`8080`) +- http://www.site.com(另一个域:`www.` 影响) +- http://site.org(另一个域:`.org` 影响) +- https://site.com(另一个协议:`https`) +- http://site.com:8080(另一个端口:`8080`) 如果我们有另外一个窗口(一个弹出窗口或者 iframe)的引用,并且这个窗口是同源的,那么我们可以使用它做任何事情。 @@ -31,7 +31,7 @@ 在同源策略里有一个很重要的排除项。 -如果窗口有相同的二级域名,比如 `john.site.com`,`peter.site.com` 和 `site.com`,我们可以使用 JavaScript 将 `document.domain` 设置为他们相同的二级域名 `site.com`。此时这些窗口将被当做同源的站点对待。 +如果窗口有相同的二级域,比如 `john.site.com`,`peter.site.com` 和 `site.com`,我们可以使用 JavaScript 将 `document.domain` 设置为他们相同的二级域 `site.com`。此时这些窗口将被当做同源的站点对待。 换句话说,所有的这些页面(包括来自 `site.com` 的页面)都添加这么一段代码: @@ -41,7 +41,7 @@ document.domain = 'site.com'; 之后他们就可以无限制的互动了。 -但是这仅适用于具有相同二级域名的页面。 +但是这仅适用于具有相同二级域的页面。 ```` ## 访问 iframe 的内容 @@ -345,14 +345,14 @@ window.addEventListener("message", function(event) { - `window.parent`,`window.top` 是父窗口以及顶级窗口的引用 - `iframe.contentWindow` 是 ` ``` @@ -114,6 +102,26 @@ document.domain = 'site.com'; ``` + +````warn header="排除:子域可能是同源的" + +在同源策略里有一个很重要的排除项。 + +如果窗口有相同的二级域,比如 `john.site.com`,`peter.site.com` 和 `site.com`,我们可以使用 JavaScript 将 `document.domain` 设置为他们相同的二级域 `site.com`。此时这些窗口将被当做同源的站点对待。 + +换句话说,所有的这些页面(包括来自 `site.com` 的页面)都添加这么一段代码: + +```js +document.domain = 'site.com'; +``` + +之后他们就可以无限制的互动了。 + +但是这仅适用于具有相同二级域的页面。 +```` + + + ### 请等待 iframe 加载完成 创建 iframe 时,它立刻就会有一个 document,但是这个 document 与最终页面加载完成后的 document 是不同的。 From 815bf7ebf5e6919da07631d1961e57dec9121e0d Mon Sep 17 00:00:00 2001 From: LeviDing Date: Tue, 7 Apr 2020 11:39:07 +0800 Subject: [PATCH 03/16] Update article.md --- .../03-cross-window-communication/article.md | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/3-frames-and-windows/03-cross-window-communication/article.md b/3-frames-and-windows/03-cross-window-communication/article.md index fdb82a90ff..d3f040c362 100644 --- a/3-frames-and-windows/03-cross-window-communication/article.md +++ b/3-frames-and-windows/03-cross-window-communication/article.md @@ -79,29 +79,37 @@ 上述代码除了以下操作都会报错: -- 通过 `iframe.contentWindow` 获取内部窗口的 window -- 修改它的 `location` +- 通过 `iframe.contentWindow` 获取对内部窗口的引用 +- 对 `location` 进行写入 - -```smart header="`iframe.onload` vs `iframe.contentWindow.onload`" -`iframe.onload` 实际上与 `iframe.contentWindow.onload` 相同,当嵌入窗口内所有资源全部加载完后触发。 -...但是 `iframe.onload` 始终是可用的,然而 `iframe.contentWindow.onload` 需要满足同源策略。 - -``` - -现在有一个同源窗口的例子,我们可以对嵌入的窗口做任何事: +与此相反,如果 ` ``` +```smart header="`iframe.onload` vs `iframe.contentWindow.onload`" +`iframe.onload` 事件(在 ` @@ -155,30 +156,26 @@ document.domain = 'site.com'; ``` -如果您对这个问题有更好的解决方案,请在评论中告诉我。 - -## window.frames +## 集合:window.frames -获取 ` @@ -189,35 +186,38 @@ document.domain = 'site.com'; ``` -一个 iframe 内可能嵌套了其他的 iframe,相应的 `window` 对象会也形成嵌套的层次结构(hierarchy)。 +一个 iframe 内可能嵌套了其他的 iframe。相应的 `window` 对象会形成一个层次结构(hierarchy)。 -可以通过以下方式获取引用: +可以通过以下方式获取: -- `window.frames` —— 子窗口的集合(用于嵌套的 iframe)。 -- `window.parent` —— 对"父"(外部)窗口的引用。 -- `window.top` —— 对最顶级父窗口的引用。 +- `window.frames` —— “子”窗口的集合(用于嵌套的 iframe)。 +- `window.parent` —— 对“父”(外部)窗口的引用。 +- `window.top` —— 对最顶级级父窗口的引用。 -举例: +例如: ```js run window.frames[0].parent === window; // true ``` -我们可以使用 `top` 属性来检测当前的文档是否是在 iframe 内打开: +我们可以使用 `top` 属性来检查当前的文档是否是在 iframe 内打开的: ```js run -if (window == top) { // current window == window.top? +if (window == top) { // 当前 window == window.top? alert('The script is in the topmost window, not in a frame'); } else { alert('The script runs in a frame!'); } ``` -## sandbox 属性 +## "sandbox" iframe 特性 + +`sandbox` 特性(attribute)允许在 `