эта функция не работает, но если я установил точку останова в devtools, она будет работать успешно, почему? так странно ......
function insertHtmlAtCursor() {
var range=window.getSelection().getRangeAt(0);
var node = range.createContextualFragment("<div>this is not show</div>");
range.insertNode(node);
}
но если я изменю код на этот, он всегда будет работать правильно.
var node = document.createTextNode('this is ok.');
я использую chrome в макросах, здесь это демо:
editor.onkeydown=editinput;
function editinput(e) {
if(e.isComposing||e.keyCode===229) {
return;
}
if(e.keyCode==32) {//space
var range=window.getSelection().getRangeAt(0);
var node=range.createContextualFragment('ttttttttttt');
range.insertNode(node);
}
}
<div id="editor" contenteditable="true" class="knowleadge" tabIndex="1">
</div>
Это демо, когда я вводю пробел, он не будет вставлять фрагмент, но когда я отлаживаю в chrome, он будет вставлять фрагмент.
теперь, спасибо @Dekel, я знаю, что keyup replace keydown - это решение, но поскольку мне нужно разобраться с tab, а keyup не может реально поймать клавишу tab, поэтому мне нужно разобраться с кодом в keydown, как я могу сделать это?
и я считаю, что settimeout может решить эту проблему, но есть ли другое решение? вот установленное время ожидания:
if(e.keyCode==32) {//space
setTimeout(dealpace,0);
e.stopPropagation();
e.preventDefault();
}
function dealpace() {
var range=window.getSelection().getRangeAt(0);
var node=range.createContextualFragment('ttttttttttt');
range.insertNode(node);
}
спасибо @Dekel, settimeout не является ключевым, ключ - e.preventDefault (); как говорят @Dekel, keydown вставляет текст, но keyup заменяет текст пробелом. поэтому нам нужен e.preventDefault (); как это:
if(e.keyCode==32) {//space
dealpace();
e.stopPropagation();
e.preventDefault();
}
function dealpace() {
var range=window.getSelection().getRangeAt(0);
var node=range.createContextualFragment('ttttttttttt');
range.insertNode(node);
}