项目中遇到这样一个问题。
parent window中用window.open(location.href, projectId)新开了一个以projectId作为window.name的窗口。
然后在parent window中想直接根据projectId切换到已打开的相应的window,但不刷新该window。
直接用window.open(location.href, projectId)会切换到相应的window,但会刷新页面,有什么办法只切换不刷新?
淡淡烟草味2017-05-19 10:36:22
用变量保存window.open的返回值,其返回值就是那个窗口的 window
对象,执行 focus
方法即可。
win1 = window.open(url1);
win2 = window.open(url2);
// 后续用 win1 这个引用执行 focus 方法
if (!win1.closed) {
win1.focus();
}
为情所困2017-05-19 10:36:22
使用html5
的history
相关API
history.pushState()
history. popstate
事件等等
相关内容详细请参考操纵浏览器的历史记录MDN
某草草2017-05-19 10:36:22
假设A window打开了B window,B window打开了C window,A拥有对B的引用, B拥有对C的引用。
这个时候在A window跳转B,或者B window跳转C都可以用window.focus()直接实现。
但是A window中想要跳转C,查了各种API暂时没发现怎么通过window.name直接获取相应window对象的。试了下localstorage也没法存window对象。这种情况有点麻烦。
想了下如果一定要实现,办法应该是有的。大致是利用localStorage保存整棵树结构,根节点是第一次打开的A,A的子节点是B,B的子节点是C。这样所有窗口都能有办法最终找到拥有最后要跳转window的拥有者,然后通过postMessage一层层通知到那个window的拥有者,让他去触发目标window.focus()方法
但这样子,项目多切换次数树结构就会变得有点复杂,一层层通讯开销估计也不小。如果浏览器有根据window.name获取window对象的方法就方便多了。