7

歌自动完成 API似乎没有通过使用鼠标将内容粘贴到文本输入中来激活。如果完全涉及键盘,它就可以正常工作,但不仅仅是鼠标。

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

你可以在他们的自动完成演示网站上复制它。

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

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

2 回答 2

6

这似乎不仅影响上下文菜单粘贴,还影响浏览器菜单栏中的编辑|粘贴以及 iOS 粘贴功能。我用 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 不会那么令人惊讶。

于 2012-12-07T17:54:45.753 回答
0

以下解决方案似乎对我有用(假设存在以“address_2”结尾的字段)。在 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)
于 2014-04-25T08:47:34.907 回答