【问题标题】:jquery on handler not working for inserted element处理程序上的jquery不适用于插入的元素
【发布时间】:2013-10-04 17:03:52
【问题描述】:

我有一个简单的待办事项列表应用。待办事项由 jQuery 插入为 <li> 项目。当它们被选中时,它们将从 #todolist 中删除并添加到 #donelist 之前。我想让用户替换他们不小心选中的待办事项,因此 .on 处理程序 #donelist .checkbox 元素,但它不起作用。很长一段时间以来,我一直在为这个感到困惑。如何让点击处理程序为#donelist .checkboxes 工作?

HTML:

<div id="topform">
    <input type="text" id="task" placeholder=" New task...">
</div>

<ul id="todolist">

</ul>

<ul id="donelist">

</ul>

JS:

$('#todolist').on('click', '.checkbox', checkTask);
$('#donelist').on('click', '.checkbox', replaceTask);

$('input').keypress(function (e) {
    if (e.which == 13) {
    addTask(e);
    }
});

function addTask(e) {
    taskToAdd = $('#task').val();
    var listItem = "<li><span class='todotask'>" + taskToAdd + "</span><div class='checkbox'></div></li>";
    $('#todolist').prepend(listItem);
}

function checkTask() {
    var listItem = $(this).parent();
    listItem.remove();
    $('#donelist').prepend(listItem);
}

function replaceTask() {
    alert('hey buddy');
}

完整的 CSS:

html,
body {
margin: 0;
padding: 0;
background-color: #313131;
font-family: 'Helvetica', sans-serif;
}

#task {
width: 98%;
margin: 5px auto 7px auto;
padding: 0;
display: block;
height: 45px;
border: none;
border-radius: 2px;
font-size: 25px;
background-color: #F7F7F7;
}

ul {
margin: 0 auto 0 auto;
padding: 0;
width: 98%;
}

li {
list-style-type: none;
padding: 0;
margin: 5px auto 0 auto;
width: 100%;
height: 45px;
line-height: 45px;
position: relative;
font-size: 25px;
border-radius: 2px;
background-color: #F7F7F7;
}

#donelist li {
opacity: .5;
text-decoration: line-through;
}

.todotask {
margin-left: 7px;
}

.checkbox {
height: 31px;
width: 31px;
border-radius: 2px;
background-color: #C1C1C1;
position: absolute;
right: 7px;
top: 7px;
}

checkTask() 工作得很好,这让我很困惑。 checkTask() 在用户单击动态插入的元素时被调用(li 中的divaddTask() 插入。为什么replaceTask() 也不会触发?

【问题讨论】:

    标签: javascript jquery events handler


    【解决方案1】:

    在 OP 中有相应的 HTML 会有所帮助,所以我不得不猜测一下它的结构,但这是我认为您正在寻找的工作 example

    HTML

    <h1>ADD</h1>
    <input id="task"></input>
    <button id="add">Add</button>
    
    <h1>TODO</h1>
    <ul id="todolist">
        <li><span class='todotask'>" Take out the garbage "</span><div class='checkbox'></div></li>
        <li><span class='todotask'>" Do the dishes "</span><div class='checkbox'></div></li>
    </ul>
    
    <h1>DONE</h1>
    <ul id="donelist">
    
    </ul>
    

    CSS

    .checkbox{
        width: 15px;
        height: 15px;
        background-color: black;
        display: inline-block;
        cursor: pointer;
    }
    

    JavaScript 在 document.ready() 中

    $('#todolist').on('click', '.checkbox', checkTask);
    $('#donelist').on('click', '.checkbox', replaceTask);
    $("#add").click(addTask);
    
    
    function addTask(e) {
        taskToAdd = $('#task').val();
        var listItem = "<li><span class='todotask'>" + taskToAdd + "</span><div class='checkbox'></div></li>";
        $('#todolist').prepend(listItem);
    }
    
    function checkTask() {
        var listItem = $(this).parent();
        listItem.remove();
        $('#donelist').prepend(listItem);
    }
    
    function replaceTask() {
        var listItem = $(this).parent();
        listItem.remove();
        $('#todolist').prepend(listItem)
    }
    

    【讨论】:

    • 谢谢!它正是我想要的,是的。但有什么不同?我没有看到发生了什么变化(除了 replaceTask 函数明显变胖,它之前只是有一个占位符警报。它与 .on() 处理程序有关吗?它们让我如此困惑,我想。
    • 老实说,代码看起来是正确的。因此,除非id 可能拼写错误,或者您的 HTML 中的结构有点不同,否则我不太确定。如果你想用你的 HTML 编辑帖子,我也可以看看它,看看我能不能把它拼凑起来。
    • 我添加了 HTML 的 和更多原始 JS,即触发所有内容的按键处理程序。再次感谢。也许我确实在某个地方犯了一个愚蠢的拼写错误......
    • 我用您在上面发布的内容制作了一个 jsfiddle 示例,据我所知它可以正常工作:jsfiddle.net/7h8ra 您是否在 $(document).ready(function(){ ... }) 中围绕您的 jQuery
    • 是的,一切都在文档准备功能中。我一定是丢了一个支架什么的。我想这是一个关于发布完整代码重要性的教训。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多