我有一个contentEditable的div,我想插入HTML标签(一个简单的span元素)。
是否有跨浏览器的解决方案,允许我在div选择或光标位置上插入这些标签。如果页面上选中了其他内容(不在div中),我希望将标签附加到div的末尾。
谢谢
我有一个contentEditable的div,我想插入HTML标签(一个简单的span元素)。
是否有跨浏览器的解决方案,允许我在div选择或光标位置上插入这些标签。如果页面上选中了其他内容(不在div中),我希望将标签附加到div的末尾。
谢谢
以下是一个快速入门
// get the selection range (or cursor position)
var range = window.getSelection().getRangeAt(0);
// create a span
var newElement = document.createElement('span');
newElement.id = 'myId';
newElement.innerHTML = 'Hello World!';
// if the range is in #myDiv ;)
if(range.startContainer.parentNode.id==='myDiv') {
// delete whatever is on the range
range.deleteContents();
// place your span
range.insertNode(newElement);
}
我没有IE,但在firefox、chrome和safari上运行良好。也许您想玩一下range.startContainer,只有在selection是在contentEditable div上进行时才继续。
编辑:根据quirksmode range intro的说法,您需要更改window.getSelection()部分以使其兼容IE。
var userSelection;
if (window.getSelection) {
userSelection = window.getSelection();
}
else if (document.selection) { // should come last; Opera!
userSelection = document.selection.createRange();
}
<div>
之外或选择包含在<div>
内的子元素(或更深嵌套)的情况。function isOrContainsNode(ancestor, descendant) {
var node = descendant;
while (node) {
if (node === ancestor) return true;
node = node.parentNode;
}
return false;
}
function insertNodeOverSelection(node, containerNode) {
var sel, range, html;
if (window.getSelection) {
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
range = sel.getRangeAt(0);
if (isOrContainsNode(containerNode, range.commonAncestorContainer)) {
range.deleteContents();
range.insertNode(node);
} else {
containerNode.appendChild(node);
}
}
} else if (document.selection && document.selection.createRange) {
range = document.selection.createRange();
if (isOrContainsNode(containerNode, range.parentElement())) {
html = (node.nodeType == 3) ? node.data : node.outerHTML;
range.pasteHTML(html);
} else {
containerNode.appendChild(node);
}
}
}
<input type="button" onmousedown="insertNodeOverSelection(document.createTextNode('[NODE]'), document.getElementById('test'));" value="insert">
<div contenteditable="true">
<div id="test" style="background-color: lightgoldenrodyellow">
This is the editable element where the insertion will happen. Select something or place the cursor in here, then hit the button above
</div>
<div>
No insertion will happen here
</div>
</div>