我想要光标在文本区域的正常行为,请在chrome浏览器上试试。
我用的是
contenteditable
但它应该像短信区一样工作,
每一个单词都必须在一个非常必要的范围内,我不想用纯文本
对于每个空格,每个书写的单词都必须成为div或SPAN,
光标应该正常工作
例子:
"hello word" for the space the result will is
<div>hello</div>
imagine that the second space is after the word "word",
for the second space the result will is
<div>hello</div><div>word</div>
and written spacebar before the caracter 'r'
the result will is <div>hello</div><div>wo</div><div>rd</div>
window.onload = function() {
document.getElementById('test').addEventListener('keyup', function(e) {
if (e.which === 32) {
var parent = document.getElementById("test");
var range = document.createRange();
var selection = window.getSelection();
var number = window.getSelection().anchorNode.parentNode.id;
convertirEnSpans();
agregarIds();
if (parent.childNodes[parseInt(number) + 1] !== undefined) {
var element = parent.childNodes[parseInt(number) + 1];
range.setStart(element, 0);
range.collapse(true);
selection.removeAllRanges();
selection.addRange(range);
element.focus();
}
}
});
function convertirEnSpans() {
let text = document.getElementById('test');
let spans = text.getElementsByTagName('span');
if (spans.length > 0) {
text = '';
for (var i = 0; i < spans.length; i++) {
text += spans[i].innerHTML + ' ';
}
text = text.substring(0, text.length - 1);
} else {
text = text.innerHTML;
}
var wordsWithSpan = text.split(' ').map(function(c) {
return '<span class="word">' + c + '</span>';
}).join('');
document.getElementById('test').innerHTML = wordsWithSpan;
}
function agregarIds() {
text = document.getElementById('test');
let nodeSpans = text.getElementsByTagName('span');
for (var i = 0; i < nodeSpans.length; i++) {
nodeSpans[i].id = i;
}
}
}
.word {
color: red;
padding-right: 2px;
}
div {
border: 1px solid;
margin: 50px;
}
<div contenteditable="true" id="test">
</div>
我不能让光标正常工作,光标跳到各个部位,怎么解决呢?
我只对SpaceBar感兴趣,
不要用回车键尝试
更新@durgeshahire的答案
但是在单词中间写错误仍然存在。
window.onload = function() {
document.getElementById('test').addEventListener('keyup', function(e) {
if (e.which === 32) {
var parent = document.getElementById("test");
var range = document.createRange();
var selection = window.getSelection();
var number = window.getSelection().anchorNode.parentNode.id;
convertirEnSpans();
agregarIds();
if (parent.childNodes[parseInt(number) + 2] !== undefined) {
var element = parent.childNodes[parseInt(number) + 1];
range.setStart(element, 0);
range.collapse(true);
selection.removeAllRanges();
selection.addRange(range);
element.focus();
} else {
setEndOfContenteditable(parent);
}
}
});
function setEndOfContenteditable(contentEditableElement) {
var range, selection;
if (document.createRange) {
range = document.createRange();
range.selectNodeContents(contentEditableElement);
range.collapse(false);
selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
} else if (document.selection)
{
range = document.body.createTextRange();
range.moveToElementText(contentEditableElement);
range.collapse(false);
range.select();
}
}
function convertirEnSpans() {
let text = document.getElementById('test');
let spans = text.getElementsByTagName('span');
if (spans.length > 0) {
text = '';
for (var i = 0; i < spans.length; i++) {
text += spans[i].innerHTML + ' ';
}
text = text.substring(0, text.length - 1);
} else {
text = text.innerHTML;
}
var wordsWithSpan = text.split(' ').map(function(c) {
return '<span class="word">' + c + '</span>';
}).join('');
document.getElementById('test').innerHTML = wordsWithSpan;
}
function agregarIds() {
text = document.getElementById('test');
let nodeSpans = text.getElementsByTagName('span');
for (var i = 0; i < nodeSpans.length; i++) {
nodeSpans[i].id = i;
}
}
}
.word {
color: red;
padding-right: 3px;
}
div {
border: 1px solid;
margin: 50px;
}
<div contentEditable=“true”id=“test”>
</分区>