【问题标题】:antd Select turn off autocompleteantd 选择关闭自动完成
【发布时间】:2019-03-19 06:55:52
【问题描述】:

我正在尝试关闭 ant design Select 上的自动完成功能,但我尝试的任何方法都不起作用。这显然是有问题的,因为 chromes(此时仅测试了一个)自动完成功能完全覆盖了选择选项(下图)。

我在 React 中使用 antd,并且在 Select 标签和 Form 标签上都尝试了以下操作:

autoComplete="off" autoComplete="nope" autoComplete="business-state"

他们似乎都没有关闭它。

这是一个代码沙盒的链接,代码几乎相同,但问题是它没有重现相同的问题。出于某种原因,沙盒上完全相同的代码没有显示自动完成功能。我添加了一个电子邮件输入来显示以测试自动完成功能是否有效,并且确实有效。我不知道为什么这在沙盒中的工作方式与在我的服务器中的工作方式不同。

https://codesandbox.io/s/wovnzpl9xw

这是用户输入搜索选项时的样子

它应该是这样的(它只是在焦点上看起来像这样,但一旦用户键入 chrome 就会显示自动完成)

【问题讨论】:

    标签: reactjs autocomplete antd


    【解决方案1】:

    我已申请将autocomplete="none" 添加到Select 中,看起来不错。

    <Select
        showSearch
        optionFilterProp="children"
        onChange={onChange}
        onFocus={onFocus}
        onBlur={onBlur}
        onSearch={onSearchZipCode}
        filterOption={(input, option) => option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
        placeholder="Choose a City"
        autoComplete="none"
        // disabled={true}
    >
        {cities.map((city) => (
            <Select.Option key={city.id} value={city.id}>
                {city.name}
            </Select.Option>
        ))}
    </Select>;
    

    【讨论】:

      【解决方案2】:

      您也可以使用AutoComplete 而不是Select,因为这样可以更改底层Input

      <AutoComplete ... >
        <Input autoComplete='off' id='myId' />
      </AutoComplete>
      

      AutoComplete 是“新的”,旨在用于为输入获取数据而不是静态数据时使用,但本质上它只是 Select 的副本,并且可以以相同的方式使用。

      【讨论】:

      • Antd 没有在其文档中强调这一点,但这是使用 AutoComplete 时的方式。
      【解决方案3】:

      为我的问题找到了解决方案,感谢@trkaplan 为我指明了正确的方向。我猜这不是最优雅的解决方案,所以如果其他人有更好的方法来实现这一点,我会全力以赴。我基本上必须为Select 创建一个onFocus 方法,该方法抓取所有具有ant-select-search__field 类的元素循环并利用setAttributeautocomplete 属性更改为任意值以禁用它.

      onFocus={() => {
        if (!this.state.autocompleteDisabled) {
          let i;
          const el = document.getElementsByClassName(
            "ant-select-search__field"
          );
          for (i = 0; i < el.length; i++) {
            el[i].setAttribute(
              "autocomplete",
              "registration-select"
            );
          }
          this.setState({ autocompleteDisabled: true });
        }
      }}
      

      【讨论】:

      • 在我的例子中,我必须使用类名 - ant-select-selection-search-input从我的google地址填写,姓名,电话,地址...我在useEffect中使用了上面的代码,所以当我填写我的姓名时,地址没有填写。useEffect(() =&gt; { const el = document.getElementsByClassName("ant-select-selection-search-input"); for (let i = 0; i &lt; el.length; i++) { el[i].setAttribute("autocomplete", "registration-select"); } }, []);
      【解决方案4】:

      您必须将filterOption 设置为false

      this code sandbox

      【讨论】:

      • 我可能没有澄清这一点,但我确实希望用户能够过滤选项。使用 filterOption=false,用户不能再“跳转”到他们想要的状态,而是必须滚动 50 个选项才能到达他们想要的那个。此外,代码沙箱似乎可以自行纠正问题,因为我将完全相同的代码放入沙箱并注意到发生了,但我从我的站点运行它并且自动完成再次出现。
      • 哦,我错过了浏览器的原生自动完成列表。你能提供一个小提琴吗?因为这在我分享的例子中没有发生
      • 添加了沙箱,但由于某种原因无法使用相同的代码重现问题
      • Antd 在其 Select 元素后面使用了一个隐藏的输入。您的沙箱中未包含的某些 CSS 可能会导致此问题。
      • 你在暗示我应该/不应该有什么 css?不确定我是否理解。
      猜你喜欢
      • 2011-01-06
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 2010-12-17
      • 1970-01-01
      相关资源
      最近更新 更多