Javascript 当word suggestion开启时,Android上的Firefox不会触发按键事件

Javascript 当word suggestion开启时,Android上的Firefox不会触发按键事件,javascript,android,jquery,html,firefox,Javascript,Android,Jquery,Html,Firefox,我有一个搜索字段,可以在键入时触发自动完成搜索。我把它扣在钥匙上了。这在大多数浏览器中都能很好地工作,但在Android上的Firefox中,这不起作用。似乎键入时未触发keyup事件。只有在Android键盘设置中打开单词建议时,才会发生这种情况 我在谷歌搜索上看到,自动完成搜索在相同的设置下工作,所以这显然是可能的。我想知道怎么做?这是一个特殊的事件,我需要听这个工作吗 此外,我还试着听事件的变化,按键和按键,但没有被触发 HTML: jQuery事件绑定: $('#searchFiel

我有一个搜索字段,可以在键入时触发自动完成搜索。我把它扣在钥匙上了。这在大多数浏览器中都能很好地工作,但在Android上的Firefox中,这不起作用。似乎键入时未触发keyup事件。只有在Android键盘设置中打开单词建议时,才会发生这种情况

我在谷歌搜索上看到,自动完成搜索在相同的设置下工作,所以这显然是可能的。我想知道怎么做?这是一个特殊的事件,我需要听这个工作吗

此外,我还试着听事件的变化,按键和按键,但没有被触发

HTML:


jQuery事件绑定:

$('#searchField').keyup(函数(e){
var searchValue=$(this.val();
searchApi.\u executeAutocomplete(searchValue);
});
注意:
有时,按键事件会被触发,通常是敲击一个不会导致形成单词过程的按键。这里最明显的是Enter,它总是触发。另一个是空格,它会触发,因为没有单词包含空格,因为空格是单词的定义。如果删除的最后一个字符不在单词中,则会触发退格。这意味着,如果您刚刚删除了单词的最后一个剩余字母(因此它是字段的开头,或光标紧跟空格),则会触发该事件,但如果您删除了单词末尾的某些字符,而光标仍紧跟在字母后面,则不会触发该事件。基本上,如果按键导致来自键盘应用程序的某种单词提示,则不会触发按键事件

顺便说一句,我可以说,在同一台设备上,Chrome的一切都很好。

我在另一个问题上找到了解决方案。问题基本上是“将我动态编写的文本复制到页面的另一部分”。答案是支持通过非键盘操作捕捉更改,如使用鼠标粘贴文本。解决方法是在文本字段中启动焦点嗅探器,使用
setInterval(…)
检查值是否已更改。它在模糊时清除计时器

这解决了我的问题,基本上是关键事件没有触发,以及“鼠标粘贴”的问题,我没有意识到这是一个问题,直到我找到这个答案

这是可行的,但我不确定我对这个解决方案是否完全满意,因为它使用了嗅探器。我会更乐意使用在价值变化时触发的某种事件,无论变化的原因是什么。使用
change
事件将不起作用,因为在焦点离开字段之前不会触发该事件。

您可以使用该事件,该事件在Android上的Firefox中对我有效。 您可以将事件处理程序绑定到
input
keyup
事件以实现向后兼容性,但在大多数现代浏览器中,这将同时触发以下两个事件:

$('#searchField').bind('input keyup', function(e){
    var searchValue = $(this).val();
    searchApi._executeAutocomplete(searchValue);
});
示例如下:

由于Android上的Firefox不会触发按键事件,但也会触发某种奇怪的输入事件(例如,如果你按下一个键,两个事件就会触发,如果你离开输入,它也会触发输入事件),我不得不写我自己的事件:

(function($){
var $event = $.event,
    $special = $event.special.fennecInput = {
        setup: function(){
            $(this).on('input',$special.handler);
        },
        teardown: function(){
            $(this).off('input',$spceial.handler);
        },
        handler: function(event) {
            var context = this,
                args = arguments,
                dispatch = function() {
                    event.type='fennecInput';
                    $event.dispatch.apply(context,args);
                };
            if($(context).val() != $(context).attr('data-fennecInput-oldval')){
                dispatch();
                $(context).attr('data-fennecInput-oldval',$(context).val());
            }
        }
    };
})(jQuery);

只有在发生改变值的输入事件时才会触发此事件,因此它不会执行不必要的事件。

您尝试过按键事件吗?请注意:@broading:我刚试过,但没什么不同。在寻找了两天的解决方案后,这对我来说终于奏效了
Keyup
在android上的chrome中运行良好,但要在Firefox中实现这一点,您必须添加
input
以及这里的一句警告:某些浏览器将执行您的事件处理程序两次并不一定是一件小事,尤其是在您触发Ajax请求时(如上面的示例中所示)因为这意味着冗余网络请求。我刚刚在Android 4.4.4.Chris上运行Nexus 5的Google Chrome中注意到了这个问题,这是一个有效点,因此如果绑定到这两个事件,您可能会检测到是否已经有AJAX调用在运行,并忽略第二次触发。对于autocomplete,我个人认为应该有一个短暂的延迟,这样你就不会每次击键都打电话了。伙计,你在调试了三个小时后救了我,你的答案来了…很好的答案有人知道为什么会发生这种情况吗?我的意思是桌面FF的表现与预期一致,Chrome在两个版本中都有,所以似乎只有移动FF有这个问题……嘿:)如果你能接受另一个答案就太好了,因为你的答案似乎是一个解决办法,而另一个答案解决了这个问题。@ChristianStrang:我还没有机会尝试它。这是我工作的一个公司项目,我已经有一段时间没做这个了。您是否在桌面浏览器中尝试过使用鼠标粘贴文本,这也是我的答案解决的一个潜在问题?setTimer解决方案的代码示例可在中找到:)