在Internet Explorer中出现的JavaScript弹窗问题!

4

我在JavaScript中打开弹窗遇到了问题,我有以下函数可以在IE6和IE7中打开我的弹窗:

function open_window(Location,w,h) //opens new window
{
  var win = "width="+w+",height="+h+",menubar=no,location=no,resizable,scrollbars,top=500,left=500";
  alert(win) ;
  window.open(Location,'newWin',win).focus();

}

它正在工作。我的新窗口已经打开,但是出现了一个错误。错误信息如下:

'window.open(...)' 是 null 不是一个对象。
您是否要继续在此页面上运行脚本?

然后我有一个按钮,在 onclick 事件中它将调用一个函数来关闭当前窗口并刷新 opener 函数。

function refreshParent(location) 
{
  window.opener.location.href = location ; 
  window.close();
}

这也给我带来错误:window.opener.location为空或不是一个对象,但我确定我传递了正确的参数。

我像这样调用它:

对于第二部分:

<input type="button" name="pay" value="test" onclick="refreshParent('index.php?module=payment&task=default')" >

for first part :

<a onclick="javascript:open_window('?module=cart&task=add&id=<?=$res[xproductid]?>&popup=on','500' , '500')"  style="cursor:pointer" id="addtocard"> <img src="../images/new_theme/buy_book.gif" width="123" border="0"/> </a>

这真的让我感到困惑。请帮忙 ;)


听起来像是弹出窗口拦截器的问题。 - Cerebrus
我并没有理解其中任何一个词,但我想我成功找到了相关页面。我还成功打开了弹出窗口,并通过其中的按钮关闭了它——之后页面自动刷新了。我没有发现任何错误。一切似乎都正常工作。也许是你电脑里的问题?你有尝试在别人的电脑上操作吗? - Rene Saarsoo
3个回答

6
当使用window.open打开的弹出窗口被弹出窗口拦截器阻止时(这是现代浏览器的一个功能),window.open()的返回值不是窗口对象,而是null。
为了规避这些问题,在尝试调用任何方法之前,需要测试window.open()返回的值。
以下是一段代码,演示如何解决这个问题:
function open_window(Location,w,h) //opens new window
{
  var options = "width=" + w + ",height=" + h;
  options += ",menubar=no,location=no,resizable,scrollbars,top=500,left=500";

  var newwin = window.open(Location,'newWin',options);

  if (newwin == null)
  {
    // The popup got blocked, notify the user
    return false;
  }

  newwin.focus();
}

一般来说,弹出窗口应该只在最后的情况下或受控制的环境中使用(内部公司网站等)。弹出窗口阻止程序的行为往往非常不一致,并且在给定的浏览器中可能安装了不止一个弹出窗口阻止程序,因此指导用户如何允许某个网站的弹出窗口并不一定是解决方案。例如:IE7 + Google工具栏=两个弹出窗口阻止程序。
如果我可以建议的话,也许你应该考虑使用类似于这样的东西: http://jqueryui.com/demos/dialog/ 优点有很多:
1.可换肤,因此您可以创建更一致的外观以匹配您的网站。
2.没有弹出窗口阻止程序。
3.良好的API和文档,在大多数主要浏览器中保持一致,如果不是全部。
如果您仍然需要新打开的“窗口”包含外部URL,那么您可以在打开的对话框窗口内使用IFRAME。
希望这可以帮助,
利奥尔。

0

对我来说完全正常。在IE6/7/8中进行了测试。

当然,我无法使用您的URL进行测试,因此我将其替换为简单的文件名。我建议您也尝试使用简单的文件名,看看是否也会失败。

除此之外...

您不需要在onclick属性值的开头添加“javascript:”。

如果您在链接中添加href="..."属性,并使用与open_window相同的URL,那么它将变成一个真正的链接,您就不必再添加cursor:pointer了。例如:

<a href="?module=cart&task=add&id=<?=$res[xproductid]?>&popup=on"
   onclick="open_window(this.href, '500' , '500'); return false;"> ...


0

这里有一种方法可以两全其美。我没有在所有浏览器上测试过,但它应该真的有效。

function open_window(url,target,w,h) { //opens new window 
  var parms = "width="+w+",height="+h+",menubar=no,location=no,resizable,scrollbars,top=500,left=500";
  var win = window.open(url,target,parms);
  if (win) {
    win.focus();
    return false; // cancel the onClick
  }
  return true; // make the link perform as normal
}

使用链接

<a href="?module=cart&task=add&id=<?=$res[xproductid]?>&popup=on"
target="newWin" 
onclick="return open_window(this.href,this.target,500,500)"
id="addtocard"><img src="../images/new_theme/buy_book.gif" width="123" border="0"/></a>

这甚至可以节省您愚蠢的光标操作,因为它是一个实际的链接,即使JS被关闭也可以正常工作


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