Javascript 如何在按Enter键时操作列表元素
我想允许使用contenteditable编辑有序列表。 当用户在列表中更改或添加新元素时,我希望能够操纵文本(例如,在span标记中换行、替换文本等) 我已经为Enter键创建了一个监听器,可以获取最后一个list元素的值。 我已尝试更改此值并替换为新值。但是,这会填充在enter键上创建的新列表元素Javascript 如何在按Enter键时操作列表元素,javascript,jquery,html,Javascript,Jquery,Html,我想允许使用contenteditable编辑有序列表。 当用户在列表中更改或添加新元素时,我希望能够操纵文本(例如,在span标记中换行、替换文本等) 我已经为Enter键创建了一个监听器,可以获取最后一个list元素的值。 我已尝试更改此值并替换为新值。但是,这会填充在enter键上创建的新列表元素 <div> <ol contenteditable=true class="editor"> <li><br></li>
<div>
<ol contenteditable=true class="editor">
<li><br></li>
</ol>
</div>
$('.editor').on('keydown.editable',函数(e){
如果(e.keyCode===13){
var insertText=“”+e.target.lastElementChild.innerText+”;
e、 target.lastElementChild.innerHTML=插入文本;
返回真值
}
});
对于列表中任何位置的新条目(不仅仅是末尾),实现此功能的最佳方法是什么?开放Jquery解决方案
示例您可以使用检测子项何时添加到您的列表中,然后更新以前的同级项,将其包装为一个
:
功能订户(突变){
突变。forEach(突变=>{
突变.addedNodes.forEach(节点=>{
const prev=node.previousSibling;
如果(上一个){
prev.innerHTML=`${prev.innerHTML.replace(/
$/,'')}`;
}
});
});
}
const observer=新的变异观察者(订户);
observer.observe(document.querySelector('ol[contenteditable]'),{childList:true})代码>
.editor span::after{
内容:“您可以将逻辑绑定到最后一个li
,并根据它发出的事件执行逻辑
$('.editor.last item')
.on('click',函数(e){
//清除html,以便用户只需键入
e、 target.innerHTML='';
})
.on('keydown',功能(e){
如果(如keyCode===13){
//忽略enter键,这样它就不会插入新的like
e、 预防默认值();
//在最后一个li之前创建新li
$(“”+e.target.innerHTML.trim()+” ).insertBefore(e.target);
//清除html,以便用户可以继续输入项目
e、 target.innerHTML='';
}
})
.on('blur',函数(e){
//如果用户离开该字段,请将其更改回说明文本
e、 target.innerHTML='单击以输入新列表项';
});
点击进入新列表项
您可以设置一个间隔,根据需要修改li
元素的html,而不是在编辑时采取操作
setInterval(function(){
$('.editor' ).find('li').each(function(){
if ($(this).html().indexOf('span')==-1){
$(this).html('<span>' + $(this).html() + '</span>');
}
});
}, 200);
setInterval(函数(){
$('.editor')。查找('li')。每个(函数(){
if($(this.html().indexOf('span')=-1){
$(this.html(“”+$(this.html()+“”);
}
});
}, 200);
您好,您可能想检查一下,让我给您提个醒。不要使用
lastchild.innerHTML
换成
nextSibling.innerHTML
像这样
$('.editor').on('keydown.editable',函数(e){
如果(如keyCode===13){
var insertText=“”+e.target.lastElementChild.innerText+”;
e、 target.nextSibling.innerHTML=插入文本;
返回真值
}
});
使最后一个li可编辑并将事件逻辑放在其上可能更容易。在enter上,在我尝试此操作之前插入一个新的li,它不会更改元素。谢谢。但是我想允许用户编辑以前的元素,此解决方案限制了这一点。@Schaffer很容易将contenteditabel包含在列表中ly创建了li元素。谢谢。我尝试过这个方法,虽然它允许编辑内容,但当按enter键时,它会停止创建新元素。有趣的解决方案,谢谢。让我进一步探讨这个问题,因为它似乎做了我想做的事。我想允许使用TAB键嵌套列表,所以我实现了liste用于制表符的ners。请参阅fiddle这将停止调用观察者。是否有方法可以手动调用/触发它?现在已解决。只需添加子树:true。{childList:true,subtree:true}。解决方案运行良好。再次感谢
nextSibling.innerHTML