我以这个简单的HTML为例:

<div id="editable" contenteditable="true">
  text text text<br>
  text text text<br>
  text text text<br>
</div>
<button id="button">focus</button>

我想要简单的东西-当我点击按钮时,我想把插入符号(光标)放到可编辑div中的特定位置.从网上搜索,我有这个JS附加到按钮点击,但它不工作(FF,Chrome):

var range = document.createRange();
var myDiv = document.getElementById("editable");
range.setStart(myDiv, 5);
range.setEnd(myDiv, 5);

可以这样手动设置插入符号位置吗?

推荐答案

在大多数浏览器中,需要RangeSelection个对象.将每个 Select 边界指定为 node ,并在该 node 内指定偏移.例如,要将插入符号设置为第二行文本的第五个字符,请执行以下操作:

function setCaret() {
    var el = document.getElementById("editable")
    var range = document.createRange()
    var sel = window.getSelection()
    
    range.setStart(el.childNodes[2], 5)
    range.collapse(true)
    
    sel.removeAllRanges()
    sel.addRange(range)
}
<div id="editable" contenteditable="true">
  text text text<br>text text text<br>text text text<br>
</div>

<button id="button" onclick="setCaret()">focus</button>

IE<;9的工作原理完全不同.如果你需要支持这些浏览器,你需要不同的代码.

jsFdle示例:http://jsfiddle.net/timdown/vXnCM/

Javascript相关问答推荐

未使用Outlet渲染子组件

try 在addEventHandler内设置表单的文件输入.值=空

更改一组用户创建的项目的js排序标准

JavaScript文本区域阻止KeyDown/KeyUp事件本身上的Alt GR +键组合

if/else JavaScript中的条件行为

在Angular中将样式应用于innerHTML

如何修复我的js构建表每当我添加一个额外的列作为它的第一列?

屏幕右侧屏障上的产卵点""

Regex结果包含额外的match/group,只带一个返回

使用LocaleCompare()进行排序时,首先使用大写字母

在react JS中映射数组对象的嵌套数据

用于编辑CSS样式的Java脚本

使用POST请求时,Req.Body为空

ChartJs未呈现

Next.js服务器端组件请求,如何发送我的cookie token?

如何防止ionic 输入中的特殊字符.?

在表单集中保存更改时删除';禁用';

在JS/TS中将复杂图形转换为数组或其他数据 struct

Node.js错误: node 不可单击或不是元素

使用createBrowserRoutVS BrowserRouter的Reaction路由