繁体   English   中英

contenteditable div:IE8不满意退格删除HTML元素

[英]contenteditable div: IE8 not happy with backspace remove of HTML element

我正在使用一个contenteditable div结合rangy Javascript库在光标位置插入HTML。

div的内容通常如下所示:

<div contenteditable="true">
    "Hello "
    <button contenteditable="false" data-id="147">@John Smith</button>
    " "
</div>

按“@”后会建议用户,并在选择后随后插入按钮(ala Google Plus)。 我还插入了一个&nbsp; 在这个按钮之后。

当您点击退格键(首先删除&nbsp; )之后,Chrome / Safari / Firefox中的按钮会被删除,但不会在IE8中删除。 在IE8中,光标只是跳过按钮而不删除它。 IE8中更奇怪的是,如果你离开&nbsp; 按钮旁边 - 而是将光标放在按钮旁边 - 它会删除退格键上的按钮。 所以当有一个&nbsp; 在光标的右侧。

有没有人知道我需要什么才能让IE8工作,以便在退格时删除按钮而无需使用&nbsp; 在光标的右边? (关于这种奇怪行为的一些信息也可能有帮助)

PS我还没有测试过其他版本的IE

我的建议是首先检查插入符号位于不可编辑节点之后,如果是,则创建一个在不可编辑元素之后立即开始并在插入符号位置结束的范围。 检查此范围内的文本是否为空。 如果是,则表示插入符号直接放在不可编辑的元素之后,因此在这种情况下删除该元素。 最后,将插入符号放在不可编辑的位置。

现场演示: http//jsfiddle.net/timdown/vu3ub/

码:

document.onkeypress = function(e) {
    e = e || window.event;
    var keyCode = e.which || e.keyCode;
    if (keyCode !== 8) {
        return;
    }

    var sel = rangy.getSelection();
    if (sel.rangeCount === 0) {
        return;
    }

    var selRange = sel.getRangeAt(0);
    if (!selRange.collapsed) {
        return;
    }

    var nonEditable = document.getElementById("nonEditable");
    if (!nonEditable) {
        return;
    }

    // Check the caret is located after the non-editable element
    var range = rangy.createRange();
    range.collapseAfter(nonEditable);

    if (selRange.compareBoundaryPoints(range.START_TO_END, range) == -1) {
        return;
    }

    // Check whether there is any text between the caret and the
    // non-editable element. If not, delete the element and move
    // the caret to where it had been
    range.setEnd(selRange.startContainer, selRange.startOffset);
    if (range.toString() === "") {
        selRange.collapseBefore(nonEditable);
        nonEditable.parentNode.removeChild(nonEditable);
        sel.setSingleRange(selRange);

        // Prevent the default browser behaviour
        return false;
    }
};

我用jsfiddle快速了解了如何查看选择范围并使用startContainer的previousSibling属性来查找按钮: jsfiddle

将光标放在aaa中,它将显示按钮是prev sibling。 把它放在ccc和bbb会显示。

因此,你可以处理div的keydown事件,检查key是否退格+ previousSibling是你的按钮,并用jQuery删除它。

如果它是textnode,则previousSibling为null,仅为FYI。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM