【问题标题】:Google Places overwrite autocomplete offGoogle 地方信息覆盖自动完成关闭
【发布时间】:2020-01-09 11:47:14
【问题描述】:

我在我的网站上输入地址时使用 Google Places API:

<input type="text" name="street[]" id="street1" autocomplete="none" />

但是,一旦加载了 Google 地方信息,它就会将我的 autocomplete="none" 替换为 autocomplete="off"。问题是谷歌浏览器与“关闭”值不兼容并继续显示自动填充建议。 有没有办法解决这个问题?

谢谢!

【问题讨论】:

    标签: javascript google-places-api google-apps google-places


    【解决方案1】:

    您可以检测 Google 地方信息何时设置 autocomplete="off" 并以这种方式覆盖它:

    const observer = new MutationObserver(function (mutationsList, observer) {
        for (const mutation of mutationsList) {
            if (mutation.attributeName == 'autocomplete' && $(mutation.target).attr('autocomplete') == 'off') {
                observer.disconnect();
                $(mutation.target).attr('autocomplete', 'none');
            }
        }
    });
    
    observer.observe(document.getElementById('street1'), { attributes: true });
    
    autocomplete = new google.maps.places.Autocomplete(document.getElementById('street1'), {
        fields: ['address_components'],
        types: ['address'],
    });
    

    【讨论】:

      【解决方案2】:

      这是一种适用于所有浏览器的方法:

      TL;DR

      将您的输入字段名称和字段 ID 重命名为不相关的名称,例如 'data_input_field_1'。然后将&amp;#8204; 字符添加到标签中间。这是一个非打印字符,因此您不会看到它,但它会诱使浏览器不将该字段识别为需要自动完成的字段,因此不会显示内置的自动完成小部件!

      细节

      几乎所有浏览器都使用字段名称、ID、占位符和标签的组合来确定该字段是否属于可以从自动完成中受益的一组地址字段。因此,如果您有一个像&lt;input type="text" id="address" name="street_address"&gt; 这样的字段,几乎所有浏览器都会将该字段解释为地址字段。因此,浏览器将显示其内置的自动完成小部件。梦想是使用属性autocomplete="off" 会起作用,不幸的是,现在大多数浏览器都不服从这个请求。

      所以我们需要使用一些技巧来让浏览器不显示内置的自动完成小部件。我们将这样做的方法是欺骗浏览器,使其相信该字段根本不是地址字段。

      首先将 idname 属性重命名为不会泄露您正在处理与地址相关的数据的内容。所以不要使用&lt;input type="text" id="city-input" name="city"&gt;,而是使用类似的东西&lt;input type="text" id="input-field-3" name="data_input_field_3"&gt;。浏览器不知道 data_input_field_3 代表什么。但你知道。

      如果可能,请不要使用 占位符文本,因为大多数浏览器也会考虑到这一点。如果您必须使用占位符文本,那么您必须发挥创意并确保您没有使用任何与地址参数本身相关的词语(例如City)。使用 Enter location 之类的东西可以解决问题。

      最后一个参数是附加到字段的标签。但是,如果您像我一样,您可能希望保持标签完好无损并向您的用户显示可识别的字段,例如“地址”、“城市”、“州”、“国家”。好吧,好消息:你可以!实现这一点的最佳方法是插入一个零宽度非连接字符&amp;#8204; 作为标签中的第二个字符。所以用&lt;label&gt;C&amp;#8204;ity&lt;/label&gt;替换&lt;label&gt;City&lt;/label&gt;。这是一个非打印字符,因此您的用户会看到 City,但浏览器会被欺骗看到 C ity 而无法识别该字段!

      任务完成!如果一切顺利,浏览器不应再在这些字段上显示内置地址自动完成小部件!

      希望这对您的努力有所帮助!

      【讨论】:

        【解决方案3】:

        此问题之前在 Google 的公共问题跟踪器中报告过:https://issuetracker.google.com/issues/73783829。您仍然可以对其进行评论和加注星标以接收更新并提高知名度。

        在此期间,您可以尝试这些相关帖子中的建议:

        Chrome Autofill covers Autocomplete for Google Maps API v3

        Stop Google chrome auto fill the input

        希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 2012-10-25
          • 2015-07-17
          • 2019-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-26
          • 1970-01-01
          • 2018-06-27
          相关资源
          最近更新 更多