Подтвердить что ты не робот

Могу ли я предотвратить вызов window.onbeforeunload при выполнении вызова AJAX

У меня есть элемент управления сетью на основе AJAX.

Мы подключаемся к событию window.onbeforeunload, чтобы проверить, есть ли у них несохраненные данные, и если они представляют их с сообщением "Вы уверены, что хотите уйти... у вас есть несохраненные данные...".

Все это хорошо.

Но AJAX вызывает также триггер window.onbeforeunload, и поэтому, если в сетке есть несохраненные данные, и мы делаем вызов AJAX (например, чтобы удалить строку в другой сетке), пользователь получает сообщение "Вы уверены, что хотите перейти... у вас есть несохраненные данные..." сообщение, которое не является хорошим.

Можно ли отключить событие onbeforeunload для вызовов AJAX? Или можно определить, что вызов является вызовом AJAX? В противном случае нам придется взломать!

Спасибо

4b9b3361

Ответ 1

Если вы хотите активировать обратную передачу по гиперссылке, существует простой способ: Вместо

<a href="javascript:submitFunction();">Submit</a>

или

<a href="javascript:;" onclick="submitFunction();">Submit</a>

просто используйте этот код:

<a href="#" onclick="submitFunction();">Submit</a>

Кажется, что IE запускает событие onbeforeunload, если содержимое href-атрибута гиперссылки не является текущей страницей (что указывает резкий символ).

Ответ 2

Я сделал что-то вроде этого:

внутри тега тела:

  var allowConfirm = true;

  window.onbeforeunload = confirmExit;
  function confirmExit()
  {
    if(allowConfirm)
        return "Are you sure you want to navigate away from this page?";
    else
        allowConfirm = true;
  }

Когда я выхожу из системы, я называю это script:

allowConfirm = false; return window.location.href;

Ответ 3

Это действительно странно, уверены ли вы, что ваш вызов Ajax не загружает новую ссылку?

Обязательно прочитайте эту соответствующую спецификацию: onbeforeunload spec

Посмотрите, может ли вызов Ajax инициировать любые действия, перечисленные в таблице Чтобы вызвать таблицу.

Ответ 4

В случае IE6 или href вы можете перехватить функцию обратной передачи. i.e.: если функция обратной передачи WebForm_DoPostBackWithOptions и с использованием JQuery, добавьте этот код ниже кода выше

var DoPostBackWithOptionsHook = null;

$(document).ready(function(){
  DoPostBackWithOptionsHook = WebForm_DoPostBackWithOptions;
  WebForm_DoPostBackWithOptions = WebForm_DoPostBackWithOptionsHook;
}

function WebForm_DoPostBackWithOptionsHook(options) {
    var navigateAwayFlag = $("input[id*='navigateAwayValue']");
       if (navigateAwayFlag.length > 0) {
           navigateAwayFlag[0].value = "false"; }

    return DoPostBackWithOptionsHook(options)
}

Ответ 5

Если вы говорите об частичных обратных передачах ASP.NET AJAX, то я тоже сегодня столкнулся с этим поведением, делая то же самое. (Если вы этого не сделаете, полностью игнорируйте мой пост.)

По моему опыту до сих пор кажется, что если ваш частичный обратный вызов запускается с помощью ввода, он не будет запускать onbeforeunload во время частичной обратной передачи, но если частичная обратная передача запускается с помощью гиперссылка. Похоже, браузер предполагает, что вы перемещаетесь, если вы нажмете на что-либо в привязном теге (только в IE и FireFox, но да).

Независимо от того, имеет ли страница какое-то скрытое поле, то, что я использовал, чтобы определить клиентскую сторону, когда ей нужно показать навигационное предупреждение, поэтому я смог исправить это очень просто, добавив проверку скрытого значение поля для моего onbeforeunload if condition и привязка к обработчикам BeginRequest и EndRequest PageRequestManager для установки значения. Это эффективно отключает предупреждение во время частичной обратной передачи. Вы могли бы добавить более сложную логику, если бы были более конкретные вещи, которые вы хотели проверить.

Вот действительно чрезмерно упрощенная версия кода. (извините, если я пощадил и подвергал цензуре до такой степени, что она не работает, но она должна дать вам представление.)

window.onbeforeunload = checkNavigateAway;

Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(onBeginRequest);
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(onEndRequest);

function onBeginRequest(sender, args) {
    var navigateAwayFlag = $("input[id*='navigateAwayValue']");
    if (navigateAwayFlag.length > 0) {
        navigateAwayFlag[0].value = "false";
    }
}

function onEndRequest(sender, args) {
    var navigateAwayFlag = $("input[id*='navigateAwayValue']");
    if (navigateAwayFlag.length > 0) {
        navigateAwayFlag[0].value = "true";
    }
}

function checkNavigateAway() {
    var navigateAwayFlag = $("input[id*='navigateAwayValue']");
    if (navigateAwayFlag.length > 0 && navigateAwayFlag[0].value == "true")
    {
        return "Warning Text";
    }
}

Изменить. Плохая новость. Вышеизложенное не работает в IE6. Похоже, что он запускает события в другом порядке, чем Firefox, поэтому onbeforeunload срабатывает перед AJAX beginRequest... Может потребоваться найти способ изменить значение флага через гиперссылку, прежде чем начнется onbeforeunload.

Ответ 6

Это действительно работает:

 OnClientClick="eval(this.href);return false" 

Ответ 7

Одним из способов решения этой проблемы является вызов submitFunction() при событии click тега гиперссылки с использованием jquery и удаление атрибута href из гиперссылки.

Ответ 8

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

Ответ 9

Не использовать AJAX, но он все равно хотел бы оставить страницу с несохраненными изменениями. Я пробовал большинство предыдущих предложений, в том числе navigateAway. Ни один из них не работал с IE 8. NavigateAway всегда возвращала длину 0.

Я нашел блог, на котором было решение об использовании класса в качестве идентификатора в теге, а затем на основе Boolean. Я пробовал это, но это не работает, потому что .NET, когда он выводит HTML, обертывает тег ввода тегом span с объявленным в нем классом. Моим окончательным решением было положить слово Ignore в ID-имя тега. Кроме того, чтобы предотвратить onbeforeunload, вызываемый до щелчка, попадает в ловушку кода, который устанавливает логическое значение, нужно использовать, например asp: Button или asp: Input. Наконец, asp force (VS IDE) делает начальное имя типом управления; ID = "Button_Save". Использование asp: тегов также предотвращает вызов onbeforeunload дважды.

<script type="text/javascript" language="javascript">
 var stuffchanged = false
 var ignorenavigate = false

  $(document).ready(function () {


    //Detect whether the event source has "nonavigate" class specified
    $("a,input,img,checkbox,button").click(function () {
        var str = $(this).attr("ID");
        ignorenavigate = str.search("Ignore") > 0;
    });

});

window.onbeforeunload = confirmExit;
function confirmExit() {
    if (stuffchanged && !ignorenavigate) {
        return "You have attempted to leave this page with unsaved changes.  If you have made any changes to the fields without " +
    "clicking the Save button, your changes will be lost.  Are you sure you want to exit this page?";
    }  

}

  function textchanged() {
     stuffchanged = true;
  }