3

我有一个场景,我需要将光标放在文本区域上,然后单击同一页面上的树视图节点,以便在单击树节点之前将节点的文本选择到我放置光标的文本区域中。

我得到了很多关于堆栈溢出的答案,包括以下内容,

如果光标放置,则在光标位置的文本区域中插入文本,否则文本应最后附加在 IE 中

在文本区域中的光标位置之后插入文本

使用 jQuery 将文本插入 textarea

如何在文本区域的当前插入符号位置插入文本

使用Javascript在文本区域中的光标处插入文本

如何在光标所在的位置插入一些文本?

FF 和 Chrome 在上述解决方案中运行良好,但 IE 8 或更低版本会在焦点移到其他控件时失败(未使用 IE9 检查)。

几乎所有帖子中都有以下或类似的 IE 实现:

(function ($) {
    $.fn.getCursorPosition = function () {
        var el = $(this).get(0);
        var pos = 0;
        if ('selectionStart' in el) {
            pos = el.selectionStart;
        } else if ('selection' in document) {
            el.focus();
            var Sel = document.selection.createRange();
            var SelLength = document.selection.createRange().text.length;
            Sel.moveStart('character', -el.value.length);
            pos = Sel.text.length - SelLength
        }
        return pos;
    }
})(jQuery);

注意:我们也可以使用if(el.selectionStart || el.selectionStart == '0') 代替if ('selectionStart' in el)if(document.selection)代替if ('selection' in document)

但是,当焦点首先移动到其他控件然后执行它时,这将失败。在我的情况下,当用户遍历节点时,焦点将移至树节点。

这种情况有什么解决方案吗?

我正在考虑在文本区域上编写 onkeyup 和 onclick 并将其光标位置保存到隐藏字段中,因此当焦点移动到其他控件时,我将有隐藏字段来获取文本区域的光标位置。我稍后会在这里发布,同时如果有人有什么好主意,请分享。

先感谢您

4

2 回答 2

2

正如我上面提到的,我有下面的代码使它在 IE 中也能工作,(也考虑过只有 onblur 而不是这两个事件,但是当执行进入我的代码以设置隐藏变量时它没有工作,因为焦点已经丢失)

下面的实现它在我的情况下工作正常。

if ($("#myTextArea").get(0).selectionStart == undefined) {
    $("#myTextArea").click(function (e) {
        $("#hdnTextAreaPosition").val($("#myTextArea").getCursorPosition());
    });
    $("#myTextArea").keyup(function (e) {
        $("#hdnTextAreaPosition").val($("#myTextArea").getCursorPosition());
    });
}

以上事件(keyup 和 click)在全局脚本中,只有在未定义 selectStart 的情况下才会附加

function getTextAreaCursorPosition() {
    if ($("#myTextArea").get(0).selectionStart == undefined) {
        return $("#hdnTextAreaPosition").val();
    }
    else {
        return $("#myTextArea").getCursorPosition();
    }
}


function insertToMyTextArea(textToInsert) {
    $("#myTextArea").focus();
    var cursorPosition = getTextAreaCursorPosition();
    var myContent = $("#myTextArea").val();
    $("#myTextArea").val(myContent.substring(0, cursorPosition) + textToInsert + myContent.substring(cursorPosition));
}

insertToMyTextArea 是我在单击树节点时调用的主要函数。

如果有任何替代解决方案可用而不是举办活动,请分享您的观点。

于 2012-11-07T13:39:41.693 回答
1

我建议使用我的 jQuery 插件与一些额外的东西结合使用,以在失去焦点之前保存 textarea 的选择或光标位置。

我在之前的回答中已经介绍了这个确切的情况:

https://stackoverflow.com/a/5890708/96100

于 2012-11-07T14:50:32.787 回答