[React] contentEditable在Firefox的兼容问题,光标自动跳到前面

问题

通过contentEditable修改内容HTML内容,Chrome修改是正常,但是在Firefox中,每次修改光标都会自动的跳到输入内容的前面。

解决方案

修改Div的修改方法,把onInput改为用onChang和onBlur。

import { useState } from 'react';

function MyComponent() {
  const handleInputChange = (event) => {业务逻辑};

  return (
    <div>
      <div
	suppressContentEditableWarning="true"
	contentEditable="true"
	onInput={handleInputChange} # 不能用这个方式,因为这种方式会触发组件渲染
	onChang={handleInputChange} # 用这种,因为onChange会拦截组件渲染,可以避开Firefox和Chrome对渲染实现不同造成的问题
	onBlur={handleInputChange} # 如果onChang方法因为没有渲染无法拿到值,可以用失去焦点来获取值
	>
	输入的内容
      </div>
    </div>
  );
}

export default MyComponent;

解决思路

其实问题症结在Firefox和Chrome对渲染实现不同造成。所以思路就是通过onChang避开渲染,onBlur设置结果。我这种场景只需要保证结果最终一致即可,不需要考虑渲染问题。

后话:如果这种方式不能解决你的问题,可以考虑使用控制输入行为,例如在输入之后将光标强制设到后面,下面代码没试过可能有误。

function keepLastIndex(obj) {
    var range = window.getSelection();//创建range
    range.selectAllChildren(obj);//range 选择obj下所有子内容
    range.collapseToEnd();//光标移至最后
}
posted @ 2024-06-19 11:50  keivnyau  阅读(0)  评论(0编辑  收藏  举报