Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当在具有单击事件的li中时,停止复选框被选中两次_Javascript_Jquery_Checkbox - Fatal编程技术网

Javascript 当在具有单击事件的li中时,停止复选框被选中两次

Javascript 当在具有单击事件的li中时,停止复选框被选中两次,javascript,jquery,checkbox,Javascript,Jquery,Checkbox,我正在用jQuery编写一个简单的下拉菜单,每个项都有一个复选框。当我点击li元素时,复选框被选中。但是,如果我单击复选框本身,它不会选择,因为它会被有效地选中两次。我怎样才能阻止这种事情发生 jsFiddle: HTML: <div id="dropdown">Channels</div> <ul class="droplist"> <li>News <input type="checkbox" /></li>

我正在用jQuery编写一个简单的下拉菜单,每个项都有一个复选框。当我点击
li
元素时,复选框被选中。但是,如果我单击复选框本身,它不会选择,因为它会被有效地选中两次。我怎样才能阻止这种事情发生

jsFiddle:

HTML:

<div id="dropdown">Channels</div>
<ul class="droplist">
    <li>News <input type="checkbox" /></li>
    <li>Sport <input type="checkbox" /></li>
    <li>Science <input type="checkbox" /></li>
    <li>Health <input type="checkbox" /></li>
    <li>All</li>
</ul>
div#dropdown {
    border: 1px solid #000;
    width: 150px;
    height: 20px;
    line-height: 20px;
    padding: 10px;
    cursor: pointer;
}

ul.droplist {
    display: none;
    width: 170px;
    border: 1px solid #000;
    border-bottom: none;
    list-style-type: none;
    padding: 0px;
    margin: 0px;
    position: absolute;
    background-color: #fff;
}

ul.droplist li {
    border-bottom: 1px solid #000;
    padding: 10px;
    cursor: pointer;
}

ul.droplist li input {
    float: right;
}
$(document).ready(function(){

    $("#dropdown").click(function() {
        $(this).next().slideToggle(200);
    });

    $(".droplist li").click(function(e) {
        // Toggle the checkbox
        var input = $(this).children("input");
        $(input).prop("checked", !$(input).prop("checked"));
    });

    $(".droplist li:last").click(function () {
        // Select all boxes
        var check = $('.droplist li input:not(:checked)').length;
        $(".droplist li input").prop("checked", check);
    });

});
JS:

<div id="dropdown">Channels</div>
<ul class="droplist">
    <li>News <input type="checkbox" /></li>
    <li>Sport <input type="checkbox" /></li>
    <li>Science <input type="checkbox" /></li>
    <li>Health <input type="checkbox" /></li>
    <li>All</li>
</ul>
div#dropdown {
    border: 1px solid #000;
    width: 150px;
    height: 20px;
    line-height: 20px;
    padding: 10px;
    cursor: pointer;
}

ul.droplist {
    display: none;
    width: 170px;
    border: 1px solid #000;
    border-bottom: none;
    list-style-type: none;
    padding: 0px;
    margin: 0px;
    position: absolute;
    background-color: #fff;
}

ul.droplist li {
    border-bottom: 1px solid #000;
    padding: 10px;
    cursor: pointer;
}

ul.droplist li input {
    float: right;
}
$(document).ready(function(){

    $("#dropdown").click(function() {
        $(this).next().slideToggle(200);
    });

    $(".droplist li").click(function(e) {
        // Toggle the checkbox
        var input = $(this).children("input");
        $(input).prop("checked", !$(input).prop("checked"));
    });

    $(".droplist li:last").click(function () {
        // Select all boxes
        var check = $('.droplist li input:not(:checked)').length;
        $(".droplist li input").prop("checked", check);
    });

});
您可以在复选框中选择事件的名称:

$(".droplist li :checkbox").click(function (e) {
    e.stopPropagation();
});
这将防止事件在DOM树中冒泡到父
li
元素(如您所说,它触发绑定到它的事件处理程序)


作为旁注,您可以修改代码以利用事件委派,这更有效,因为每个
li
元素只有一个事件处理程序,而不是一个。例如:

$(".droplist").on("click", "li", function (e) {
    // Toggle the checkbox
    var input = $(this).children("input");
    $(input).prop("checked", !$(input).prop("checked"));
});
有关更多详细信息,请参阅方法。

您可以在复选框中选择事件的名称:

$(".droplist li :checkbox").click(function (e) {
    e.stopPropagation();
});
这将防止事件在DOM树中冒泡到父
li
元素(如您所说,它触发绑定到它的事件处理程序)


作为旁注,您可以修改代码以利用事件委派,这更有效,因为每个
li
元素只有一个事件处理程序,而不是一个。例如:

$(".droplist").on("click", "li", function (e) {
    // Toggle the checkbox
    var input = $(this).children("input");
    $(input).prop("checked", !$(input).prop("checked"));
});

有关详细信息,请参阅该方法。

用标签包装复选框(标签与输入共享浏览器本机单击事件)


像这样,你应该没事。您的解决方案存在的问题是,当用户点击输入时,原生浏览器复选框函数和jQuery就会互相杀死。(浏览器选中复选框,jQuery取消选中)

用标签包装复选框(标签与输入共享浏览器本机单击事件)

像这样,你应该没事。您的解决方案存在的问题是,当用户点击输入时,原生浏览器复选框函数和jQuery就会互相杀死。(浏览器选中复选框,jQuery取消选中)