Могу ли я переопределить onbeforeunload для определенного элемента?

StackOverflow https://stackoverflow.com/questions/57791

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Функция JavaScript, которая запускается при запуске события onbeforeunload, просто помещает текст в event.returnValue.Если бы я мог каким-то образом убедиться, что значок справки — это тот, по которому щелкнули, я бы просто не смог поместить текст в 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>

Другие советы

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

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

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

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

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

window.onbeforeunload = ноль

но у меня это не работает в 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, которое фиксируется в функции submitExit(), что приводит к отмене события.

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

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

Создайте всплывающую страницу «Holding», содержащую 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.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top