window.open影响网页

window.open affect web page

本文关键字:网页 影响 open window      更新时间:2023-09-26

我有一个链接,可以使用window.open打开一个新窗口。弹出窗口运行良好,但正常的网页会停止加载对象(图像、脚本、ajax脚本),有时页面根本无法加载。

这是我的代码:

MyWindow=window.open('player.php','Player','width=500','height=300'); return false;

我做错了什么吗?

谢谢,Peter

首先,请更具体地告诉我们更多关于您的浏览器和版本,以及可能的操作系统。它可能更多地与浏览器有关,而不是与网络内容有关。

然后是可能的问题;你开始说"我有一个链接…"。

对我来说,这听起来像是你在用<a href="javascript:DoSomething()">。或者可能是<a href="#" onclick="DoSomething()">

我在一些现代浏览器中尝试了这两种浏览器:Chrome v37和IE v11。两个浏览器都没有生成您所描述的内容:
-Chrome v37将愉快地继续加载,即使我立即点击(巨大)网页顶部的"window.open()"链接
-IE v11会在某些节目中显示"false",这很奇怪,但仍然不是你得到的
在某些情况下,我还需要处理弹出窗口阻止程序。

一般的提示可能是不要使用<a href>进行类似的操作。浏览器之间的行为似乎不一致,而且现在有更好的替代方案,如<span onclick="">...</span><button onclick="">...<button>,或者使用JQuery或其他框架(我对此了解不多)。

虽然这并不是一个决定性的答案,但也许这可以帮助你自己进行实验,思考可能的原因或其他做事方式。

您描述的行为绝对不应该正常发生。robbmj的JSFiddle证实了这一点,它未能重现这个问题。这证明主页中发生了而不是普通页面加载的事情,或者你的"链接打开"有一些异常。除了语法错误(你使用了四个参数,而不是三个)。

由于您没有提供这两点的信息(您如何加载主页?您如何触发弹出式打开代码?),我们甚至不知道问题是否存在可能与浏览器有关;我会开始尝试在IE、Chrome和Mozilla中测试是否有任何变化;这可能会提供一些有用的见解。

一种可能性

一个非常大的可能性是,您无意中的第四个参数进入了window.open()"replace"参数,这是一个布尔值,并触发了未定义的行为,或者只是一个停止一切的错误。你应该让一些东西在IE中工作,而在Firefox中根本不工作。

您还应该能够通过使用Firefox和Firebug扩展,或者Chrome中的Web Developer控制台来了解情况。

另一种可能性

更神秘的可能性是,你定义链接的方式可能会让浏览器相信你实际上已经转到了另一个页面,因此继续加载当前页面没有意义。根据浏览器的不同,这可能与链接的定义方式有关,可以通过其他方式进行定义来弥补。

例如,如果你有,它可能会发生

<a href="javascript:openPopup();">...</a>

我怀疑这就是用户Tomzan问的问题,"链接是不是像javascript:…?"

因此,如果是这种情况,请尝试使用此选项(这在IE9/Chrome/FF中适用):

<a href="#" onclick="return openPopup();">link</a>

function openPopup() {
    MyWindow = window.open('player.php', 'Player', 'width=500, height=300');
    // Also try the following. You won't probably like the results (it should send the
    // popup window behind), but if it works, it proves we're dealing with a browser
    // issue there.
    // Blur and refocus
    // MyWindow.blur();
    // window.focus();
    // Just focus
    // window.focus();
    return false;
}

变通办法

一个可能接受的解决方法是完全禁用链接(或通过CSS隐藏它),并且只有在主文档准备好后才重新激活/显示它。这避开了问题,即使用户体验可能会因为等待时间过长而变得更糟。

但是,如果用户很可能在等待加载整个页面之前点击了链接,我也会考虑而不是自动加载页面的其余部分,并重新组织信息以提供更精简的导航。或者将其分为两个连续的页面。同样,不幸的是,你没有提供足够的信息来做更多的猜测。

您可能知道,JavaScript是单线程的。每个事件都会排队,直到有空闲时间执行为止。在window.open的情况下,两个窗口必须共享一个上下文以确保线程安全,因为打开的窗口可以使用window.opener访问其父窗口。我不知道浏览器是如何实现的,但我们可以猜测两种可能性:

  • 空闲时间在两个窗口之间共享。这意味着,如果弹出窗口执行了许多阻塞语句,它可以冻结主窗口的事件
  • 两个窗口中只有一个可以处于活动状态,这取决于哪个窗口具有焦点。在这种情况下,当您使用弹出窗口时,所有事件都可能在主窗口中暂停。

    如果你想要一个更精确的答案,我需要更多关于你的代码的细节。

document.addEventListener("DOMContentLoaded", function () {
      //whatever the code
      MyWindow=window.open('player.php','Player','width=500','height=300'); return false;
}, false);
setTimeout(function () {
    window.open( .. )
}, 0);
Your document should be loaded first, then popup should be open, So write your javascript code in the scope of $(document).ready().
    enter code here
$(document).ready(function(){
$("#clickme").click(function(e){
  MyWindow=window.open('player.php','Player','width=500','height=300'); return false;
});
});