Javascript 如果未选中子节点,则未选中父节点

Javascript 如果未选中子节点,则未选中父节点,javascript,jquery,checkbox,Javascript,Jquery,Checkbox,如果其中一个子节点未选中,则未选中的父节点上存在问题。但我试图搜索解决方案,但没有一个解决方案对我的代码起作用 我在这里引用嵌套的checkbox函数 下面是我的代码示例: <ul> <li> <label><input type="checkbox" data-id="All Master" data-name="All Master" id="myCheckBox0" onchange="checkDisabled(testi

如果其中一个子节点未选中,则未选中的父节点上存在问题。但我试图搜索解决方案,但没有一个解决方案对我的代码起作用

我在这里引用嵌套的checkbox函数

下面是我的代码示例:

<ul>
    <li>
        <label><input type="checkbox" data-id="All Master" data-name="All Master" id="myCheckBox0" onchange="checkDisabled(testing);"/> All Kedai Kiosk On Master Mode</label>
        <ul>

            <li>
                <label><input type="checkbox" data-id="Terengganu" data-name="Terengganu" id="myCheckBox76" onchange="checkDisabled(testing);"/> Terengganu</label>
                <ul id="navlist">
                    <li><label><input type="checkbox" data-id="Kiosk 63" data-name="Kiosk 63" id="myCheckBox77" onchange="checkDisabled(testing);"/> Kiosk 63</label></li>
                    <li><label><input type="checkbox" data-id="Kiosk 64" data-name="Kiosk 64" id="myCheckBox78" onchange="checkDisabled(testing);"/> Kiosk 64</label></li>
                </ul>
            </li>
        </ul>
    </li>
</ul>
  • 主模式下的所有科代信息亭
    • 丁加奴
      • 63号检查亭
      • 64号亭
我想要的是,当我取消检查63号亭时,作为父母的丁加奴也将被取消检查。我也在使用从网站下载的jquery.deepcheckbox.js。为了实现这一目标,我应该改变什么?谢谢

编辑: 我在这里复制javascript代码。为了实现父项取消选中功能,有什么需要更改的吗?谢谢

代码如下:

(function ($) {
  var defaults = {
      listItemBefore: '<span class="item">',
      listItemAfter: '</span>',
      listItemsDivider: ', ',
      labelExceptBefore: ' (except ',
      labelExceptAfter: ')',
      labelExceptBetween: ', ',
      labelNothingIsSelected: 'Nothing is selected'
    },
    instances = [];

  $.fn.deepcheckbox = function (options) {
    if (instances.indexOf(this.selector) < 0) {
      var tree = _buildTree(this);
      _bindCheckboxes(tree, function (item, value) {
        if (item.children) {
          _setValueToChildren(item.children, value);
        }
      });

      if (!options) {
        options = {};
      }

      options = $.extend(defaults, options);

      if (options.readableListTarget) {
        $(options.readableListTarget).html(options.labelNothingIsSelected);

        _bindCheckboxes(tree, function () {
          var items = [],
            except = [],
            output = [];

          function _dig (branch, level, skipAdding) {
            if (!level) {
              level = 0;
            }

            for (var i = 0, len = branch.length; i < len; i++) {
              if (branch[i].el.prop('checked')) {
                var value = options.listItemBefore.replace('{{id}}', branch[i].el.data('id')) + branch[i].el.data('name'),
                  exceptCount = 0;

                if (branch[i].children) {
                  for (var j = 0, lenJ = branch[i].children.length; j < lenJ; j++) {
                    if (!branch[i].children[j].el.prop('checked')) {
                      except.push(branch[i].children[j].el.data('id'));
                      if (exceptCount === 0) {
                        value += options.labelExceptBefore;
                      }
                      if (exceptCount > 0) {
                        value += options.labelExceptBetween;
                      }
                      value += branch[i].children[j].el.data('name');
                      exceptCount++;
                    }
                  }
                  if (exceptCount > 0) {
                    value += options.labelExceptAfter;
                  }
                }

                value += options.listItemAfter;

                if (level > 0 && branch[i].el.prop('checked') && !branch[i].parent.prop('checked')) {
                  skipAdding = false;
                }

                if (!skipAdding || exceptCount > 0) {
                  output.push(value);
                  items.push(branch[i].el.data('id'));
                }
              }

              if (branch[i].children) {
                _dig(branch[i].children, level + 1, true);
              }
            }
            return output.join(options.listItemsDivider);
          }

          var digged = _dig(tree);
          $(options.readableListTarget).html((digged.length > 0) ? digged : options.labelNothingIsSelected);

          if (options.onChange && typeof options.onChange === 'function') {
            options.onChange(items, except);
          }
        });
      }

      instances.push(this.selector);
    }
  };

  function _buildTree ($anchor, $parent) {
    var output = [],
      rootItems = $anchor.find('ul:first > li');

    for (var i = 0, len = rootItems.length; i < len; i++) {
      var $element = $(rootItems[i]).find('input[type=checkbox]:first'),
        id = _guId();

      if (!$element.data('id')) {
        $element.data('id', id);
      }

      if (!$element.data('name')) {
        $element.data('name', id);
      }

      var branch = {
          el: $element
        },
        children = _buildTree($(rootItems[i]), $element);

      if (children) {
        branch.children = children;
      }

      if ($parent) {
        branch.parent = $parent;
      }

      output.push(branch);
    }

    return output.length > 0 ? output : false;
  }

  function _bindCheckboxes (tree, callback) {
    for (var i = 0, len = tree.length; i < len; i++) {
      (function (item) {
        $(item.el).on('change', function () {
          callback(item, $(this).prop('checked'));
        });

        if (item.children) {
          _bindCheckboxes(item.children, callback);
        }
      }(tree[i]));
    }
  }

  function _setValueToChildren (tree, value) {
    for (var i = 0, len = tree.length; i < len; i++) {
      tree[i].el.prop('checked', value);
      if (tree[i].children) {
        _setValueToChildren(tree[i].children, value);
      }
    }
  }

  function _guId () {
    function s4 () {
      return Math.floor((1 + Math.random()) * 0x10000)
        .toString(16)
        .substring(1);
    }

    return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
  }
})(jQuery);
(函数($){
var默认值={
listItemBefore:“”,
listItemAfter:“”,
listItemsDivider:',',
labelExceptBefore:'(除',
labelExceptAfter:')',
labelExceptBetween:',',
labelNothingIsSelected:“未选择任何内容”
},
实例=[];
$.fn.deepcheckbox=函数(选项){
if(instances.indexOf(this.selector)<0){
var-tree=\u buildTree(this);
_绑定复选框(树、函数(项、值){
if(项目.子项){
_将值设置为子项(item.children,value);
}
});
如果(!选项){
选项={};
}
选项=$.extend(默认值,选项);
if(options.readableListTarget){
$(options.readableListTarget).html(options.labelnothingselected);
_绑定复选框(树、函数(){
var项目=[],
除=[],
输出=[];
功能(分支、级别、填充){
如果(!级别){
级别=0;
}
对于(变量i=0,len=branch.length;i0){
value+=options.labelExceptBetween;
}
value+=branch[i]。children[j]。el.data('name');
exceptCount++;
}
}
如果(例外计数>0){
value+=options.labelExceptAfter;
}
}
value+=options.listItemAfter;
如果(级别>0&&branch[i].el.prop('checked')&&branch[i].parent.prop('checked')){
skippadding=false;
}
如果(!Skippadding | | exceptCount>0){
输出推送(值);
items.push(分支[i].el.data('id');
}
}
if(分支[i].子级){
_挖掘(分支[i]。子级,级别+1,真);
}
}
返回output.join(options.listItemsDivider);
}
var digged=_dig(树);
$(options.readableListTarget).html((digged.length>0)?digged:options.labelnothingselected);
if(options.onChange&&typeof options.onChange=='function'){
选项。onChange(项目除外);
}
});
}
实例.push(this.selector);
}
};
函数_buildTree($anchor,$parent){
var输出=[],
rootItems=$anchor.find('ul:first>li');
for(var i=0,len=rootItems.length;i0?输出:false;
}
函数绑定复选框(树、回调){
for(var i=0,len=tree.length;i
我的测试选择部分:

<div>
                            <p>Selected items (readable): <span class="selected-readable"></span></p>
                            <p>Selected items: <span class="selected">[]</span></p>
                            <p>Excepted items: <span class="excepted">[]</span></p>
                        </div>

选定项目(可读):

选定项目:[]

例外项目:[]

请试试这个

$('ul:checkbox')。绑定('click',函数(){
var$chk=$(此),$li=
    $(document).ready(function(){
    $('body').on('click', 'input[type="checkbox"]', function(){
        $this = $(this)
        var flag = true
        $.each($this.closest('ul').find('input'), function(){

            if ($(this).prop('checked') == false){
                flag = false}
        });

        if(flag){
            $this.closest('ul').closest('li').find('input').first().prop('checked', true);

            if ($this.closest('ul').closest('li').closest('ul').closest('li').length > 0){ 
                document.aa = $this.closest('ul').closest('li').closest('ul').closest('li').find('ul input')
                $.each( $this.closest('ul').closest('li').closest('ul').closest('li').find('ul input'), function(){

                    if ($(this).prop('checked') == false){
                        flag = false}
                });
                if(flag){$this.closest('ul').closest('li').closest('ul').closest('li').find('input').first().prop('checked', true);}
        }}
            else{
        parents = $this.parents('ul li');
        parents.splice(0,1);

        for (var i = 0; i < parents.length; i++) {
            $this = $(parents[i]);

            $this.find('label').first().find('input').prop('checked', false);
        };
    }

    });
});