Вставить из буфера обмена в режиме перезаписи - курсор ввода перемещается в конец текстового узла - PullRequest
0 голосов
/ 23 ноября 2018

Нашим целевым браузером является IE8, так как приложение является устаревшим и имеет некоторую коммерческую зависимость. Мы показываем контент внутри редактируемого контентом div.Одним из требований является возможность замены текста внутри div, когда браузер находится в режиме «перезаписи».Вставка работает нормально, но курсор ввода всегда перемещается в конец после вставки.Мы используем rangy-core версии 1.3.1 для логики, связанной с диапазоном / выбором.Невозможно понять, что здесь происходит не так.Нужна помощь.

enter image description here

При загрузке документа вызывается следующий код:

    $("#info").on("paste", function (e) {
    var clipboardData = window.clipboardData.getData("Text");
    clipboardData = clipboardData.replace(/(^ *)|(\r\n|\n|\r)/gm, "");
    if (isOverwriteEnabled()) {
        e.preventDefault ? e.preventDefault() : e.returnValue = false;
        pasteCopiedData(clipboardData);
    }
});

Фрагменты соответствующих кодов для справки:

function isOverwriteEnabled() {
try {
    // try the MSIE way
    return document.queryCommandValue("OverWrite");
} catch (ex) {
    // not MSIE => not supported
    return false;
}
}

function pasteCopiedData(clipboardData) {
var json = getCurrentNodeWithOffset();
handleTextOverwrite(json, clipboardData);
}

function getCurrentNodeWithOffset() {
var json = {};
var selectedObj = rangy.getSelection();
var range = selectedObj.getRangeAt(0);
json.node = selectedObj.anchorNode.nodeType === 3 ? selectedObj.anchorNode : findImmediateTextNode(selectedObj.anchorNode, range.startOffset);
json.offset = selectedObj.anchorNode.nodeType === 3 ? range.startOffset : json.node.nodeValue.length - 1;
return json;
}

function handleTextOverwrite(json, textToReplace) {

var lenToCopy = textToReplace.length;
var offsetPos = json.offset;
var jsonNode = json.node;

try {
    while (lenToCopy > 0) {
        var toCopy = jsonNode.nodeValue.length - offsetPos;
        var startPos = textToReplace.length - lenToCopy;

        if (lenToCopy <= toCopy) {
            json.node.nodeValue = jsonNode.nodeValue.substr(0, offsetPos) + textToReplace.substr(startPos) + jsonNode.nodeValue.substr(offsetPos + lenToCopy);
            lenToCopy = 0;
        }
        else {
            var copiedPos = startPos + toCopy;
            jsonNode.nodeValue = jsonNode.nodeValue.substr(0, offsetPos) + textToReplace.substr(startPos, toCopy);

            lenToCopy -= copiedPos;
            var nextJsonNode = findNextTextNode(jsonNode);

            if (!nextJsonNode) {
                //do the remaining paste in jsonNode
                jsonNode.nodeValue = jsonNode.nodeValue + textToReplace.substr(copiedPos);
                lenToCopy = 0;
            }
            else {
                jsonNode = nextJsonNode;
            }
        }

        offsetPos = 0;
    }

    setCaret(json.node, json.offset);
}
catch (ex) {

}
}

function setCaret(node, pos) {
var el = document.getElementById("info");
var rangyRange = rangy.createRange(el);
var sel = rangy.getSelection();
rangyRange.setStart(node, pos + 1);
rangyRange.setEnd(node, pos + 1);
rangyRange.collapse(true);
sel.removeAllRanges();
sel.addRange(rangyRange);    
}

Пожалуйста, дайте мне знать, если требуется дополнительная информация.

...