javascript - 如何删除具有属性 contentEditable 的 div 中的 HTML 元素?

标签 javascript html fbjs

有这个 html:

<div id="editable" contentEditable="true"  >
    <span contentEditable="false" >Text to delete</span>
</div>

需要用一个退格键删除跨度(和里面的所有文本),这可能吗?

最佳答案

事实证明,这比我想象的要复杂。或者我让它变得比它需要的更复杂。无论如何,这应该适用于所有大型浏览器:

function getLastTextNodeIn(node) {
    while (node) {
        if (node.nodeType == 3) {
            return node;
        } else {
            node = node.lastChild;
        }
    }
}

function isRangeAfterNode(range, node) {
    var nodeRange, lastTextNode;
    if (range.compareBoundaryPoints) {
        nodeRange = document.createRange();
        lastTextNode = getLastTextNodeIn(node);
        nodeRange.selectNodeContents(lastTextNode);
        nodeRange.collapse(false);
        return range.compareBoundaryPoints(range.START_TO_END, nodeRange) > -1;
    } else if (range.compareEndPoints) {
        if (node.nodeType == 1) {
            nodeRange = document.body.createTextRange();
            nodeRange.moveToElementText(node);
            nodeRange.collapse(false);
            return range.compareEndPoints("StartToEnd", nodeRange) > -1;
        } else {
            return false;
        }
    }
}

document.getElementById("editable").onkeydown = function(evt) {
    var sel, range, node, nodeToDelete, nextNode, nodeRange;
    evt = evt || window.event;
    if (evt.keyCode == 8) {
        // Get the DOM node containing the start of the selection
        if (window.getSelection && window.getSelection().getRangeAt) {
            range = window.getSelection().getRangeAt(0);
        } else if (document.selection && document.selection.createRange) {
            range = document.selection.createRange();
        }

        if (range) {
            node = this.lastChild;
            while (node) {
                if ( isRangeAfterNode(range, node) ) {
                    nodeToDelete = node;
                    break;
                } else {
                    node = node.previousSibling;
                }
            }

            if (nodeToDelete) {
                this.removeChild(nodeToDelete);
            }
        }
        return false;
    }
};

关于javascript - 如何删除具有属性 contentEditable 的 div 中的 HTML 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2177958/

相关文章:

java - 在 Java 中解析字符串的开始和结束

Javascript 表达式的结果不是对象

javascript - 在视口(viewport)宽度和高度变化时保持剪辑路径的 Angular

javascript - 带有 html 的 Es6 map 数组在 JSX 中不起作用?

javascript - Cufon 在 FBML 静态页面中工作吗?

javascript - FBJS 文本区域倒计时

javascript - FBJS JavaScript getElementById 返回空值?

javascript - 如何在js中使用facebook api请求用户权限?

javascript - 为图像创建浏览器池直到可用

html - Wordpress 导航栏无法正确呈现 IE7