我正在开发一个 javascript 库,该库以像素为单位获取用户选择的位置(他们突出显示的内容)。
为了实现这一点,我向 DOM 添加了不可见的标记并使用 jQuery.position
来获取像素位置。这些 DOM 更改会导致用户选择丢失,因此我需要以编程方式重新创建它。
我使用rangy库来处理跨浏览器的范围和选择。
这是有效的,但是有一个错误一直困扰着我好几天,我似乎无法破解。重新创建选择后,如果用户Shift按住Left或Right,则选择不会在 Chrome 中正确增长和缩小。
小提琴显示问题:http: //jsfiddle.net/dvQ4g/3/
用鼠标从左到右突出显示“This is some text”的一部分。
现在,如果您Shift+Right选择按预期从右侧扩展。
但是,如果您Shift+ Left,则选择不会像预期的那样从右侧缩小。相反,它从左侧生长。
(注意...如果您按下Shift+Left一次,它也会更改突出显示方向,因此您需要重新选择才能看到从右侧扩展再次正常工作。)
这发生在 Chrome 中,但不是 Firefox 或 Safari。
我想我已经知道为什么了。Chrome 不会强制执行方向,除非您明确表示它是向后的。否则,它会等着看用户先做什么。如果他们Shift+ Right,它将成为一个前向选择。如果他们Shift+ Left,它将成为向后选择。因此,在 Chrome 中,以编程方式创建转发选择实际上根本不是转发……它是一个等待方向的选择。
但是知道了这一点,我该怎么做呢?我认为我需要用一种不会导致选择丢失的方法来找到选择边界。这种方法有什么想法吗?