Я могу препятствовать тому, чтобы window.onbeforeunload был назван при выполнении вызова Ajax

Поместите ваш default.png в полноэкранный режим UIImageView в виде подвью в верхней части вашего основного вида, таким образом, охватывая другой пользовательский интерфейс. Установите таймер, чтобы удалить его через x секунд (возможно с эффектами), показывая ваше приложение.

22
задан ConroyP 11 February 2009 в 16:55
поделиться

5 ответов

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

Быть уверенными Вы читаете эту соответствующую спецификацию: onbeforeunload спецификация

Видит, инициировал ли вызов Ajax, возможно, какое-либо из действий, перечисленных в Для вызова таблица.

2
ответ дан Luca Matteis 29 November 2019 в 04:51
поделиться

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

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

Я уже использовал, есть ли на странице определенное скрытое поле. чтобы определить на стороне клиента, когда уместно показать предупреждение о переходе, поэтому я смог исправить это очень просто, добавив проверку скрытого поля ' s к моему условию if onbeforeunload и подключению к обработчикам 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.

и подключение к обработчикам 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.

и подключение к обработчикам 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.

Это эффективно отключает предупреждение во время частичных обратных передач. Вы могли бы добавить сюда более сложную логику, если бы хотели проверить более конкретные вещи.

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

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.

Это эффективно отключает предупреждение во время частичных обратных передач. Вы могли бы добавить сюда более сложную логику, если бы хотели проверить более конкретные вещи.

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

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.

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

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.

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

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.

0
ответ дан 29 November 2019 в 04:51
поделиться

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

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

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

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

allowConfirm = false; вернуть window.location.href;

5
ответ дан 29 November 2019 в 04:51
поделиться

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

 OnClientClick="eval(this.href);return false" 
0
ответ дан 29 November 2019 в 04:51
поделиться

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

Submit

или

Submit

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

Submit

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

30
ответ дан 29 November 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: