2009-05-22 37 views
0

给定以下流程:在AJAX响应处理程序中关闭Firefox 2中的弹出窗口

1)用户单击一个链接,打开一个弹出窗口。 2)用户做了一些事情,点击一个按钮来保存更改。 3)使用AJAX,一些数据被张贴。 4)在AJAX响应处理程序中,弹出窗口关闭,主窗口刷新。

FireFox 2存在一个问题,关闭响应处理程序中的弹出窗口失败(直到某些用户活动,例如鼠标移动,在窗口上执行)。

Sample code (popup window only): 

function ajax_cb() 
{ 
    window.close(); 
} 

// Send a POST request, ajax_cb will be called when readystate == 4. 
function test_ajax_close() 
{ 
    Request.sendPOST("file:///test.html", "", ajax_cb); 
} 

在上面的示例中,窗口最终会关闭,但首先需要用户交互。根据这一link

火狐变得不快乐,如果仍有打开的插座做一个异步AJAX请求,并尝试做一个window.close()的。

回答

1

只是包装你在很短的超时密切..

setTimeout(window.close, 100); 

这shoould足够的时间插座完成关闭,并poopup自行关闭。

+0

是的,我原本以为这不起作用,但昨天晚些时候试了一下,它解决了这个问题。 – jthompson 2009-05-23 19:11:42

0

我想出的一个解决方案是轮询一些外部变量,并在窗口发生变化时关闭窗口。我正在寻找更好的解决方案,但示例代码是:

var response_received = 0; 

function ajax_cb() 
{ 
    response_received = 1; 
} 

function monitor_response() 
{ 
    if (response_received) 
    { 
     self.close(); 
     return; 
    } 

    setTimeout("monitor_response()", 100); 
} 

function test_ajax_close() 
{ 
    Request.sendPOST("file:///test.html", "", ajax_cb); 
    monitor_response(); 
} 
0

我不会为此使用常规窗口。我会在div中使用一个Iframe,模拟一个窗口,对它进行全面控制。