代码之家  ›  专栏  ›  技术社区  ›  Max Mazur

反应-Internet explorer 11输入在第一次更改后失去焦点

  •  1
  • Max Mazur  · 技术社区  · 6 年前

    我遇到了一个很奇怪的问题,我无法理解。 我目前正在使用react 16.3和Antd 3.11框架创建react应用程序,我已经创建了一个表,在它的头列中呈现了一个附加了onChange事件的组件。

    当我第一次集中输入时,问题就来了。

    我失去了对第一个关键事件的关注,然后当我再次单击该字段时,它将保持关注,直到我单击其他内容。

    下面是我一直使用的示例: https://ant.design/components/table/

    以及随后的代码。

    import {
      Table, Input, Button, Icon,
    } from 'antd';
    
    const data = [{
      key: '1',
      name: 'John Brown',
      age: 32,
      address: 'New York No. 1 Lake Park',
    }, {
      key: '2',
      name: 'Joe Black',
      age: 42,
      address: 'London No. 1 Lake Park',
    }, {
      key: '3',
      name: 'Jim Green',
      age: 32,
      address: 'Sidney No. 1 Lake Park',
    }, {
      key: '4',
      name: 'Jim Red',
      age: 32,
      address: 'London No. 2 Lake Park',
    }];
    
    class App extends React.Component {
      state = {
        searchText: '',
      };
    
      handleSearch = (selectedKeys, confirm) => () => {
        confirm();
        this.setState({ searchText: selectedKeys[0] });
      }
    
      handleReset = clearFilters => () => {
        clearFilters();
        this.setState({ searchText: '' });
      }
    
      render() {
        const columns = [{
          title: 'Name',
          dataIndex: 'name',
          key: 'name',
          filterDropdown: ({
            setSelectedKeys, selectedKeys, confirm, clearFilters,
          }) => (
            <div className="custom-filter-dropdown">
              <Input
                ref={ele => this.searchInput = ele}
                placeholder="Search name"
                value={selectedKeys[0]}
                onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}
                onPressEnter={this.handleSearch(selectedKeys, confirm)}
              />
              <Button type="primary" onClick={this.handleSearch(selectedKeys, confirm)}>Search</Button>
              <Button onClick={this.handleReset(clearFilters)}>Reset</Button>
            </div>
          ),
          filterIcon: filtered => <Icon type="smile-o" style={{ color: filtered ? '#108ee9' : '#aaa' }} />,
          onFilter: (value, record) => record.name.toLowerCase().includes(value.toLowerCase()),
          onFilterDropdownVisibleChange: (visible) => {
            if (visible) {
              setTimeout(() => {
                this.searchInput.focus();
              });
            }
          },
          render: (text) => {
            const { searchText } = this.state;
            return searchText ? (
              <span>
                {text.split(new RegExp(`(${searchText})`, 'gi')).map((fragment, i) => (
                  fragment.toLowerCase() === searchText.toLowerCase()
                    ? <span key={i} className="highlight">{fragment}</span> : fragment // eslint-disable-line
                ))}
              </span>
            ) : text;
          },
        }, {
          title: 'Age',
          dataIndex: 'age',
          key: 'age',
        }, {
          title: 'Address',
          dataIndex: 'address',
          key: 'address',
          filters: [{
            text: 'London',
            value: 'London',
          }, {
            text: 'New York',
            value: 'New York',
          }],
          onFilter: (value, record) => record.address.indexOf(value) === 0,
        }];
        return <Table columns={columns} dataSource={data} />;
      }
    }
    
    ReactDOM.render(<App />, mountNode);
    

    以及随后的css:

    .custom-filter-dropdown {
      padding: 8px;
      border-radius: 6px;
      background: #fff;
      box-shadow: 0 1px 6px rgba(0, 0, 0, .2);
    }
    
    .custom-filter-dropdown input {
      width: 130px;
      margin-right: 8px;
    }
    
    .custom-filter-dropdown button {
      margin-right: 8px;
    }
    
    .highlight {
      color: #f50;
    }
    

    快速总结我已经理解的事情。

    • 这张桌子重新放上了过滤器下降道具 按键。
    • 表所在的类组件不重新提交或 触发器(componentDidUpdate)
    • 这在Chrome、FireFox、Edge中非常有效,示例在 IE11在antds网站上。但是在我的应用程序中没有。
    • 在我自己的组件中呈现的所有antd字段和常规字段在任何浏览器中都不存在此问题。
    • 在render函数之外渲染输入组件不会 工作,因为不是我的组件重新提交,而是表组件触发自己的更新事件
    • 我还尝试将-ms user select:设置更改为不同的属性,以查看是否有影响的天气。事实上这只会让事情变得更糟。
    • 我试图将输入值设置为状态值以使其成为受控组件,但是当componentDidUpdate触发器和我编程设置时,它会将caretIndex lenght-1设置为焦点,而不是设置在文本后面。(我已手动尝试重写selectionStart和SelectionEnd,但没有成功)

    我有点想不通了,因为我已经了解到其他组件正在窃取我输入框的焦点,但是即使我使用了 几乎所有我能想到的方法和生命周期事件中的document.activeElement。所有事件都指向具有焦点的“a”输入字段(不确定这是创建的旧字段还是新字段,但我认为它是旧字段)。

    我已经尽力解释了我的情况,我希望世界上有人遇到了类似的问题。

    更新 : antd合理地改变了他们的表组件,所以这个例子在网页上有点不同,但是问题仍然是一样的。

    0 回复  |  直到 6 年前
        1
  •  1
  •   user11543486    6 年前

    我在IE11上也有同样的行为。

    可以在输入字段上添加一个onBlur来修复它,它只是将焦点设置为currentTarget。

    onBlurHandler = (e: React.FocusEvent<HTMLInputElement>) => {
        e.currentTarget.focus();
    };