解决JavaScript window.open新窗口被拦截的问题

3星 · 超过75%的资源 需积分: 50 28 下载量 47 浏览量 更新于2024-09-18 收藏 300B TXT 举报
"在网页开发中,有时我们需要在用户点击按钮后打开一个新的窗口,例如跳转到其他网站或显示一个模态对话框。然而,浏览器为了防止弹窗广告,可能会拦截这种行为。本资源提供了一种避免新窗口被拦截的方法,通过JavaScript的window.open和window.showModalDialog函数结合使用。" 在给定的示例中,我们看到一个HTML页面中的button按钮触发了一个特定的JavaScript代码执行。这段代码的关键部分是: ```javascript string Str1 = "http://www.sohu.com"; Response.Write("<script>window.open('" + Str1 + "','_blank');window.showModalDialog('close.htm');</script>"); ``` 首先,`string Str1 = "http://www.sohu.com";` 创建了一个字符串变量,其中存储了要打开的URL(这里是搜狐网站)。然后,`Response.Write()` 方法用于将JavaScript代码写入响应,这将在用户界面上执行。 第一部分 `window.open(Str1, '_blank')` 是用来打开一个新窗口的。`Str1` 是要加载的URL,`'_blank'` 参数告诉浏览器在新的标签页或窗口中打开链接。这个方法可以有效地创建新窗口,但浏览器的弹窗阻止策略可能会影响其正常工作。 为了解决这个问题,第二部分 `window.showModalDialog('close.htm')` 使用了 `showModalDialog` 函数。这个函数会打开一个模态对话框,阻塞用户与页面其余部分的交互,直到对话框关闭。这里使用的 'close.htm' 指定了对话框要加载的页面。 `close.htm` 页面的内容是: ```html <html> <body onload="window.parent.opener=null;window.close();"> </body> </html> ``` 在这个页面的`<body>`标签上有一个`onload`事件处理程序,当页面加载完成后,它会执行两个操作: 1. `window.parent.opener = null;` 设置当前窗口的父窗口的 opener 属性为 null。这会断开新窗口与原窗口的关联,防止浏览器认为这是由广告或其他恶意脚本打开的窗口,从而降低被拦截的可能性。 2. `window.close();` 关闭当前的模态对话框。由于对话框是模态的,用户必须先关闭这个对话框才能与原页面交互,因此在关闭对话框后,用户可以回到原来的页面,同时新窗口已经打开。 通过这样的组合,开发者可以更有可能地绕过浏览器的弹窗拦截机制,实现新窗口的顺利打开。然而,这种方法仍然可能因浏览器的不同设置和更新而受到影响,因此在实际应用中,应考虑提供备选方案,如提示用户手动复制链接或使用其他交互方式。