Google的自动填充功能未通过鼠标粘贴激活

时间:2012-11-10 20:15:15

标签: autocomplete mouse paste

Google autocomplete API似乎没有通过鼠标将内容粘贴到文本输入中来激活。如果完全涉及键盘,它可以正常工作,但不能只用鼠标。

然而,我注意到,在将内容粘贴到文本输入后,它几乎可以从任何按键激活(经过测试的右箭头键,结束键,空格)。

您可以在autocomplete demo网站上重播。

这是一个错误吗?还是按照设计?如果按照设计,如何应用变通方法? 到目前为止,我已将此作为一种解决方法,但似乎没有模拟按键事件。

$('.txtLocation').bind("paste", function (e)
{
    $('.txtLocation').focus();
    var e = jQuery.Event("keydown");
    e.keyCode = 39; //39=Arrow Right
    $('.txtLocation').trigger(e);
});

2 个答案:

答案 0 :(得分:6)

这似乎不仅会影响上下文菜单的粘贴,还会影响浏览器菜单栏中的编辑|粘贴以及iOS粘贴功能。我打开了bug with Google。您可能希望“明星”该错误报告以捕获更新。

我找到了一个解决方法,虽然有点黑客,但似乎解决了这个问题。如果存储粘贴的值,请将焦点切换到其他字段,在“自动填充”字段中设置值,最后重点关注“自动填充”字段,可以按预期方式工作。此外,您必须在setTimeout()回调中执行此操作 - 延迟时间似乎根本不重要,但如果您只是内联执行,则无法看到预期结果。

以下是我上面描述的代码示例:

$("#address_field").on("paste", googleMapsAutocompletePasteBugFix);

googleMapsAutocompletePasteBugFix = function() {
    return setTimeout(function() {
        var field, val;
        field = $("#address_field");
        val = field.val();
        $("#price").focus();
        field.val(val);
        return field.focus();
    }, 1);
};

最后一个focus()是可选的,但是如果你只是自动跳到下一个字段,那么UI就不那么令人惊讶了。

答案 1 :(得分:0)

以下解决方案似乎对我有用(存在以&#34结尾的字段;地址_2和#34;假设)。在IE8,IE9,IE10,Chrome,FF和Safari上进行了测试

if document.addEventListener
      $(document).on("paste", "[name*=address_1]", @googleMapsAutocompletePasteBugFix)
      $(document).on("onpaste", "[name*=address_1]", @googleMapsAutocompletePasteBugFix)
    else
      for element in $("input[name*=address_1]")
        document.getElementById($(element).attr('id')).onpaste = @googleMapsAutocompletePasteBugFix

  googleMapsAutocompletePasteBugFix: (e) ->
    unless e
      e = window.event

    if e.srcElement
      target = e.srcElement
    else
      target = e.target

    field = $(target)
    fieldId = field.attr('id')
    focusSwitchFieldId = fieldId.replace(/(\d)$/, '2')

    setTimeout(->
      if window.chrome || /Safari/.test(navigator.userAgent)
        val = field.val()
        $("##{focusSwitchFieldId}").focus()
        field.val(val)
        field.focus()
      else
        field = document.getElementById(fieldId)
        val = field.value
        document.getElementById(focusSwitchFieldId).focus()
        setTimeout(->
          field.value = val
          field.focus()
          field.focus()
        , 50)
    , 10)