Microsoft Edge上的SelectionStart属性问题

时间:2016-09-13 10:52:47

标签: javascript css angularjs microsoft-edge

我正在将angularJS文本插入器实现到文本区域,该文本区域将指定文本插入文本区域中光标的位置。经过一段谷歌搜索,我在网上找到了这个例子。

指令的主体在这里

app.directive('myText', ['$rootScope', function($rootScope) {
  return {
    link: function(scope, element, attrs) {
      $rootScope.$on('add', function(e, val) {
        var domElement = element[0];

        if (document.selection) {
          domElement.focus();
          var sel = document.selection.createRange();
          sel.text = val;
          domElement.focus();
        } else if (domElement.selectionStart || domElement.selectionStart === 0) {
          var startPos = domElement.selectionStart;
          var endPos = domElement.selectionEnd;
          var scrollTop = domElement.scrollTop;
          domElement.value = domElement.value.substring(0, startPos) + val + domElement.value.substring(endPos, domElement.value.length);
          domElement.focus();
          domElement.selectionStart = startPos + val.length;
          domElement.selectionEnd = startPos + val.length;
          domElement.scrollTop = scrollTop;
        } else {
          domElement.value += val;
          domElement.focus();
        }

      });
    }
  }
}])

可在此处找到一个工作示例http://plnkr.co/edit/f496Mh?p=preview

除了Microsoft Edge之外,它在所有浏览器上都能正常工作,它忽略了光标的位置,并将selectionStart和End属性设置回0。

我已经调查了这个问题,并发现如果我将div“添加”更改为一个按钮,它将在Edge中按预期工作,但更愿意能够使用div,如果完全可行的话。

我在这里遗漏了什么,或者这是浏览器的错误?

1 个答案:

答案 0 :(得分:4)

Edge需要在使用focus()selectionStart之前设置selectionEnd

其他浏览器似乎从所使用元素的上下文中获取焦点。我在浏览器中使用JS时遇到过这个问题,之前没有使用过Angular,但问题似乎在两者中都很常见。

以下修改后的代码适用于Plunker。

app.directive('myText', ['$rootScope', function($rootScope) {
  return {
    link: function(scope, element, attrs) {
      $rootScope.$on('add', function(e, val) {
        var domElement = element[0];

        if (document.selection) {
          domElement.focus();
          var sel = document.selection.createRange();
          sel.text = val;
          domElement.focus();
        } else if (domElement.selectionStart || domElement.selectionStart === 0) {
          domElement.focus();
          var startPos = domElement.selectionStart;
          var endPos = domElement.selectionEnd;
          var scrollTop = domElement.scrollTop;
          domElement.value = domElement.value.substring(0, startPos) + val + domElement.value.substring(endPos, domElement.value.length);
          domElement.selectionStart = startPos + val.length;
          domElement.selectionEnd = startPos + val.length;
          domElement.scrollTop = scrollTop;
        } else {
          domElement.value += val;
          domElement.focus();
        }

      });
    }
  }
}])

如果有人对非Angular版本感兴趣,以下是我使用的内容。代码由一个按钮调用,其中textareaElement可以选择文本:

var el= document.getElementById('textareaElement');
var selectionStart = el.selectionStart;
var selectionEnd = el.selectionEnd ;
//selectionStart and selectionEnd are always 0 in Edge


var el= document.getElementById('textareaElement');
el.focus();
var selectionStart = el.selectionStart;
var selectionEnd = el.selectionEnd;
//selectionStart and selectionEnd are where textareaElement's selected text start and end in Edge (and other browsers)