ASP.NET的linkbutton会触发两次onBeforeUnload事件

7

我在这里发布了这个问题,但是认为它可能值得单独提问。

我的目标是显示一个对话框,询问用户是否希望离开页面,如果存在未保存的更改。那一切都很好运作。但是下面描述的问题:

有没有人遇到过Internet Explorer触发onbeforeunload事件两次的问题?在Google周围浏览时,我发现这与(其他东西)ASP.NET linkbutton的HTML代码是<a href="javascript: __doPostBack...有关。

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

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

希望这有点清楚,并希望有人已经找到了解决办法?

3个回答

10

回应annakata:是的,但您希望对话框的结果被浏览器使用。因此,您可能会认为使用'return bFlag'可以解决问题(或者event.returnValue = bFlag),但这会给您带来第二个对话框。 我已经找到一个解决方法,感谢这个页面。实际上很简单:

var onBeforeUnloadFired = false;

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

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

然后实现该函数:

function ResetOnBeforeUnloadFired() {
    onBeforeUnloadFired = false;
}

因此,实际上使用标志(flag),但如果用户单击取消,则重置它。这并不完全是我想要的,但我没有找到更好的方法。


我觉得你太字面理解我的回答了。我的意思是你想把确认值存储在一个标志中,在显示对话框之前使用该标志进行检查。不过,无论如何,我想你已经解决了这个问题 :) - annakata

1

我没有遇到过这种情况,但你肯定可以将标志变量设置为对话框结果的值。如果用户取消,则标志将保持为false。

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

0

IE支持文档对象上的一个名为onstop的事件。该事件在onbeforeunload事件之后触发,但在onunload事件之前触发。这与您的两个对话框问题不太相关,但对于其他可能会遇到此线程的人仍然相关(就像我一样)。

我的问题是,我需要在onbeforeunload事件触发时显示加载消息。这很好,直到页面上有某种确认对话框。即使用户取消并留在页面上,onbeforeunload事件也会触发。对我来说最简单的事情是将我的“加载”显示逻辑移动到document.onstop的处理程序中。除此之外,您还必须检查文档对象的readyState属性,这是另一个仅适用于IE的字段。如果它是“loading”,则表示用户实际上正在离开页面。如果是“complete”,则表示用户正在停留。

如果您只想使用IE,那么您可能会对以下内容感兴趣。

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

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