2008-11-25 60 views
6

我已经发布了这个here,但认为它可能值得自己的问题。ASP.NET linkbutton提高onBeforeUnload事件两次

我想要做的是显示一个对话框,询问用户如果他/她想离开页面,如果有未保存的更改。这一切都很好。但是,问题描述如下:

有没有人遇到过Internet Explorer将两次触发onb​​eforeunload事件的问题?在Google上搜索时,我发现它与(其中包含)ASP.NET链接按钮的事实有关,HTML代码是<a href="javascript: __doPostBack...

显然,当IE遇到没有href="#"的链接时,它会触发onb​​eforeunload事件。然后,当您确认我们正在显示的javascript对话框时,页面将执行“真实”卸载以导航到其他页面,并再次提升onbeforeunload事件。

互联网上提供的解决方案是设置一个布尔变量并在显示对话框之前检查它。所以第二次,它不会被显示。这很好,但是当用户取消时,变量仍然会被设置。因此,下次用户想要离开该页面时,对话框将不再显示。

希望这有点清楚,我希望有人找到解决办法吗?

回答

10

对annakata的反应:是的,但是您希望浏览器使用对话框的结果。所以你可能会认为使用'return bFlag'会做伎俩(或event.returnValue = bFlag),但是这会给你第二个对话框。 我找到了解决办法,感谢this page。这是很简单的实际上是:

var onBeforeUnloadFired = false; 

使用这个全局变量在这里:

if (!onBeforeUnloadFired) { 
    onBeforeUnloadFired = true; 
    event.returnValue = "You'll lose changes!"; 
} 
window.setTimeout("ResetOnBeforeUnloadFired()", 1000); 

,然后实现该功能:

function ResetOnBeforeUnloadFired() { 
    onBeforeUnloadFired = false; 
} 

所以,实际上,使用该标志,但重置如果用户点击取消。不完全是我想要的,但没有找到更好的东西。

+0

我认为你正在从字面上理解我的答案。我的意思是你想在显示对话框之前将确认值存储在你用来检查的标志中。我想你会以任何方式:) – annakata 2009-02-13 10:13:12

1

我还没有遇到过这个问题,但是您肯定可以设置标志变量等于对话框的结果吗?如果用户取消该标志,则将保持为假。

var bFlag = window.confirm('Do you want to leave this page?'); 
0

IE支持名为onstop的文档对象上的事件。此事件在onbeforeunload事件之后但在onunload事件之前触发。这与你的两个对话框问题并不完全相关,但它与其他人可能在这个线程上绊倒有关(就像我一样)。

我遇到的问题是我需要在onbeforeunload事件触发时显示加载消息。这一切都很好,直到页面上有确认对话框。即使用户取消并保持在页面上,onbeforeunload事件也会触发。最简单的做法是将我的“加载”显示逻辑移动到document.onstop的处理程序中。最重要的是,您必须检查文档对象的readyState属性,这是另一个仅限IE的字段。如果它的“加载”,这意味着用户实际上离开了页面。如果它的“完整”,则表示用户正在停留。

如果您使用IE浏览器很好,那么您可能会对以下内容感兴趣。

document.onstop = function() 
{ 
    try 
    { 
     if(document.readyState != "complete") 
     { 
      showLoadingDiv(); 
     } 
    } 
    catch(error) 
    { 
     handleError(error); 
    } 
}