我正在寻找一种跨浏览器的解决方案,即IE,Firefox和Safari.
通过"可编辑的内容窗口",我将假设您的意思是contenteditable
打开的元素或打开的文档designMode
.
还有两种情况需要考虑:用户进行选择的情况和只有插入符号的情况.下面的代码将适用于这两种情况,并将为您提供完全包含选择的最内层元素.如果选择完全包含在文本节点中,那么在IE中获取该文本节点(在其他浏览器中是微不足道的)有点复杂,所以我没有在这里提供该代码.如果你需要它,我可以把它挖出来.
function getSelectionContainerElement() { var range, sel, container; if (document.selection && document.selection.createRange) { // IE case range = document.selection.createRange(); return range.parentElement(); } else if (window.getSelection) { sel = window.getSelection(); if (sel.getRangeAt) { if (sel.rangeCount > 0) { range = sel.getRangeAt(0); } } else { // Old WebKit selection object has no getRangeAt, so // create a range from other selection properties range = document.createRange(); range.setStart(sel.anchorNode, sel.anchorOffset); range.setEnd(sel.focusNode, sel.focusOffset); // Handle the case when the selection was selected backwards (from the end to the start in the document) if (range.collapsed !== sel.isCollapsed) { range.setStart(sel.focusNode, sel.focusOffset); range.setEnd(sel.anchorNode, sel.anchorOffset); } } if (range) { container = range.commonAncestorContainer; // Check if the container is a text node and return its parent if so return container.nodeType === 3 ? container.parentNode : container; } } }