4

我有一个页面做了很多工作,我不希望用户能够在没有收到警告的情况下离开该页面(关闭浏览器、点击返回按钮等)。我发现 onbeforeunload 事件(我认为它是特定于 IE 的,对我来说效果很好,因为该项目使用了很多 ActiveX)效果很好。

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

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

4

4 回答 4

8

让我猜猜:帮助“图标”实际上是一个带有javascript:url 的链接?将其更改为真正的按钮、真正的链接,或者至少将功能放在 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>
于 2008-09-11T22:39:50.763 回答
2

编辑:基于我缺乏理解,我下面的“解决方法”完全是矫枉过正。使用上面 Shog9 的答案。

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

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

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

于 2008-09-11T22:22:27.653 回答
0

在互联网上,您会发现很多人建议您使用类似的东西

window.onbeforeunload = null

但这在 IE6 中对我不起作用。在 MSDN 文档中阅读事件对象时,我发现了对 event.cancelBubble 属性的引用,我认为这是解决方案。但是感谢Orso指出设置“event.cancelBubble=true”是没有用的,摆脱confirm提示的方法是完全排除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;

这会将“回发”变量设置为 true,该变量在 confirmExit() 函数中被拾取,具有取消事件的效果。

希望您觉得这个有帮助。它在 IE6 和 FF 1.5.0.2 中经过测试和工作。

于 2009-01-06T03:40:43.147 回答
-1

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

创建一个“Holding”弹出页面,其中包含一个 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 事件。

如果外部框架被刷新或实际关闭,事件将被触发。

就像我说的那样,不是完全证明,但会在每次点击或回发时绕过事件的触发。

于 2008-10-21T10:42:42.003 回答