Javascript 为什么';t text area.selections在ie上开始工作?

Javascript 为什么';t text area.selections在ie上开始工作?,javascript,jquery,internet-explorer,javascript-events,Javascript,Jquery,Internet Explorer,Javascript Events,这已经到了绝对令人沮丧的地步。我们正在尝试编写一些js,它将在与textarea关联的文本中的特定位置插入文本。看起来应该很简单,但到目前为止我们还没有弄明白 使我们的过程复杂化的是,我们有一个浮动菜单,您可以从中选择要插入的内容。所以顺序是: 定位到文本区域中所需的插入位置。visual studio调试器使用调试器断点指示textarea对象已将selectionStart和selectionEnd定义为具有正确值的数字。如果在这段时间,你尝试编写访问selectionStart和sele

这已经到了绝对令人沮丧的地步。我们正在尝试编写一些js,它将在与textarea关联的文本中的特定位置插入文本。看起来应该很简单,但到目前为止我们还没有弄明白

使我们的过程复杂化的是,我们有一个浮动菜单,您可以从中选择要插入的内容。所以顺序是:

  • 定位到文本区域中所需的插入位置。visual studio调试器使用调试器断点指示textarea对象已将selectionStart和selectionEnd定义为具有正确值的数字。如果在这段时间,你尝试编写访问selectionStart和selectionEnd的js,但是没有定义(这没有意义,但是这里有很多帖子说其他人都有相同的问题)

  • 现在我们定位到浮动菜单,它只不过是表上的一个div包装器,其中td元素调用一个函数来插入文本)。如果我们准确地单击td元素,文本将被插入到它所属的位置。如果在任何时候单击td元素外部但在菜单内部,文档选择将重置为文本区域的开头,并插入错误的位置

  • 我们已经尝试捕获与菜单相关联的onclick事件链,没有明显的事情会导致文档选择发生变化,但它仍然起到了作用

  • 我们已经尝试了多种解决方法,在textarea本身上单击一次,并记住textarea的当前范围,但这总是在缓冲区的前面结束

简单地说:为什么createTextRange和DocumentSelection在ie上的行为不合理,解决方法是什么


jquery是如何解决这个问题的,因为关于这个问题的帖子最常见的答案似乎是使用jquery

function insertAtCaret ( areaId, text ) {
    var txtarea = document.getElementById(areaId),
        scrollPos = txtarea.scrollTop,
        strPos = 0,
        range, front, back,
        br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ? 
        "ff" : (document.selection ? "ie" : false ) );
    if (br == "ie") { 
        txtarea.focus();
        range = document.selection.createRange();
        range.moveStart ('character', -txtarea.value.length);
        strPos = range.text.length;
    }
    else if (br == "ff") strPos = txtarea.selectionStart;

    front = (txtarea.value).substring(0,strPos);  
    back = (txtarea.value).substring(strPos,txtarea.value.length); 
    txtarea.value=front+text+back;
    strPos = strPos + text.length;
    if (br == "ie") { 
        txtarea.focus();
        range = document.selection.createRange();
        range.moveStart ('character', -txtarea.value.length);
        range.moveStart ('character', strPos);
        range.moveEnd ('character', 0);
        range.select();
    }
    else if (br == "ff") {
        txtarea.selectionStart = strPos;
        txtarea.selectionEnd = strPos;
        txtarea.focus();
    }
    txtarea.scrollTop = scrollPos;
};

我最初是从这里的答案中得到的。这里有一个插入插入符号的方法

function insertAtCaret ( areaId, text ) {
    var txtarea = document.getElementById(areaId),
        scrollPos = txtarea.scrollTop,
        strPos = 0,
        range, front, back,
        br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ? 
        "ff" : (document.selection ? "ie" : false ) );
    if (br == "ie") { 
        txtarea.focus();
        range = document.selection.createRange();
        range.moveStart ('character', -txtarea.value.length);
        strPos = range.text.length;
    }
    else if (br == "ff") strPos = txtarea.selectionStart;

    front = (txtarea.value).substring(0,strPos);  
    back = (txtarea.value).substring(strPos,txtarea.value.length); 
    txtarea.value=front+text+back;
    strPos = strPos + text.length;
    if (br == "ie") { 
        txtarea.focus();
        range = document.selection.createRange();
        range.moveStart ('character', -txtarea.value.length);
        range.moveStart ('character', strPos);
        range.moveEnd ('character', 0);
        range.select();
    }
    else if (br == "ff") {
        txtarea.selectionStart = strPos;
        txtarea.selectionEnd = strPos;
        txtarea.focus();
    }
    txtarea.scrollTop = scrollPos;
};

我最初是从这里的一个答案中得到的。

您可以通过阅读jQuery的来源:我对与范围/选择相关的所有内容的罐装推荐来检查jQuery是如何做到的:。您可以通过阅读jQuery的来源:我对与范围/选择相关的所有内容的罐装推荐来检查jQuery是如何做到的:。我试过了,而且总是这样从文本区域的末尾插入1个字符,这使我相信在设置插入点和插入文本之间,文档选择正在发生变化。在使用此方法之前,您是否在文本区域中修改文本?您是对的,它在IE中无法100%工作,对我来说,它不是插入插入符号的位置,通常在文本区域的下方。我尝试过,它总是在文本区域的末尾插入1个字符,这让我相信在设置插入点和插入文本之间,文档选择正在发生变化。在使用此方法之前,您是否在文本区域中修改文本?您是对的,在IE中,它不是100%工作,对我来说,它不是插入插入符号的位置,通常是在文本区域的较低位置。