首页 / 知识

关于javascript:我可以为特定元素覆盖onbeforeunload吗?

2023-04-15 01:18:00

关于javascript:我可以为特定元素覆盖onbeforeunload吗?

Can I override onbeforeunload for a particular element?

我有一个页面需要做很多工作,并且我不希望用户在没有警告的情况下离开该页面(关闭浏览器,点击后退按钮等)。我发现onbeforeunload事件(我认为它是IE特定的,由于项目使用大量ActiveX,因此对我来说效果很好)。

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

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


让我猜:帮助" icon"实际上是带有javascript: url的链接吗?将其更改为真实的按钮,真实的链接,或者至少将功能置于onclick事件处理程序中(以防止出现默认行为)。问题已解决。

1
2
3
4
5
6
7
8
<!-- 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... -->
blah1
<!-- this should also do nothing, but IE will trigger the onbeforeunload
handler -->
blah2

编辑:基于我的理解不足,我下面的"解决方法"是完全矫kill过正。遵循Shog9的回答。

好的,所以在我写问题时,我想出了一种暂时可以解决的方法。

我将全局JavaScript变量用作布尔值,以决定是否将图标悬停在图标上。然后,我将事件附加到图像的onmouseover和onmouseout事件上,并编写将设置该值的函数。最后,我只是在处理onbeforeunload的函数中编写代码,该函数将在设置event.returnValue。

之前检查此值。

可能不是完美的解决方法,但现在可以使用。


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

window.onbeforeunload = null

,但这在IE6中对我不起作用。在MSDN文档中阅读该事件对象后,我发现对event.cancelBubble属性的引用,我认为这是解决方案。但是感谢Orso指出设置" event.cancelBubble = true"是无用的,摆脱确认提示的方法是完全排除return语句,我选择使用布尔变量作为标志来决定是否退还东西。在下面的示例中,我以编程方式在后面的代码中添加了javascript代码:

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

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

1
OnClientClick="postback=true;return true;

这会将'postback'变量设置为true,该变量将在ConfirmExit()函数中获取,具有取消事件的作用。

希望您觉得这很有用。它已经过测试,并且可以在IE6和FF 1.5.0.2中运行。


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

创建一个包含一个带有100%单帧FRAMESET的FRAMESET的"保留"弹出页面,并将普通的onUnload和onbeforeUnload事件处理程序放置在HEAD中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<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."}
 
  </head>

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

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

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

就像我说的那样,虽然不是完全确定的,但是每次单击或回发时都会触发该事件。


覆盖元素用户事件

最新内容

相关内容

猜你喜欢