Javascript 我可以为特定元素重写onbeforeunload吗?

Javascript 我可以为特定元素重写onbeforeunload吗?,javascript,events,Javascript,Events,我有一个页面需要做很多工作,我不希望用户能够在没有警告的情况下离开该页面(关闭浏览器、点击后退按钮等)。我发现onbeforeunload事件(我认为它是IE特有的,对我来说很好,因为该项目使用了大量ActiveX)非常有效 问题是,我希望用户能够点击右上角的一个小“帮助”图标,并随时弹出一个帮助窗口。这会导致onbeforeunload触发,即使主窗口从未移动到任何地方,页面也从未卸载 onbeforeunload事件运行时运行的JavaScript函数只是将文本放入event.returnV

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

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

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

编辑:基于我缺乏理解,我下面的“变通方法”完全是过火了。按照上面Shog9的答案去做

当我写这个问题的时候,我想出了一个暂时可行的解决办法

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

也许这不是一个完美的解决方法,但它现在会起作用。

让我猜一下:帮助“图标”实际上是一个带有
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>

我有一个方法有点笨重,但它在大多数情况下都能工作

创建一个“保持”弹出页面,其中包含一个100%单帧的帧集,并将普通的onUnload和onbeforeUnload事件处理程序放在头部

<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>

window.onbeforeunload=退出;
window.onunload=onCloseDoSomething;
函数onCloseDoSomething()
{
警报(“卸载时执行此操作”);
}
功能退出(evt)
{
返回“此处的任何字符串”。}
使用此方法,您可以自由使用想要查看的实际页面,返回并单击超链接,而不触发外部框架onUnload或onbeforeUnload事件

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


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

在互联网上,你会发现许多人建议你使用

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>");
这将“postback”变量设置为true,该变量在confirmExit()函数中提取,具有取消事件的效果


希望你觉得这个有用。它已在IE6和FF 1.5.0.2中测试并运行。

实际上它是一个真正的链接-我错误地认为onclick在onbeforeunload之后启动。谢谢
OnClientClick="postback=true;return true;