JavaScript的window.open函数不一致,未在预期时打开弹出窗口。

3
好的,我正在疯狂。 我正在尝试实现一个基本的弹出窗口来显示图像。 如果我的javascript代码在具有onclick属性的HTML标记中完全指定,则窗口会正确弹出。 如果我的完全相同的javascript代码从HTML文档开头的脚本标记或从单独的js文件中调用,则链接(或在我的情况下为图像)不会在弹出窗口中打开,而是在同一窗口中打开。 <沮丧>

这将打开一个弹出窗口:

<a href="test.jpg" onclick="window.open('test.jpg','test_name','width=500,height=500,scrollbars=no'); return false">test_name</a>

这不会弹出一个窗口:

function cleanPopup(url, title) {
window.open(url, title, 'width=500,height=500,scrollbars=no');
return false;
}

<a href="test.jpg" onclick="return cleanPopup('test.jpg', 'test_name')">test_name</a>

任何帮助都将不胜感激。
PS:在Chrome和Firefox中进行了测试。
编辑:
我发现了我的问题。我最初只在head标签中调用了js文件。当使用多个模板工具(在我的情况下是Template Toolkit)创建的div层时,会出现一些关于原始脚本元素在head元素内看似不可见的深层子元素的问题。
我不知道究竟发生了什么,也没有时间去探索它。我添加了这个编辑,以防其他人遇到类似的问题,并偶然发现了这个线程。如果有人理解这种现象并能够解释它,请务必这样做。
编辑2: window.open方法的“name”参数不能包含空格,否则弹出窗口在IE中无法工作。谢谢M$。

1
它对我打开一个弹出窗口。检查你的浏览器JavaScript控制台,我非常确定你某个地方有语法错误。 - Álvaro González
我已在IE9、IE7-8(从IE9 DevTools)中的标准文档模式下进行了测试。我已在最新版本的FireFox、Chrome、Safari和Opera中进行了测试。所有测试结果符合预期。也许您需要展示更完整的示例。 - Andrew D.
1
没有语法错误 - 但是如果有弹出窗口拦截器,脚本可能会失败,然后URL将被简单地跟随。 - mplungjan
请记住,在同一浏览器中这两个示例的工作方式是不同的。实际上,我将这两个示例放在一起,单击一个链接会打开一个弹出窗口,而另一个会打开一个新标签页。 - s2cuts
5个回答

3

点此查看演示

在我看来,这段代码是最接近“完美”的。

测试过:

  • Windows - Fx、Chrome、IE8和Safari
  • iPhone:Mobile Safari
  1. 添加目标会使链接在新窗口或选项卡中打开(如果允许) - 这是一个有用但不是回答问题的副作用。
  2. 如果window.open失败,则返回true将使单击跟随链接,希望调用目标 - 请注意,一些浏览器不再响应目标。
  3. 第三个参数中的高度(和宽度)将强制在新窗口中打开,而不是在新选项卡中打开,除非浏览器设置为在选项卡中打开所有新窗口。
<html>
<head>
<script type="text/javascript">
window.onload=function() {
 document.getElementById('popup').onclick=function() {
   var w = window.open(this.href, this.target, 
       'width=500,height=500,scrollbars=no');
    return (!w); // opens in new window/tab if allowed
  }
}
</script>
</head>
<body>

<a id="popup" href="test.jpg" target="test_name">test_name</a>
</body>
</html>

我的代码不起作用。它打开了一个新的标签页,而不是弹出窗口。太神奇了。我在同一浏览器窗口中的不同标签页中尝试了你的演示,并且它可以正常工作(打开了一个弹出窗口)。从浏览器的角度来看源代码,除了我的href内容和一堆其他HTML之外,一切看起来都一样。是否可能在我的代码库中有一些HTML会抵消打开弹出窗口的努力?我完全感到困惑。 - s2cuts
我需要亲自查看和测试您的页面。如果您不想在此处发布,我的电子邮件在我的个人资料中。 - mplungjan
@s2cuts,你能提供一下你遇到问题的实际页面吗? - mplungjan

1

使用 target="_blank"

<a href="whatever" target="_blank"> ...

从HTML中,或者

window.open(url, '_blank', options)

来自JavaScript


@mplungjan 我认为这很相关。如果您不指定“_blank”,则可能会覆盖已使用指定名称打开的现有窗口。 - jlb
这与提问者的问题有点相关。不是因为可能会覆盖,而是因为脚本的任何失败都会导致单击跟随链接。因此,您添加目标的副作用是不使链接在同一窗口中打开。 至于您提到的另一个原因-如果它曾经是个问题,那么可以使用var target="x"+new Date().getTime()来生成一个随机但可识别的目标。这对问题没有进一步影响。 - mplungjan

0

使新窗口标题随机

onclick="PopupCenter(this.href,'random','600','700','yes'); return false;"

而在函数中:

if(title=='random')
{
title = randomID();
}

-1

试一下这个

function mypopup()
{
    mywindow = window.open("http://www.test.com", "mywindow", "location=1,status=1,scrollbars=1,  width=100,height=100");
}

许多浏览器不允许在window.open参数中包含空格。此外,“=1”可以省略。 - mplungjan

-2
请确保将您的JavaScript代码放在Head块中。
<head>
<script type="text/javascript" language="JavaScript">
function cleanPopup(url, title) {
    window.open(url, title, 'width=500,height=500,scrollbars=no');
    return false;
}
</script>

而在正文中:

<a href="" onclick="cleanPopup('test.jpg','test_name')">test_name</a>

在Firefox和IE中,它对我来说都没有任何问题,完美运行。


你需要在onclick处理程序中返回false,因此onclick="return cleanPopup(...)" - mplungjan
是的,你说得对,必须返回 false,以便默认事件不会发生(在这种情况下是跟随 URL)。我错过了它,因为糟糕的 FF(还有 Chrome)总是试图变得太聪明了,他们不会遵循空白的 URL :-/。感谢你指出它。 - sowrov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接