javascript - 如何使用 keydown 事件移动列表项
问题描述
我想使用向上和向下键盘箭头的 keydown 事件在 html 中的可编辑 div 中移动列表项。向上箭头应该向上移动该列表项,向下箭头应该向下移动该列表项。但我无法让代码工作。
<html>
<head>
<meta charset="utf-8">
<title>Lists</title>
</head>
<body>
<div id="bulletPoints" contenteditable="true"></div>
<ul class="newUl" contenteditable="true" id="Head">header
<ul>
<ul>
<li class="newLi" contenteditable="true">textContent</li>
<li class="newLi" contenteditable="true">chelsea</li>
<li class="newLi" contenteditable="true">window</li>
<li class="newLi" contenteditable="true">sancho</li>
<li class="newLi" contenteditable="true">goal</li>
<li class="newLi" contenteditable="true"></li>
<li class="newLi" contenteditable="true">lampard</li>
</ul>
</ul>
</ul>
</div>
<script>
window.onload = function(){
document.addEventListener('keydown', moveList);
}
const moveList = function(e){
if (e.keyCode === 38){
e.preventDefault();
var upLink = document.querySelectorAll(".newList");
for (var i = 0; i < upLink.length; i++) {
upLink[i].addEventListener('keydown', moveList () {
var wrapper = this.parentElement;
if (wrapper.previousElementSibling)
wrapper.parentNode.insertBefore(wrapper, wrapper.previousElementSibling);
});
}
} else if (e.keyCode === 40){
e.preventDefault();
var downLink = document.querySelectorAll(".newList");
for (var i = 0; i < downLink.length; i++) {
downLink[i].addEventListener('keydown', moveList () {
var wrapper = this.parentElement;
if (wrapper.nextElementSibling)
wrapper.parentNode.insertBefore(wrapper.nextElementSibling, wrapper);
});
}
}
}
</script>
</body>
</html>
解决方案
看一下这个。只是想帮助您了解这项技术。
//<![CDATA[
/* js/external.js */
var doc, bod, html, nav, M, I, S, Q; // for use on other loads
addEventListener('load', function(){
doc = document; bod = doc.body;
doc = document; bod = doc.body; html = doc.documentElement; nav = navigator;
mobile = nav.userAgent.match(/Mobi/i) ? true : false;
M = function(tag){
return doc.createElement(tag);
}
I = function(id){
return doc.getElementById(id);
}
S = function(selector, within){
var w = within || doc;
return w.querySelector(selector);
}
Q = function(selector, within){
var w = within || doc;
return w.querySelectorAll(selector);
}
// use the above as a library - you can put the below (besides the load end) on another page if you want
var edit_list = I('edit_list');
function moveUp(t){
var p = t.previousSibling;
while(p && p.nodeType !== 1)p = p.previousSibling;
if(p){
edit_list.insertBefore(t, p);
}
else{
edit_list.appendChild(t);
}
}
function moveDown(t){
var n = t.nextSibling;
while(n && n.nodeType !== 1)n = n.nextSibling;
if(n){
n = n.nextSibling;
if(n){
edit_list.insertBefore(t, n);
}
else{
edit_list.appendChild(t);
}
}
else{
edit_list.insertBefore(t, edit_list.firstChild);
}
}
for(var i=0,q=Q('li', edit_list),l=q.length; i<l; i++){
q[i].onkeyup = function(e){
var k = e.key;
if(k.match(/^(Arrow)?Up$/)){
moveUp(this);
}
else if(k.match(/^(Arrow)?Down$/)){
moveDown(this);
}
}
}
}); // load end
//]]>
/* css/external.css */
html,body{
padding:0; margin:0;
}
h1{
font-size:14px; margin-left:4px;
}
<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
<head>
<meta charset='UTF-8' /><meta name='viewport' content='width=device-width, height=device-height, initial-scale:1' />
<title>Test Template</title>
<link type='text/css' rel='stylesheet' href='css/external.css' />
<script type='text/javascript' src='js/external.js'></script>
</head>
<body>
<h1 contenteditable='true'>header</h1>
<ul id='edit_list'>
<li contenteditable='true'>textContent</li>
<li contenteditable='true'>chelsea</li>
<li contenteditable='true'>window</li>
<li contenteditable='true'>sancho</li>
<li contenteditable='true'>goal</li>
<li contenteditable='true'></li>
<li contenteditable='true'>lampard</li>
</ul>
</body>
推荐阅读
- java - 从日期开始的日期 EXTRACT(DAY,s.date) 不起作用 jpa 和 eclipseLink
- java - TestNG 单元测试 Tar 和 7z
- javascript - 来自 XHR 长轮询的 HTTP 303 重定向不重定向
- git - Github 代码库:如何检查 repo 是否被归类为活动
- c# - 如何使用约定正确启用 EF 级联删除
- sql - 子查询错误返回超过 1 个值
- java - 有没有办法更改数据元素,所以我的代码基本上会在我使用构造函数启动方法时从头开始?
- java - Selenium 悬停代码适用于 Chrome 而不是 Edge
- c - Linux内核模块:我的变量在线程函数中使用时丢失了它的值
- python - Pandas 数据框应用函数返回新列会导致标量错误?