use*_*273 6 javascript innerhtml
我有一个自己的文本编辑器,可以让你改变一个textarea
元素的部分.我想调整它以使用span元素.我对跨度没有特别的依恋.目标只是让某人编辑html而不是textarea.我在IE中工作正常但是遇到了Mozilla的一些问题.
因为我使用的是span而不是表单输入,所以我使用的是innerHTML
代替值.但是,我似乎无法获得selectionStart
和selectionEnd
函数innerHTML
相反的工作value
.
这是textarea
代码工作正常....
HTML
<textarea id="textarea>Some text goes here</textarea><a href="javascript:void() onclick="editText">edit</a>
Run Code Online (Sandbox Code Playgroud)
JS
function editText() {
var len = displaytext.value.length;
var start = displaytext.selectionStart;
var end = displaytext.selectionEnd;
var sel = displaytext.value.substring(start, end); returns selection ok
alert(sel);
}
Run Code Online (Sandbox Code Playgroud)
但是,以下适应不限制选择的开始和结束.
HTML
<span id="textarea>Some text goes here</span><a href="javascript:void() onclick="editText">edit</a>
Run Code Online (Sandbox Code Playgroud)
JS
function editText() {
var len = displaytext.innerHTML.length; //works ok
var start = displaytext.selectionStart; //does not seem to work
var end = displaytext.selectionEnd; //does not seem to work
var sel = displaytext.innerHTML.substring(start, end); //returns whole innerHTML not selection
alert(sel);
}
Run Code Online (Sandbox Code Playgroud)
有一个问题selecionStart
上innerHTML
?解决方法?语法错误?谢谢你的任何建议.
首先,不要用于innerHTML
此类事情。textContent
是去这里的路。
我假设这里使用的是符合标准的浏览器或 IE9+。
要做的第一件事是获取文档选择。你可以通过以下方式做到这一点
var sel = getSelection();
Run Code Online (Sandbox Code Playgroud)
现在,选择可以为空,也可以位于元素之外,因此请检查:
var rng, startSel, endSel, sel;
if (!sel.rangeCount
|| displaytext.compareDocumentPosition((rng = sel.getRangeAt(0)).startContainer) === Node.DOCUMENT_POSITION_PRECEDING
|| displaytext.compareDocumentPosition(rng.endContainer) === Node.DOCUMENT_POSITION_FOLLOWING)
sel = "";
else {
...
Run Code Online (Sandbox Code Playgroud)
此时,rng
包含一个Range
对象,具有属性startOffset
和endOffset
。这些值是整数,分别表示和textContent
属性的位置。startContainer
endContainer
您有一个相当简单的情况,它是一个<span>
具有单个文本节点的元素。在这种情况下,rng.startContainer
andrng.endContainer
将始终是displaytext
、 或某个前面或后面的元素,但不是 的后代displaytext
。
...
else {
startSel = displaytext.compareDocumentPosition(rng.startContainer) === Node.DOCUMENT_POSITION_FOLLOWING ? 0 : rng.startOffset;
endSel = displaytext.compareDocumentPosition(rng.endContainer) === Node.DOCUMENT_POSITION_PRECEDING ? displaytext.textContent.length : rng.endOffset;
sel = displaytext.textContent.substring(startSel, endSel);
}
Run Code Online (Sandbox Code Playgroud)
如果 的结构更加复杂displaytext
,包含子元素等等,事情就会变得有点棘手。您必须在 的后代树中找到起始节点的文本偏移量displaytext
,最好的方法是使用TreeWalker
遍历文本节点的对象:
var tw = document.createTreeWalker(displaytext, NodeFilter.SHOW_TEXT, null, null);
Run Code Online (Sandbox Code Playgroud)