mtree.sea.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. define(function(require, exports, module) {
  2. require('./mtree.css');
  3. module.exports = {
  4. init: function(DOM, opts) {
  5. var checked = new Array();
  6. var opts = $.extend({
  7. script: '/plugins/region/data.php', //请求脚本地址
  8. input: '',
  9. disableIds: '',
  10. callback: function(ids, data) {
  11. $(opts.input).val(ids);
  12. }
  13. }, opts);
  14. $.ajaxSetup({cache: true});
  15. $.getJSON(opts.script, function(data) {
  16. var els = render(data);
  17. $(DOM).html('<ul class="sc-mtree">'+els+'</ul><div class="clearfix"></div>');
  18. $(document).bind('click', function(e) {
  19. var els = $(e.target);
  20. if (els.parents('.sc-mtree-item').length == 0) {
  21. $('.sc-mtree-item').removeClass('active');
  22. }
  23. });
  24. $('.sc-mtree-switch', $(DOM)).click(function() {
  25. if ($(this).parents('.sc-mtree-item').hasClass('active')) {
  26. $(this).parents('.sc-mtree-item').removeClass('active');
  27. } else {
  28. $('.sc-mtree-item', $(DOM)).removeClass('active');
  29. $(this).parents('.sc-mtree-item').addClass('active');
  30. }
  31. });
  32. $('input[type=checkbox]', $(DOM)).on('change', function(){
  33. checkedIpt(this);
  34. //滤空
  35. var arr = new Array();
  36. for(id in checked) {
  37. if (checked[id]) { arr.push(checked[id]); }
  38. }
  39. opts.callback(arr, data);
  40. });
  41. for(idx in opts.disableIds) {
  42. $('#sc-mtree-ipt-'+opts.disableIds[idx]).attr('checked', true).attr('disabled', true);
  43. $('#sc-mtree-'+opts.disableIds[idx]+' .sc-mtree-childs input').attr('checked', true).attr('disabled', true);
  44. $('input', $('#sc-mtree-ipt-'+opts.disableIds[idx]).parents('.sc-mtree-item').children('.sc-mtree-item-box')).attr('disabled', true);
  45. };
  46. //默认值
  47. var inputValues = $(opts.input).val() ? $(opts.input).val().split(',') : 0;
  48. for(idx in inputValues) {
  49. var id = inputValues[idx];
  50. $('#sc-mtree-ipt-'+id).attr('checked', true);
  51. $('#sc-mtree-ipt-'+id).trigger("change");
  52. }
  53. $('input:disabled', $(DOM)).each(function() {
  54. var id = $(this).data('extend').id;
  55. var total1 = $('#sc-mtree-'+id+' .sc-mtree-childs input').length;
  56. var total2 = $('#sc-mtree-'+id+' .sc-mtree-childs input:checked').length;
  57. if (total1 == total2) {
  58. $(this).attr('checked', true);
  59. }
  60. });
  61. });
  62. //Checkbox 单个选中
  63. $.fn.checkItem = function (checkAllIpt, groupIpt, controlBtn) {
  64. var flag = $(groupIpt+':checked').length ? true : false;
  65. var checkAllFlag = $(groupIpt+':checked').length == $(groupIpt).length ? true : false;
  66. $(checkAllIpt).attr('checked', checkAllFlag);
  67. };
  68. function checkedIpt(obj) {
  69. var flag = $(obj).is(":checked") ? true : false;
  70. var extend = $(obj).data('extend');
  71. var id = $.inArray(extend.id, checked);
  72. var pid = $.inArray(extend.parent_id, checked);
  73. if (!$(obj).parents('.sc-mtree-childs').length) { //根级
  74. $('#sc-mtree-'+extend.id+' > .sc-mtree-childs input:not(:disabled)').prop('checked', flag);
  75. var count = $('#sc-mtree-'+extend.id+' > .sc-mtree-childs input:not(:disabled):checked').length;
  76. if (count > 0) $('#sc-mtree-'+extend.id+' .sc-mtree-checked-count').text('('+count+')');
  77. else $('#sc-mtree-'+extend.id+' .sc-mtree-checked-count').empty();
  78. $('#sc-mtree-'+extend.id+' > .sc-mtree-childs input:not(:disabled)').each(function() {
  79. var id = $(this).data('extend').id;
  80. var idx = $.inArray(id, checked);
  81. delete checked[idx];
  82. });
  83. if ($(obj).is(":checked")) checked.push(extend.id);
  84. else delete checked[id];
  85. } else { //子级
  86. var groupIpt = '#sc-mtree-'+extend.parent_id+' > .sc-mtree-childs input:not(:disabled)';
  87. var flag = $(groupIpt+':checked').length ? true : false;
  88. var checkAllFlag = $(groupIpt+':checked').length == $(groupIpt).length ? true : false;
  89. $('#sc-mtree-'+extend.parent_id+' > .sc-mtree-item-box input').prop('checked', checkAllFlag);
  90. var count = $('#sc-mtree-'+extend.parent_id+' > .sc-mtree-childs input:not(:disabled):checked').length;
  91. var total = $('#sc-mtree-'+extend.parent_id+' > .sc-mtree-childs input').length;
  92. var sChecked = new Array();
  93. if (count > 0) $('#sc-mtree-'+extend.parent_id+' .sc-mtree-checked-count').text('('+count+')');
  94. else $('#sc-mtree-'+extend.parent_id+' .sc-mtree-checked-count').empty();
  95. //计算选中
  96. delete checked[pid];
  97. $('#sc-mtree-'+extend.parent_id+' > .sc-mtree-childs input:not(:disabled)').each(function() {
  98. var id = $(this).data('extend').id;
  99. var idx = $.inArray(id, checked);
  100. if ($(this).is(":checked")) sChecked.push(id);
  101. delete checked[idx]; //删除选中子类
  102. });
  103. if (count == total) { //全选
  104. checked.push(extend.parent_id);
  105. } else {
  106. for(idx in sChecked) {
  107. checked.push(sChecked[idx]);
  108. }
  109. }
  110. }
  111. }
  112. function render(data) {
  113. var els = '';
  114. $.each(data, function(i, item) {
  115. var extend = new Object();
  116. for(key in item) {
  117. if (key == 'childnotes') continue;
  118. extend[key] = item[key];
  119. }
  120. extend = JSON.stringify(extend);
  121. els += '<li id="sc-mtree-'+item.id+'" class="sc-mtree-item">';
  122. els += '<p class="sc-mtree-item-box"><label><input id="sc-mtree-ipt-'+item.id+'" type="checkbox" data-extend=\''+extend+'\'>'+item.name+'</label>';
  123. if (item.childnotes) {
  124. els += '<span class="sc-mtree-checked-count"></span>';
  125. els += '<span class="sc-mtree-switch"></span></p>';
  126. els += '<ul class="sc-mtree-childs">'+render(item.childnotes)+'</ul>';
  127. } else {
  128. els += '</p>';
  129. }
  130. els += '</li>';
  131. });
  132. return els;
  133. }
  134. }
  135. };
  136. })