Могу ли я переопределить onbeforeunload для определенного элемента? - PullRequest
4 голосов
/ 12 сентября 2008

У меня есть страница, которая выполняет довольно много работы, и я не хочу, чтобы пользователь мог уйти с этой страницы (закрыть браузер, нажать кнопку возврата и т. Д.) Без предупреждения. Я обнаружил, что событие onbeforeunload (которое, как мне кажется, специфично для IE, отлично работает для меня, так как в проекте используется много ActiveX), прекрасно работает.

Проблема в том, что я хочу, чтобы пользователь мог нажать на маленький значок «Справка» в правом верхнем углу и вызвать всплывающее окно справки в любое время. Это вызывает срабатывание onbeforeunload, даже если главное окно никуда не уходит, а страница никогда не выгружается.

Функция JavaScript, которая запускается при запуске события onbeforeunload, просто помещает текст в event.returnValue. Если бы я мог как-то установить, что значок справки - это тот, на который нажали, я бы просто не смог поместить текст в event.returnValue в этой ситуации. Но как я могу понять это на странице?

Ответы [ 4 ]

8 голосов
/ 12 сентября 2008

Позвольте мне угадать: справочная "иконка" на самом деле является ссылкой с 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>
2 голосов
/ 12 сентября 2008

РЕДАКТИРОВАТЬ: Мой "обходной путь" ниже является полным излишним, из-за моего непонимания. Перейти с ответом Shog9 выше.

ОК, поэтому, когда я писал вопрос, я нашел обходной путь, который пока будет работать.

Я поместил глобальную переменную JavaScript в действие как логическое значение, указывающее, находится ли значок над курсором. Затем я присоединяю события к событиям onmouseover и onmouseout изображения и пишу функции, которые будут устанавливать это значение. Наконец, я просто кодирую функцию, которая обрабатывает onbeforeunload, которая проверяет это значение перед установкой event.returnValue.

Вероятно, не безупречный обходной путь, но пока он будет работать.

0 голосов
/ 06 января 2009

в Интернете вы найдете много людей, предлагающих вам использовать что-то вроде

window.onbeforeunload = null

но это не работает для меня в IE6. читая в MSDN документах для объекта события, я нашел ссылку на свойство event.cancelBubble, которое, как я думал, было решением. но благодаря Орсо, который указал, что установка «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, которое выбирается в функции verifyExit (), что приводит к отмене события.

надеюсь, вы найдете это полезным. протестировано и работает в IE6 и FF 1.5.0.2.

0 голосов
/ 21 октября 2008

У меня есть метод, который немного неуклюжий, но он будет работать в большинстве случаев.

Создайте всплывающую страницу «Удержание», содержащую FRAMESET с одним, 100% одиночным FRAME, и поместите обычные обработчики событий 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 для внешнего фрейма.

Если внешний фрейм обновлен или фактически закрыт, события сработают.

Как я уже сказал, не полностью корректно, но будет обходить событие при каждом щелчке или обратной передаче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...