Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery文档处理程序窃取输入字段中的按键_Javascript_Jquery - Fatal编程技术网

Javascript jQuery文档处理程序窃取输入字段中的按键

Javascript jQuery文档处理程序窃取输入字段中的按键,javascript,jquery,Javascript,Jquery,这个问题以前可能有人问过,但我无法找到合适的搜索短语来定位它,无论是在这里还是在Intertube上 我有一个使用键盘的游戏网页,因此使用jQuery我在文档中设置了处理程序: $(document).keydown(myKeydown); $(document).keyup(myKeyup); $(document).blur(myBlur); 但是现在,在输入字段中写入的任何文本都会被文档事件处理程序窃取,只有在文档处理程序中未使用字符时,字符才会到达输入。这些处理程序本质上如下所示: f

这个问题以前可能有人问过,但我无法找到合适的搜索短语来定位它,无论是在这里还是在Intertube上

我有一个使用键盘的游戏网页,因此使用jQuery我在文档中设置了处理程序:

$(document).keydown(myKeydown);
$(document).keyup(myKeyup);
$(document).blur(myBlur);
但是现在,在输入字段中写入的任何文本都会被文档事件处理程序窃取,只有在文档处理程序中未使用字符时,字符才会到达输入。这些处理程序本质上如下所示:

function myKeydown(event)
{
    if (event.which == 65)
    {
        console.log('a pressed');
        return false;
    }
    return true;
}
现在假设我有一个文本输入框;如果我按下除“a”以外的任何键,它会显示在输入中,但不会显示“a”(因为myKeydown通过返回false来“吃掉”它)。在任何情况下我都可以返回true,但是如果没有输入框被聚焦,我会得到一些奇怪的东西,比如“键入时搜索”,如果启用的话

我已尝试为输入框添加处理程序:

input.keydown(function() { console.log('down'); return false; });
input.keyup(function() { console.log('up'); return false; });
input.blur(function() { console.log('blur'); return false; });
通过这段代码,我得到了console.logs,但是当然,按键不会到达盒子(因为我对按键不做任何操作)。我是否可以将这些事件发送到某个位置,以便相应的键显示在输入框中

注意:一些人建议使用
event.stopPropagation()
而不是
return false
。说:

从处理程序返回false相当于对事件对象调用.preventDefault()和.stopPropagation()

这正是我想要的:为了防止“键入时搜索”,我必须阻止默认操作,即在输入上键入,在页面上“键入时搜索”


(另外,由于某些原因,
keydown
事件处理程序在Firefox最新版本上没有stopPropagation()函数。)

有两种方法可以防止这种情况

  • 在事件处理程序中获取目标,如果目标是
    输入
    /
    文本区域

  • 将同一事件绑定到输入并停止传播

  • 依我看,第一个选择是正确的。试试:

    if ($(event.target).is('input, textarea, select'))
    {
        return true;
    }
    

    在事件处理程序的开始处。

    要使adeneo的注释保持干净:

    function myKeydown(event)
    {
        if (event.which == 65)
        {
            console.log('a pressed');
            event.stopPropagation();
        }
    }
    $(document).keydown(myKeydown);
    

    这可以使用
    上完成吗,例如
    $(文档)。在(“keydown”,“not(input,textarea)”,myKeydown);
    ?@Barmar我想是的!我不建议对mousemove这样的鼠标事件使用此选项,因为它需要根据(可能很复杂)对目标进行评估选择器,在它解析选择器之后。我不确定它对于快速打字机的性能如何,但我仍然无法在jQuery中找到特定的代码,但我怀疑它与调用
    .is()基本相同
    --他们都必须解析选择器,然后对照它检查事件目标。顺便说一句,我个人总是使用。另一方面,如果你决定添加或删除限制选择器,那么语法上的更改就更少了,你的所有代码都遵循相同的模式。另外,我通常只使用选择器将事件绑定到父容器,因为启动代码较少,而且唯一与传播斗争的浏览器是IE6,所以meh…正如adeneo所说,对于输入处理程序,您希望使用
    e.stopPropagation();
    ,而不是
    返回false;
    (其中
    e
    是传入的
    事件)@Ian不是个好主意:如果我不返回false,那么”当我开始键入“kicks in”时搜索文本,我会得到一个搜索框。请注意,我说过我确实想阻止“search as you type”进入搜索框。更改代码不会阻止它。当您键入输入时,是否要阻止控制台日志?这指的是阻止bublingNo,我想阻止“搜索文本”,这是默认操作<代码>返回false
    还可以防止冒泡,因此在这方面没有改进。请看我添加到问题中的注释。