我可以覆盖特定元素的onbeforeunload吗?

时间:2008-09-11 22:16:25

标签: javascript events

我有一个页面,它做了很多工作,我不希望用户能够离开该页面(关闭浏览器,回击按钮等)而不会收到警告。我发现onbeforeunload事件(我认为是特定于IE的,对我来说很好,因为项目使用了大量的ActiveX)非常好。

问题是,我希望用户能够点击右上角的一个小“帮助”图标,随时弹出一个帮助窗口。这会导致onbeforeunload触发,即使主窗口永远不会到达任何地方并且页面永远不会卸载。

运行onbeforeunload事件时运行的JavaScript函数只将文​​本放入event.returnValue。如果我能够以某种方式确定帮助图标是被点击的图标那么我就不能在这种情况下将文本放入event.returnValue。但是我怎么能得到那个页面图?

4 个答案:

答案 0 :(得分:8)

让我猜一下:帮助“图标”实际上是一个带有javascript:网址的链接?将其更改为真实按钮,真实链接,或者至少将功能放在onclick事件处理程序中(这可以防止默认行为)。问题解决了。

<!-- clicking this link will do nothing. No onbeforeunload handler triggered. 
Nothing. 
And you could put something in before the return false bit...
...and the onunload handler would still not get called... -->
<a href="http://www.google.com/" onclick="return false;">blah1</a>
<!-- this should also do nothing, but IE will trigger the onbeforeunload 
handler -->
<a href="javascript:void(0)">blah2</a>

答案 1 :(得分:2)

编辑:根据我缺乏理解,下面的“解决方法”是完全矫枉过正的。按照上面的Shog9的回答。

好的,在我写这个问题时,我提出了一个现在可以使用的解决方法。

我将一个全局JavaScript变量作为一个布尔值来判断图标是否悬停在上面。然后,我将事件附加到图像的onmouseover和onmouseout事件,并编写将设置此值的函数。最后,我只是在处理onbeforeunload的函数中编写代码,该函数将在设置event.returnValue之前检查此值。

可能不是一个完美的解决方法,但它现在可以工作。

答案 2 :(得分:0)

在互联网上你会发现很多人建议你使用像

这样的东西

window.onbeforeunload = null

但这在IE6中对我不起作用。在事件对象的MSDN文档中读取我发现了对event.cancelBubble属性的引用,我认为这是解决方案。但是由于Orso指出设置“event.cancelBubble = true”是没用的,摆脱确认提示的方法是完全排除return语句,我选择使用布尔变量作为标志来决定是否什么不回报。在下面的示例中,我在后面的代码中以编码方式添加了javascript代码:

Page.ClientScript.RegisterStartupScript(typeof(String), "ConfirmClose", @"  <script>        window.onbeforeunload = confirmExit;        function confirmExit()      {           if(postback == false)               return ""Please don't leave this page without clicking the 'Save Changes' or 'Discard Changes' buttons."";                                                      }       </script>");

然后帮助按钮包含以下aspx标记:

OnClientClick="postback=true;return true;

这会将'postback'变量设置为true,它会在confirmExit()函数中被拾取,具有取消事件的效果。

希望你觉得这很有用。它经过测试,适用于IE6和FF 1.5.0.2。

答案 3 :(得分:-1)

我的方法有点笨重,但在大多数情况下都可以使用。

创建一个“持有”弹出页面,其中包含一个带有一个100%单个FRAME的FRAMESET,并将正常的onUnload和onbeforeUnload事件处理程序放在HEAD中。

<html>
<head>
<script language="Javascript" type="text/javascript">
  window.onbeforeunload = exitCheck;
  window.onunload = onCloseDoSomething;

  function onCloseDoSomething()
  {
  alert("This is executed at unload");
  }

  function exitCheck(evt)
  {
  return "Any string here."}
  </script>
  </head>

    <frameset rows="100%">
    <FRAME name="main" src="http://www.yourDomain.com/yourActualPage.aspx">
    </frameset>
<body>
</body>
</html>

使用此方法,您可以自由使用您想要查看的实际页面,回发并单击超链接,而不会触发外部框架onUnload或onbeforeUnload事件。

如果外框被刷新或实际关闭,则会触发事件。

就像我说的那样,并非全面证明,但会在每次点击或回发时绕过事件。