【发布时间】:2017-05-16 16:59:03
【问题描述】:
我将完整的代码放在这里,以免遗漏任何可能导致此问题发生的内容。
在运行代码后按照步骤复制问题。
- 点击+,它将创建一个新的无序列表
ul和li。 - 在
li内部单击并输入内容,然后按Enter。它将在它之后创建一个新的li。因此,每个li上都有一个keypress事件绑定,在 Enter 后会插入一个新的li。 - 现在在第二个
li中输入一些内容,然后按 Tab。它将把这个li放在之前的li中。还绑定了一个 Tab 按下事件。 - 现在再次单击相同的
li并按Enter。这就是问题所在。
预计新的li 将在此之后插入,但实际上它是在父li 之后插入的。
调试后显示 $(this) 指向父 li,内部代码为 keypress 事件处理。
请告诉我为什么会这样。
$('document').ready(function() {
$('#plus').click(function() {
$('#notes').append(fillnote());
});
});
function fillnote() {
var $ul = $('<ul>').addClass('myUL').append(getLi());
var node = $('<div>').append($ul);
return node;
}
function getLi()
{
return $('<li>').addClass('edit-list')
.attr('contentEditable', true);
}
$(document).on('keydown', '.edit-list', function(e) {
var keyCode = e.keyCode || e.which;
//Enter key
if (keyCode == 13) {
var $newLi = getLi();
$(this).after($newLi);
$newLi.focus();
return false;
}
//Tab Key
if (keyCode == 9) {
console.log(this);
moveInsidePrevSibling($(this));
return false;
}
});
function moveInsidePrevSibling($obj)
{
var $prev = $obj.prev();
var $ul = $('<ul>').addClass('myUL');
$prev.append($ul);
$ul.append($obj);
}
#notes
{
min-height: 800px;
width:800px;
}
ul {
margin: 0;
padding: 0;
list-style-type: none;
}
ul li {
cursor: pointer;
position: relative;
padding: 5px 8px 5px 20px;
background: #eee;
font-size: 14px;
transition: 0.2s;
line-height: 1.5em;
height: auto;
}
ul li:nth-child(odd) {
background: #f9f9f9;
}
ul li:hover {
background: #ddd;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<span id="plus">+</span>
<div id="notes"></div>
</body>
【问题讨论】:
-
我认为这将非常困难,因为事件委托是如何工作的,因为您的子元素在您的父元素中,它也有一个
keydown的事件侦听器,$(this)将永远是父元素我认为。我建议将这两个事件功能与唯一的引用类或 ID 分开。 -
这个过程是嵌套的。所以我不能使用 ids 和单独的类名。