javascript event.preventDefault()在Firefox中停止生产

时间:2015-03-05 23:31:37

标签: javascript cross-browser

我有一个javascript方法,它引入了几个键盘快捷键,包括一个覆盖现有浏览器命令的键盘快捷键。 Chrome和Firefox中的Ctrl-G通常是转到增量搜索中的下一项(通常由Ctrl-F启动)的命令。对于我的应用,我希望Ctrl-G提示输入文档ID,并将用户带到相应的文档。

在我的本地主机上,它在Chrome和Firefox中均可正常运行。阻止了正常Ctrl-G行为,并且提示正常显示。

当我在生产服务器上放置完全相同的代码时,Chrome仍能正常运行,但Firefox同时执行我的脚本操作和默认的Ctrl-G操作。更糟糕的是,焦点/光标最终在增量搜索而不是提示对话框中,因此用户不能简单地忽略它并键入值。

我发现的所有其他类似问题都归结为event没有在处理程序中定义,我已经做到了这一点。其他建议是立即event.preventDefault(),但我只想在某些情况下preventDefault()而不是其他情况。

$(document).bind('keydown', function(e) {
    // ignore keyboard shortcuts when in an input
    if (isFocusOnInput()) { return; }

    // get which key was pressed (upper case if Shift, lower if not)
    var key;
    if (e.shiftKey) {
        key = String.fromCharCode(e.which);
    } else {
        key = String.fromCharCode(e.which).toLowerCase();
    }

    // the shortcuts themselves.
    if (key == 'h' && typeof hilightMyTasks == 'function') {
        hilightMyTasks();
    } else if (key == 'g' && (e.ctrlKey || e.metaKey)) {
        e.preventDefault();
        id = prompt('Enter task id','');
        if (id) {
            if (Number(id) == id && id % 1 == 0 && id > 0) {
                window.location.href='/index.php?m=tasks&a=view&task_id='+id+'&tab=0'
            } else {
                alert('Invalid task id!');
            }
        }
    }
});

如果它是相关的,isFocusOnInput()方法:

function isFocusOnInput() {
    var focusType = document.activeElement.type;
    if (focusType == 'text' || focusType == 'textarea' || focusType == 'select-one' ||
            focusType == 'checkbox' || focusType == 'radio' || focusType == 'select-multiple' ||
            focusType == 'password' || focusType == 'hidden' || focusType == 'submit' ||
            focusType == 'reset' || focusType == 'image' || focusType == 'number' ||
            focusType == 'color' || focusType == 'date' || focusType == 'datetime' ||
            focusType == 'datetime-local' || focusType == 'email' || focusType == 'month' ||
            focusType == 'range' || focusType == 'search' || focusType == 'tel' ||
            focusType == 'time' || focusType == 'url' || focusType == 'week' ||
            focusType == 'button') {
        return true;
    }
    return false;
}

0 个答案:

没有答案