type
status
date
slug
summary
tags
category
icon
password
Edited
Sep 15, 2022 01:17 PM
Created
Sep 7, 2022 12:18 PM
Frame 和 window
window.open()
打开一个弹窗的语法是
window.open(url, name, params)
:url要在新窗口中加载的 URL。name新窗口的名称。每个窗口都有一个
window.name
,在这里我们可以指定哪个窗口用于弹窗。如果已经有一个这样名字的窗口 —— 将在该窗口打开给定的 URL,否则会打开一个新窗口。params新窗口的配置字符串。它包括设置,用逗号分隔。参数之间不能有空格,例如:width=200,height=100
。params
的设置项:- 位置:
left/top
(数字)—— 屏幕上窗口的左上角的坐标。这有一个限制:不能将新窗口置于屏幕外(offscreen)。width/height
(数字)—— 新窗口的宽度和高度。宽度/高度的最小值是有限制的,因此不可能创建一个不可见的窗口。
- 窗口功能:
menubar
(yes/no)—— 显示或隐藏新窗口的浏览器菜单。toolbar
(yes/no)—— 显示或隐藏新窗口的浏览器导航栏(后退,前进,重新加载等)。location
(yes/no)—— 显示或隐藏新窗口的 URL 字段。Firefox 和 IE 浏览器不允许默认隐藏它。status
(yes/no)—— 显示或隐藏状态栏。同样,大多数浏览器都强制显示它。resizable
(yes/no)—— 允许禁用新窗口大小调整。不建议使用。scrollbars
(yes/no)—— 允许禁用新窗口的滚动条。不建议使用。
示例:最简窗口
设置中的省略规则:
- 如果
open
调用中没有第三个参数,或者它是空的,则使用默认的窗口参数。
- 如果这里有一个参数字符串,但是某些
yes/no
功能被省略了,那么被省略的功能则被默认值为no
。因此,如果你指定参数,请确保将所有必需的功能明确设置为yes
。
- 如果参数中没有
left/top
,那么浏览器会尝试在最后打开的窗口附近打开一个新窗口。
- 如果没有
width/height
,那么新窗口的大小将与上次打开的窗口大小相同。
窗口和弹窗间的访问
同源策略
只有在窗口是同源的时,窗口才能自由访问彼此的内容(
相同的协议://domain:port
)。否则,例如,如果主窗口来自于
site.com
,弹窗来自于 gmail.com
,则处于安全性考虑,这两个窗口不能访问彼此的内容窗口 → 弹窗
open
调用会返回对新窗口的引用。它可以用来操纵弹窗的属性,更改位置,甚至更多操作。窗口 ← 弹窗
弹窗也可以使用
window.opener
来访问 opener 窗口。除了弹窗之外,对其他所有窗口来说,window.opener
均为 null
。方法
关闭弹窗
关闭一个窗口:
win.close()
。检查一个窗口是否被关闭:
win.closed
。从技术上讲,
close()
方法可用于任何 window
,但是如果 window
不是通过 window.open()
创建的,那么大多数浏览器都会忽略 window.close()
。因此,close()
只对弹窗起作用。移动和调整大小
win.moveBy(x,y)
将窗口相对于当前位置向右移动
x
像素,并向下移动 y
像素。允许负值(向上/向左移动)。win.moveTo(x,y)
将窗口移动到屏幕上的坐标
(x,y)
处。win.resizeBy(width,height)
根据给定的相对于当前大小的
width/height
调整窗口大小。允许负值。win.resizeTo(width,height)
将窗口调整为给定的大小。
还有
window.onresize
事件。滚动窗口
win.scrollBy(x,y)
相对于当前位置,将窗口向右滚动
x
像素,并向下滚动 y
像素。允许负值。win.scrollTo(x,y)
将窗口滚动到给定坐标
(x,y)
。elem.scrollIntoView(top = true)
滚动窗口,使
elem
显示在 elem.scrollIntoView(false)
的顶部(默认)或底部。这里也有
window.onscroll
事件。弹窗的聚焦/失焦
使用
window.focus()
和 window.blur()
方法可以使窗口获得或失去焦点。此外,这里还有 focus/blur
事件,可以捕获到访问者聚焦到一个窗口和切换到其他地方的时刻。跨窗口通信
一定要在iframe加载完成后再获取文档
集合:window.frames
获取
<iframe>
的 window 对象的另一个方式是从命名集合 window.frames
中获取:- 通过索引获取:
window.frames[0]
—— 文档中的第一个 iframe 的 window 对象。
- 通过名称获取:
window.frames.iframeName
—— 获取name="iframeName"
的 iframe 的 window 对象。
一个 iframe 内可能嵌套了其他的 iframe。相应的
window
对象会形成一个层次结构(hierarchy)。可以通过以下方式获取:
window.frames
—— “子”窗口的集合(用于嵌套的 iframe)。
window.parent
—— 对“父”(外部)窗口的引用。
window.top
—— 对最顶级父窗口的引用。
“sandbox” iframe 特性
sandbox
特性(attribute)允许在 <iframe>
中禁止某些特定行为,以防止其执行不被信任的代码。它通过将 iframe 视为非同源的,或者应用其他限制来实现 iframe 的“沙盒化”。对于
<iframe sandbox src="...">
,有一个应用于其上的默认的限制集。换句话说,一个空的
"sandbox"
特性会施加最严格的限制以下是限制的列表:
allow-same-origin
默认情况下,
"sandbox"
会为 iframe 强制实施“不同来源”的策略。换句话说,它使浏览器将 iframe
视为来自另一个源,即使其 src
指向的是同一个网站也是如此。具有所有隐含的脚本限制。此选项会移除这些限制。allow-top-navigation
允许
iframe
更改 parent.location
。allow-forms
允许在
iframe
中提交表单。allow-scripts
允许在
iframe
中运行脚本。allow-popups
允许在
iframe
中使用 window.open
打开弹窗。跨窗口通信
postMessage
接口允许窗口之间相互通信,无论它们来自什么源。win.postMessage(data, targetOrigin)
参数:
data
要发送的数据。可以是任何对象,数据会被通过使用“结构化序列化算法(structured serialization algorithm)”进行克隆。IE 浏览器只支持字符串,因此我们需要对复杂的对象调用
JSON.stringify
方法进行处理,以支持该浏览器。targetOrigin
指定目标窗口的源,以便只有来自给定的源的窗口才能获得该消息。targetOrigin
是一种安全措施。请记住,如果目标窗口是非同源的,我们无法在发送方窗口读取它的
location
。因此,我们无法确定当前在预期的窗口中打开的是哪个网站:用户随时可以导航离开,并且发送方窗口对此一无所知。指定
targetOrigin
可以确保窗口仅在当前仍处于正确的网站时接收数据。在有敏感数据时,这非常重要。onmessage
为了接收消息,目标窗口应该在
message
事件上有一个处理程序。当 postMessage
被调用时触发该事件(并且 targetOrigin
检查成功)。event 对象具有特殊属性:
data
从
postMessage
传递来的数据。origin
发送方的源,例如
http://javascript.info
。source
对发送方窗口的引用。如果我们想,我们可以立即
source.postMessage(...)
回去。要为
message
事件分配处理程序,我们应该使用 addEventListener
,简短的语法 window.onmessage
不起作用。参考链接:
- 作者:JinSo
- 链接:https://jinso365.top/article/modern-javascript-others-frame-window
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。