获取 #document-fragment 的 innerHTML 而不是 textContent
Get innerHTML of #document-fragment instead of textContent
我有一个 contenteditable p 标签。当提取 p 标签的内容并将其插入另一个标签时,原始标签的所有标记都将丢失。有什么方法可以保存标记吗?
请注意,如果 插入符号位于段落中的第 i 个 位置,则 个字符将从该位置开始提取到结尾.
function select() {
var el = document.getElementById('p');
el.focus();
var sel = window.getSelection();
var selRange = sel.getRangeAt(0);
var range = selRange.cloneRange();
range.selectNodeContents(el);
range.setStart(selRange.endContainer, selRange.endOffset);
document.getElementById('other').innerHTML = (range.extractContents().textContent);
// return range.extractContents().textContent;
}
p {
background-color: #eee;
}
.red {
color: red;
}
<p id="p" contenteditable="true">This is <i>a</i> <span class="red">paragraph</span> <b>with</b> lots of markup.</p>
<p id="other"></p>
<button onclick="select()">SELECT</button>
你不是这个意思吗?
document.getElementById('other').innerHTML = el.innerHTML;
你的 javascript 会很简单:
function select() {
var el = document.getElementById('p');
el.focus();
document.getElementById('other').innerHTML = el.innerHTML;
}
编辑:
嘿,你对我的回答投了反对票,但你能解释一下你想要实现的目标吗?我上面写的代码你可以在这个 jsfiddle 中看到:https://jsfiddle.net/936zuzky/1/
您想保存原始标记 - 它已保存,您想要实现什么?
range.extractContents()
returns a DocumentFragment
.
DocumentFragment
没有 innerHTML
property. innerHTML
comes from the Element
interface, while textContent
is part of the Node
接口。 DocumentFragment
继承自 Node
,但不继承 Element
。
这意味着您可以附加整个片段,因为它是 Node
:
function select() {
var el = document.getElementById('p');
el.focus();
var sel = window.getSelection();
var selRange = sel.getRangeAt(0);
var range = selRange.cloneRange();
range.selectNodeContents(el);
range.setStart(selRange.endContainer, selRange.endOffset);
//document.getElementById('other').innerHTML = (range.extractContents().textContent);
var frag = range.extractContents();
var i;
var node;
var other = document.getElementById('other');
other.innerHTML = '';
other.appendChild(frag);
}
p {
background-color: #eee;
}
.red {
color: red;
}
<p id="p" contenteditable="true">This is <i>a</i> <span class="red">paragraph</span> <b>with</b> lots of markup.</p>
<p id="other"></p>
<button onclick="select()">SELECT</button>
供进一步参考,如果有人确实需要提取片段的 innerHTML。
该片段有子节点,那些子节点有 outerHTML
属性,因此您只需从所有子节点
中获取 outerHTML
const fragment = range.extractContents();
const htmlContent = [].map.call(fragment.childNodes, x => x.outerHTML).join('')
map.call
部分是必需的,因为尽管该片段具有 childNodes
属性,但 childNodes
没有 map
方法。
我有一个 contenteditable p 标签。当提取 p 标签的内容并将其插入另一个标签时,原始标签的所有标记都将丢失。有什么方法可以保存标记吗?
请注意,如果 插入符号位于段落中的第 i 个 位置,则 个字符将从该位置开始提取到结尾.
function select() {
var el = document.getElementById('p');
el.focus();
var sel = window.getSelection();
var selRange = sel.getRangeAt(0);
var range = selRange.cloneRange();
range.selectNodeContents(el);
range.setStart(selRange.endContainer, selRange.endOffset);
document.getElementById('other').innerHTML = (range.extractContents().textContent);
// return range.extractContents().textContent;
}
p {
background-color: #eee;
}
.red {
color: red;
}
<p id="p" contenteditable="true">This is <i>a</i> <span class="red">paragraph</span> <b>with</b> lots of markup.</p>
<p id="other"></p>
<button onclick="select()">SELECT</button>
你不是这个意思吗?
document.getElementById('other').innerHTML = el.innerHTML;
你的 javascript 会很简单:
function select() {
var el = document.getElementById('p');
el.focus();
document.getElementById('other').innerHTML = el.innerHTML;
}
编辑:
嘿,你对我的回答投了反对票,但你能解释一下你想要实现的目标吗?我上面写的代码你可以在这个 jsfiddle 中看到:https://jsfiddle.net/936zuzky/1/
您想保存原始标记 - 它已保存,您想要实现什么?
range.extractContents()
returns a DocumentFragment
.
DocumentFragment
没有 innerHTML
property. innerHTML
comes from the Element
interface, while textContent
is part of the Node
接口。 DocumentFragment
继承自 Node
,但不继承 Element
。
这意味着您可以附加整个片段,因为它是 Node
:
function select() {
var el = document.getElementById('p');
el.focus();
var sel = window.getSelection();
var selRange = sel.getRangeAt(0);
var range = selRange.cloneRange();
range.selectNodeContents(el);
range.setStart(selRange.endContainer, selRange.endOffset);
//document.getElementById('other').innerHTML = (range.extractContents().textContent);
var frag = range.extractContents();
var i;
var node;
var other = document.getElementById('other');
other.innerHTML = '';
other.appendChild(frag);
}
p {
background-color: #eee;
}
.red {
color: red;
}
<p id="p" contenteditable="true">This is <i>a</i> <span class="red">paragraph</span> <b>with</b> lots of markup.</p>
<p id="other"></p>
<button onclick="select()">SELECT</button>
供进一步参考,如果有人确实需要提取片段的 innerHTML。
该片段有子节点,那些子节点有 outerHTML
属性,因此您只需从所有子节点
outerHTML
const fragment = range.extractContents();
const htmlContent = [].map.call(fragment.childNodes, x => x.outerHTML).join('')
map.call
部分是必需的,因为尽管该片段具有 childNodes
属性,但 childNodes
没有 map
方法。