如何使用webkit浏览器在一个范围内选择一个节点



我目前正在开发所见即所得的解决方案,需要一个函数来正确选择一个范围内的节点(我指的是节点本身,而不仅仅是它的内容)

DOM lvl2显然有一个w3.org/range的函数,并定义了

range.selectNodeContents() // Select the contents within a node

range.selectNode() //Select a node and its contents

问题是,当selectNode()与Firefox甚至ie9完美配合时,似乎不可能与任何Webkit浏览器(最终是Chrome和Safari)实现。在Webkit上,selectNodeContents()和selectNode()都只选择节点内容(根据规范,这似乎是一个错误)

为了让它发挥作用,我尝试通过使用
来模拟selectNode()目标range.setStartBefore(node);
range.setEndAfter(node);

但结果仍然是一样的,它在任何地方都可以工作(当然是>8),但在webkit浏览器上不可以。。

如果你想试试,我做了一个小jsfiddle,你可以在这里玩(只需打开控制台并查看控制台。警告结果与webkit上的不同:/)

我搜索了很多,但找不到在webkit浏览器上真正选择完整节点的方法。奇迹般的是,你们中的一些人会知道一种方法吗,甚至只知道继续我的探索的任何技巧吗?:/

ps:我知道"rangy"lib,但我不能在我的项目中使用它,从我在源代码中读到的内容来看,我甚至不确定他们是否处理过这个问题:/

问题不在于selectNode(),它在WebKit中运行良好,而在于WebKit的选择对象,它篡改范围以符合自己(并非总是不合理的)关于选择边界和插入符号位置的想法

  • https://bugs.webkit.org/show_bug.cgi?id=23189
  • https://bugs.webkit.org/show_bug.cgi?id=15256

你是对的,Rangy没有处理这个问题,而是更喜欢反映浏览器原生选择的现实。假装选择不同会很快导致奇怪的行为。

最新更新