【问题标题】:Why Range.getBoundingClientRect() returns 0 for range inside textarea?为什么 Range.getBoundingClientRect() 为 textarea 内的范围返回 0?
【发布时间】:2017-10-01 20:08:22
【问题描述】:

我有 <textarea> 元素并在其中创建范围:

  • 通过document.createRange() 创建新范围
  • 通过textarea.childNodes[0]获取<textarea>的唯一子节点
  • 通过range.setStartrange.setEnd 设置范围开始和范围结束

然后我打电话给range.getBoundingClientRect()

let textarea = document.querySelector('textarea');
let node = textarea.childNodes[0];

let range = document.createRange();
range.setStart(node, 3);
range.setEnd(node, 5);
console.log(range.getBoundingClientRect());
<textarea>aa bb cc</textarea>

但是我收到了带有所有零字段的ClientRect 对象,即left = top = width = height = 0。为什么这些字段是零?


请注意,如果我将 <textarea> 替换为通常的 div,则一切正常:

let textarea = document.querySelector('div');
let node = textarea.childNodes[0];

let range = document.createRange();
range.setStart(node, 3);
range.setEnd(node, 5);
console.log(range.getBoundingClientRect());
<div>aa bb cc</div>

【问题讨论】:

    标签: javascript html css range getboundingclientrect


    【解决方案1】:

    <textarea>replacement element

    使用 CSS 内容属性插入的对象被匿名替换 元素。它们是“匿名的”,因为它们不存在于 HTML 中 标记。

    【讨论】:

    • 感谢您的回答,但是为什么如果我将
    • <textarea>replacement element“使用 CSS 内容属性插入的对象是匿名替换元素。它们是“匿名的”,因为它们不存在于 HTML 标记中。”
    • 谢谢。所以,没有简单的方法来修改我的代码,以便它为 textarea 返回非零?
    • 您可以使用带有contentEditiable 属性集的<div> 元素
    • 这似乎不准确? <textarea> 在该页面的任何地方都没有提到,它与任何提到的元素都没有任何相似之处,也与 CSS content 没有任何关系。事实上,<textarea> 内容作为文本节点直接包含在文档中,可以像文档的任何其他部分一样进行查询和选择。如果有什么原因,那就不是了。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签