【问题标题】:Detect direction of user selection with javascript用javascript检测用户选择的方向
【发布时间】:2012-02-29 03:01:13
【问题描述】:

我在我的项目中使用自定义插入符号模拟文本编辑器,但本机选择。有什么方法可以检测用户选择文本的方向吗?可以说,该用户选择了文本“hello world”。有两种可能性,他可以从在字母“d”上单击鼠标开始并在字母“h”上结束,或者他可以从字母“h”开始并在字母“d”上结束。有什么简单的方法可以区分这两种情况吗?谢谢。

【问题讨论】:

  • 我认为选择对象不够聪明。您必须记录鼠标单击的位置并自行解决。
  • @Diodeus 将其作为答案,以便他接受。并且 (at)OP 尝试通过使用默认值并添加鼠标位置计算来为这些操作添加自定义设置器和获取器。

标签: javascript web-applications


【解决方案1】:

我试图找到一个适合我几天的解决方案。这是我想出的,这将适用于单范围选择:

var selection = window.getSelection();
var range = selection.getRangeAt(0);
var isSelectionDown = selection.focusNode === range.endContainer;
var isSelectionUp = selection.focusNode === range.startContainer;

选择的焦点节点始终是用户释放鼠标的位置,但范围结束和开始容器会根据方向而变化。

【讨论】:

  • 如果选择跨越多个节点,则仅适用。如果不是问题,则可以简化为:var isReverse = selection.anchorNode !== selection.getRangeAt(0).startContainer;
【解决方案2】:

老问题,但我想我会添加一个更简单的解决方案:

var sel = getSelection(),
position = sel.anchorNode.compareDocumentPosition(sel.focusNode),
backward = false;
// position == 0 if nodes are the same
if (!position && sel.anchorOffset > sel.focusOffset || 
  position === Node.DOCUMENT_POSITION_PRECEDING)
  backward = true; 

Node.compareDocumentPosition (MDN)

【讨论】:

    【解决方案3】:

    这应该可行:

    function isBackwards(sel) {
      var rg = document.createRange();
      rg.setStart(sel.anchorNode, sel.anchorOffset);
      rg.setEnd(sel.focusNode, sel.focusOffset);
      return !rg.toString();
    }
    

    注意:如果您只允许选择换行符和空格,则需要修改上述函数,因为在这种情况下,无论如何它都会返回 true

    【讨论】:

    • 不要在单个文本节点中工作。仅当开始和结束节点不相同时才有效。
    【解决方案4】:

    跟踪mousedown X offset,然后是mouseup X offset,结果显示方向:(使用jQuery)

    var textSelectionDirection = (function(){
        var direction = '', mouseDownOffset = null;
    
        function getDirection(e){
            if( e.type == 'mousedown' )
                mouseDownOffset = e.clientX;
            else if( e.type == 'mouseup' ){
                direction = e.clientX < mouseDownOffset ? 'left' : 'right';
                console.log(direction);
            }
        }
    
        return getDirection
    })();
    
    $(document).on('mousedown mouseup', textSelectionDirection);
    

    演示http://jsfiddle.net/ffumv/

    【讨论】:

    • 目前仅适用于鼠标选择,不适用于键盘
    【解决方案5】:

    据我所知,没有 JavaScript 原生的属性或事件可以告诉您方向。 This site 详细介绍了如何跟踪鼠标方向,您可以根据需要进行调整。

    基本上,只要您可以检索鼠标位置(使用loc.pageX 或Y,或event.clientX 或Y),您就可以编写自己的函数来根据位置和时间跟踪方向。

    在您的情况下,您可能只想在用户“选择”文本时捕获它,即在 mousedown 事件中。

    【讨论】:

    • 谢谢你,我很害怕,我必须这样做:)
    • @TimDown 当然有可能,我提供的链接有一种方法。只是没有提供给您的 native 函数/属性(例如 window.mouseDirection);您需要编写自定义代码,就像在您的示例中一样。
    猜你喜欢
    • 2017-09-11
    • 2021-04-06
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多