control + s, вернуть false, но по-прежнему вызывать другую функцию - PullRequest
0 голосов
/ 07 ноября 2011
$(document).keydown(function (e) {
    if (e.keyCode == 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)) {
        function_which_does_a_lot_including_ajax_calls();
        return false;
    }
});

Я пытаюсь вызвать метод на control + S , и вызов function_which_does_a_lot_including_ajax_calls() останавливает код от достижения времени возврата "false", означает, что браузер запрашивает окно «Вы хотите сохранить этот сайт» по умолчанию.

Если я изменю это просто:

$(document).keydown(function (e) {
    if (e.keyCode == 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)) {
        // function_which_does_a_lot_including_ajax_calls();
        return false;
    }
});

... срабатывает возврат false, и ничего не происходит (без приглашения по умолчанию).

Есть ли способ, которым я могу сделать много вещей, но все равно вернуть false, чтобы браузер не выполнял поведение по умолчанию? Спасибо!

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

Используйте e.preventDefault() для предотвращения поведения браузера по умолчанию (аналогично return false).

Пример:

$(document).keydown(function (e) {
    if (condition_says_NO_to_default) {
        e.preventDefault();
        .... //Rest of code

Обновление: альтернативный метод. Приведенный ниже код поддерживает область действия, this и ссылку на объект события, тогда как оператор return false обрабатывается первым:

$(document).keydown(function (e) {
    var $this = this; //Save reference for later
    setTimeout(function(){
        (function(event){
            //Your code here
        }).call($this, e);
    }, 1); // An extremely low timeout.
    return false;
});
1 голос
/ 07 ноября 2011

Я не уверен, что понимаю поведение, которое вы описали, но вы можете попробовать что-то вроде:

$(document).keydown(function (e) {
    if (e.keyCode == 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)) {
        setTimeout(function_which_does_a_lot_including_ajax_calls, 100);
        return false;
    }
});
...