2013-04-11 1 views
-1

У меня появляется ошибка кода, когда кто-то нажимает кнопку «Назад» во время загрузки ajax-вызова. Есть ли способ отключить его, пока вызов не завершится успешно?AJAX Отключить кнопку «Назад» до тех пор, пока не будет выполнен обратный вызов

Пример:

$.ajax({ 
// Disable back button 
url: "test.html", 
context: document.body 

}).done(function() { 
// Enable back button 
$(this).addClass("done"); 
}); 

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

+1

Вы имеете в виду кнопку "Назад" в браузере? Нет, нет способа отключить его от кода JavaScript. * Большинство * вы можете сделать, это использовать 'onbeforeunload', чтобы показать« вы уверены, что хотите уйти? » подтверждение. –

+2

Вы не можете их остановить. Но вы можете попытаться связать событие с событием 'window' beforeunload, когда есть еще один запрос AJAX. Правильное выполнение может вызвать всплывающее окно для пользователя, спрашивающего, действительно ли они хотят покинуть страницу или нет (так что это не относится к нажатию кнопки «Назад» ... это для любого способа покинуть страницу) – Ian

ответ

-1

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

.done(function(){console.log(this);}); 
+2

У них есть четкие установите опцию 'context' как' document.body' – Ian

2

Вы не можете запретить пользователю с помощью BackButton в WebBrowser, но, возможно, с помощью этого кода вы можете, сигнализировать пользователю ждать. (И, возможно, ждет пользователя, или так) :)

пример:

window.onbeforeunload = function(){ 
    return "Please wait until page load is done?"; 
} 

=> Код Испытано на Chrome 26+

Может быть, это помогает

Edit:

противопоставить что «хмель» упоминалось, вы можете установить эту функцию события, при запуске вызова Ajax и удаление функции после завершения вызова Ajax, но это лишь некоторые детали.

Пример 2:

... 
function setPreventLeavingPage(){ 
    window.onbeforeunload = function(){ 
     return "Please wait until page load is done?"; 
    } 
} 

function removePreventLeavingPage(){ 
    window.onbeforeunload = null; 
} 
... 

$.ajax({ 
    url: "test.html", 
    beforeSend: function() { 
     setPreventLeavingPage(); 
    }, 
    context: document.body 
    }).done(function() { 
     // do some stuff 
     ... 
     removePreventLeavingPage(); 
    }); 

=> Код Испытано на Chrome 26+

+0

** В этом коде появляется диалоговое окно подтверждения **, если они могут выбрать пребывание или оставить! в противном случае я не знаю лучшего решения –

+0

Упс!Я ожидал, что вы вызовете 'confirm()'; Я не понимал, что «onbeforeunload» делает это автоматически! Здесь [запись MDN для onbeforeunload] (https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload) для будущих невежественных мне людей. – Mathletics

+1

Но это произойдет даже для того, чтобы страница была перемещена другими способами, например, кодом. Но, боюсь, нет способа обнаружить его – hop

2

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

В любом случае, самое лучшее, что вы можете сделать, это использовать onbeforeunload (который работает только в некоторых браузерах, например, я знаю, что Opera не поддерживает его). Если есть запрос AJAX, вы можете выбросить «Вы уверены, что хотите уйти?» сообщение.

Пример:

$(document).ajaxStart(function(){ 
    $(document.body).addClass('running'); 
}); 
$(document).ajaxStop(function(){ 
    $(document.body).removeClass('running'); 
}); 

$(window).on('beforeunload', function(){ 
    if($(document.body).hasClass('running')){ 
     return "There is still a pending AJAX request. Are you sure you want to leave?"; 
    } 
}); 

$.ajax({ 
    url: "test.html", 
    context: document.body 
}).done(function() { 
    $(this).addClass("done"); 
}); 
+0

Не хотите 'if ($ (document.body) .hasClass ('running')) {'? – Ian

+1

@Ian: Да. Типо: -P –