最后,我认为我提出了一个不错的解决方案。更好地了解下拉菜单如何与 Chrome 一起使用有助于 :) 基本上,当您聚焦输入时,当您输入与 Chrome 内存中的内容匹配的条目时,当您生成鼠标按下事件时,将显示下拉菜单。请记住这一点,并且 Chrome 会在某些输入具有默认名称(例如“名称”、“电子邮件”等)时执行此操作。然后我们只需要在要显示下拉列表时删除名称并在之后将其添加回来:) 我想使用一个解决方案,它可以通过添加属性自动完成来使其工作。我认为这是有道理的。这是代码:
解决方案 1
jQuery('body').on('mousedown','[name="name"][autocomplete="off"], [name="email"][autocomplete="off"]',function(e){
e.stopImmediatePropagation();
if(typeof this.currentName =="undefined")
this.currentName=jQuery(this).attr('name');
jQuery(this).attr('name','');
});
jQuery('body').on('blur','[autocomplete="off"]',function(e){
e.stopImmediatePropagation();
jQuery(this).attr('name',this.currentName);
});
解决方案2(我最喜欢的一个)
我上面描述的解决方案将删除输入的名称,直到我们删除焦点(模糊),在那一刻它会放回原来的名称。但是可能会发生我们有兴趣在输入时通过其名称属性访问输入。这意味着我们需要在每次输入后立即放回名称。这个解决方案,基本上是基于第一个解决方案。在这种情况下,我们将在 key down 上添加名称,并将其放回 keyup。我认为这更适合与“自动完成关闭”行为的兼容性。无论如何,这是代码:
jQuery('body').on('mousedown keydown','[name="name"][autocomplete="off"], [name="email"][autocomplete="off"]',function(e){
e.stopImmediatePropagation();
if(typeof this.currentName =="undefined")
this.currentName=jQuery(this).attr('name');
jQuery(this).attr('name','');
});
jQuery('body').on('blur keyup','[autocomplete="off"]',function(e){
e.stopImmediatePropagation();
if(typeof this.currentName !="undefined")
jQuery(this).attr('name',this.currentName);
});
请注意,对于解决方案 1 和 2,我仅采用了输入名称为“名称”和“电子邮件”的情况。对于此属性使 Chrome 生成下拉列表的任何其他情况,您必须将其添加到鼠标按下事件的选择器中。
解决方案 3
这个解决方案更加混乱。我没有意识到我们试图纠正的行为只是基于那些具有特定名称的输入,如“姓名、电子邮件等”。该解决方案的方法是针对 Chrome 显示我们事先不知道的其他名称的情况。这将是一个非常通用的解决方案。我不像其他两个那样喜欢,主要是因为当我们按下删除键时可能会有一个小的闪烁。我将在下面解释。
我发现第二次单击输入后会出现下拉菜单,但当您第一次将注意力集中在输入上时,不会出现在第一次单击时。我为所有这些元素绑定了一个“mousedown”事件,其中处理程序基本上检测它是否已经集中在输入上,如果它检测到另一个“mouse down”,则强制 .blur() 然后 .focus() 之后,防止聚焦后第二次单击的下拉菜单。我希望很清楚,以防万一这是我使用的代码:
jQuery('body').on('mousedown','[autocomplete="off"]',function(e){
e.stopImmediatePropagation();
if(jQuery(this).is(':focus')) {
jQuery(this).blur();
jQuery(this).focus();
}
});
另一方面,为了防止您在输入时出现下拉菜单,以防它与 Chrome 建议匹配……这有点棘手。我只是决定在用户键入时替换输入的默认行为。下拉列表评估鼠标按下时的输入,因此我阻止了字母数字、空格等的默认行为。唯一的问题是命令、Ctrl 和删除。对于这种情况,我还必须在鼠标上绑定一个事件。它允许前两种情况下的默认行为,因此您可以进行复制、粘贴或全选。在删除的情况下,我必须允许默认行为,但如果在删除字符后输入与 Chrome 建议匹配,那么它再次显示下拉菜单。对于这种情况,我不得不使用相同的模糊和聚焦技巧。我发现的唯一不便之处是,由于我们取消了 keyup 上的行为,并且 chrome 尝试在 keydown 上显示它,所以会有一点闪烁。无论如何,这是我能做的最好的了。可能需要在某一时刻过滤字符。我只是添加了现在更有意义的条件。这是代码的第二部分:
jQuery('body').on('keydown','[autocomplete="off"]',function(e){
e.stopImmediatePropagation();
var ctrlKey = 17,cmKey = 91;
var charCode = e.which || e.keyCode;
if(charCode!=16 && this.commandDown != true && this.ctrlDown != true && ((charCode>47 && charCode<58)||(charCode>64 && charCode<91)||(charCode>96 && charCode<123)||charCode==0 || charCode==32)){
e.preventDefault();
var charStr = String.fromCharCode(charCode);
if(!e.shiftKey)
charStr = charStr.toLowerCase(charStr);
$(this).val($(this).val() + charStr);
}else{
if (charCode == cmKey) this.commandDown = true;
if (charCode == ctrlKey) this.ctrlDown = true;
}
});
jQuery('body').on('keyup','[autocomplete="off"]',function(e){
e.stopImmediatePropagation();
var allowed=[8];//Delete
var ctrlKey = 17,cmKey = 91;
var charCode = e.which || e.keyCode;
if (charCode == cmKey) {this.commandDown = false};
if (charCode == ctrlKey) {this.ctrlDown = false};
if(allowed.indexOf(charCode)>=0 || (this.commandDown!=false && this.ctrlDown!=false)){
jQuery(this).blur();
jQuery(this).focus();
}
正如我所说,这个解决方案更加混乱。这是我使用的第一个,直到我意识到某些输入名称才出现下拉列表。
抱歉写了这么多,我只是想确保一切都清楚。我希望它有所帮助。