【问题标题】:control + s, return false but still call another functioncontrol + s,返回false但仍然调用另一个函数
【发布时间】:2011-11-07 14:39:18
【问题描述】:
$(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;
    }
});

... return false 被触发,什么也没有发生(没有默认提示)。

有没有办法我可以做很多事情,但仍然返回 false 以使浏览器不执行其默认行为?谢谢!

【问题讨论】:

  • 嗯,keydown 回调涉及到某种“超时”,这有点奇怪......你确定函数没有因为function_which_does_a_lot_including_ajax_calls 内部的异常而中止吗?跨度>
  • function_which_does_a_lot_including_ajax_calls 甚至有一个提示,所以这可能是个问题。

标签: javascript jquery keyboard-shortcuts


【解决方案1】:

使用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;
});

【讨论】:

  • 无论出于何种原因,e.preventDefault() 都不会阻止默认浏览器行为。我仍然收到提示或保存网站,这是 Ctrl + S 的默认浏览器。
  • 或者,您可以将代码包装在 setTimeout 中,如我更新的答案所示。建议的代码也正确处理this
  • 我发现“preventDefault”解决方案更干净,但我认为有一个技巧可以让它适用于所有浏览器。
【解决方案2】:

我不确定我是否理解您描述的行为,但您可以尝试以下操作:

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

【讨论】:

    猜你喜欢
    • 2013-08-25
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多