control + s,返回false但仍然调用另一个函数

时间:2011-11-07 14:39:18

标签: javascript jquery keyboard-shortcuts

$(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()会阻止代码到达“return 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 个答案:

答案 0 :(得分:3)

使用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 :(得分:1)

我不确定我理解你描述的行为,但你可以尝试类似的事情:

$(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;
    }
});