解决js中window.open只能打开一次新网页的问题

笔者最近有一个需求是在js中定时重复访问同一网页,代码如下:

var btn=document.getElementById("btn-reservation").href;
setInterval(function(){
window.open(btn);},2000)

笔者使用到了setInterval来控制时间间隔,目标是通过js每隔两秒产生一个新网页访问btn表示的url。
然后发现问题:每次都只能打开一次新网页(笔者是在Chrome中进行测试)
解决方法:浏览器默认阻止弹窗,我们设置为允许即可,解决方法参照如下
https://jingyan.baidu.com/article/7e44095328183a2fc0e2ef0a.html

在 Vue 项目中使用 `window.open` 时,如果发现只能打开一个窗口而无法多次打开不同的窗口,通常是因为浏览器的弹出窗口拦截机制或代码中对窗口标识的处理方式导致的。 ### 弹出窗口拦截机制 浏览器为了防止恶意弹窗,默认会对频繁调用 `window.open` 的行为进行拦截。尤其是在用户没有明确交互(如点击事件)的情况下,连续调用 `window.open` 很容易被浏览器阻止。即使是在用户点击事件中,如果未正确管理窗口名称或未释放之前的窗口引用,也可能导致后续调用无效。 ### 窗口标识管理不当 在 Vue 页面中,引用中提到的示例通过 `this['pageNum' + this.num]` 来保存窗口引用,并通过切换 `num` 的值来复用窗口名。然而,这种方式可能导致窗口无法打开,因为每次调用时,如果未正确关闭或释放前一个窗口引用,`window.open` 可能会复用已存在的窗口名称,从而在某些浏览器中只更现有窗口而非创建窗口[^1]。 ### 解决方案 1. **避免窗口名称重复**:确保每次调用 `window.open` 时使用不同的窗口名称。可以使用时间戳或随机字符串作为窗口名称的一部分,以保证唯一性。 ```javascript methods: { gotoNewPage() { const { href } = this.$router.resolve({ path: '要跳转的路由页面路径', }); const windowName = `newWindow_${Date.now()}`; window.open(href, windowName, 'width=800,height=600'); } } ``` 2. **确保用户交互触发**:将 `window.open` 的调用放在用户的直接交互事件中(如 `click`),以避免被浏览器拦截。 3. **使用 `target="_blank"`**:如果不需要对窗口进行编程控制,可以直接使用 `<a>` 标签并设置 `target="_blank"`,这样可以绕过浏览器对 `window.open` 的限制。 ```html <a :href="externalUrl" target="_blank" rel="noopener noreferrer">打开窗口</a> ``` 4. **处理跨域情况下的通信**:如果需要在窗口与父窗口之间进行通信,可以使用 `window.postMessage` 方法。确保在打开窗口后,正确监听和处理消息。 ```javascript const newWindow = window.open('https://example.com', '_blank'); window.addEventListener('message', (event) => { if (event.origin !== 'https://example.com') return; console.log('Received message:', event.data); }); newWindow.postMessage('Hello from parent', 'https://example.com'); ``` 5. **检查 Vue 路由配置**:如果使用了 Vue Router 并设置了 `base` 路径,确保通过 `this.$router.resolve()` 方法生成正确的 URL,以避免路径错误导致页面无法加载[^2]。 ```javascript const { href } = this.$router.resolve({ path: '/target-path', query: { param1: 'value1' } }); window.open(href, '_blank'); ``` ### 示例代码 以下是一个完整的 Vue 方法示例,展示了如何正确打开多个窗口: ```javascript methods: { gotoNewPage() { const { href } = this.$router.resolve({ path: '/target-path', query: { id: this.itemId } }); const windowName = `window_${Math.random().toString(36).substr(2, 9)}`; window.open(href, windowName, 'width=800,height=600'); } } ``` 通过上述方法,可以有效解决 Vue 中 `window.open` 只能打开一个窗口的问题。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值