在用户选择后添加元素w/ text节点
Add element w/ text node after user selection
我有以下函数,它在调用时使用文本字段中的text值在文档末尾创建一个新的文本节点:
function addAfter () {
var elem = document.getElementById('textfield').value;
var h = document.createElement('span');
var t = document.createTextNode(elem);
h.appendChild(t);
document.body.appendChild(h);
}
我想要它做的是在用户选择的文本之后立即添加文本(就像当您单击并拖动以选择文本时)。需要什么来取代document.body.appendChild(h);
才能使其工作?
试试这个JS提琴
除了IE边缘(我相信)
function getSelectionText() {
var text = "";
if (window.getSelection) {
text = window.getSelection().toString();
} else if (document.selection && document.selection.type != "Control") {
text = document.selection.createRange().text;
}
return text;
}
document.body.addEventListener('mouseup', function() {
(window.getSelection()) ? addText(window.getSelection().toString(), window.getSelection().baseNode.parentNode) : addText(document.selection.toString(), document.selection.baseNode.parentNode);
});
function addText(text, parent) {
parent.appendChild(document.createTextNode(text));
}
它的工作方式是使用mouseUp事件来确定文本是否已被选中。选中的文本存储在window.getSelected()或document.selected()下面,然后将该值以及选中文本的父值传递给addText函数。它使用文档appendChild和createTextNode方法将捕获的文本追加到DOM。
在以前的IE版本中,他们使用document.select(),但在Edge中,他们切换到getSelection(像其他人一样),但是他们没有实现当你获得文本时返回的相同值,因此你不能真正抓住parentNode并轻松地附加到该节点。
所以,简而言之,这将给你你想要的,但它不是跨浏览器的,似乎没有办法做到这一点很容易。我在另一个提要中找到了一个解决方案。
function addAfter (isBefore) {
var sel, range, node;
var changeText = document.getElementById('textfield').value;
var textAndCode = "<span class='"correction'"> " + changeText + " </span>";
if (window.getSelection) {
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
range = window.getSelection().getRangeAt(0);
range.collapse(isBefore);
// Range.createContextualFragment() would be useful here but was
// until recently non-standard and not supported in all browsers
// (IE9, for one)
var el = document.createElement("div");
el.innerHTML = textAndCode;
var frag = document.createDocumentFragment(), node, lastNode;
while ( (node = el.firstChild) ) {
lastNode = frag.appendChild(node);
}
range.insertNode(frag);
}
} else if (document.selection && document.selection.createRange) {
range = document.selection.createRange();
range.collapse(isBefore);
range.pasteHTML(textAndCode);
}
}
如果您希望isBefore
的值出现在
相关文章:
- 节点导出返回一个空对象
- 可以前端maven插件使用节点,npm已经安装
- 在jstree中,如何将指定的节点集中到大型树上
- 如何将输入(type=text)从html表单传递到javascript函数
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- 如何从模块链中调用函数.导出到节点中
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- d3基于用户选择动态更新节点
- 有条件更新d3.js力图中节点的最佳方法
- 如何处理node.js节点mongodb中的连接和查询队列
- 将DOM节点值与字符串Javascript进行比较
- 节点fs.stat名称未定义
- 节点,express应用程序返回text/javascript响应头(Content-Type),尽管设置了applic
- JSTree's data.rslt.obj.text()返回一个文本数组,而不是所需节点的文本
- 属性来检索和设置Text节点值:data或nodeValue
- 如何从text() XPath查询中排除仅换行的文本节点
- 在用户选择后添加元素w/ text节点
- li元素的子节点给出[#text,
- …
- 如何最好地考虑javascript中的空白(#text)子节点兼容性
- 如何检索DOM text节点的文本