kaka.dmenu.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. kaka.dmenu = function(DOM, opts){
  2. var self = this;
  3. self.defaults = {
  4. htmlTpl: '<select></select>', //控件模板
  5. selected: 0, //选中项ID
  6. disableId: 0, //禁止ID加载
  7. defaultText: false, //默认文本
  8. firstText: false, //首个加载控件文本
  9. script: '', //请求脚本地址
  10. mapping: new Array(), //控件映射 [['province', '请选择省份...'], ['city', '请选择城市...']]
  11. callback: function(el, data) {}, //回调方法
  12. rootId: 0, //载入的根ID
  13. limit: 0
  14. };
  15. var opts = $.extend(true, self.defaults, opts);
  16. var data = new Object();
  17. var path = new Array();
  18. self.init = function(){
  19. //载入数据
  20. $.getJSON(opts.script, function(result) {
  21. data = result;
  22. el = self.loadNote(opts.rootId, $(this));
  23. if (opts.selected) {
  24. //name转换成ID
  25. if (!parseInt(opts.selected)) {
  26. var sId = 0;
  27. $.each(data, function(key, val) {
  28. if (opts.selected.indexOf(val.name) >= 0) {
  29. path = new Array();
  30. self.parsePath(val.id);
  31. path = path.reverse();
  32. var str = '';
  33. for(idx in path) {
  34. str += path[idx].name;
  35. }
  36. if (opts.selected == str) {
  37. sId = val.id;
  38. }
  39. }
  40. });
  41. opts.selected = sId;
  42. }
  43. path = new Array();
  44. self.parsePath(opts.selected);
  45. path = path.reverse();
  46. for(idx in path) {
  47. var id = path[idx].id;
  48. if (id != opts.rootId) {
  49. $('[value='+id+']', el).attr('selected', true);
  50. if (opts.limit != 0 && idx > opts.limit) return false;
  51. el = self.loadNote(id, el);
  52. }
  53. }
  54. }
  55. });
  56. }
  57. self.parsePath = function(id) {
  58. if (opts.rootId != id) {
  59. $.each(data, function(key, val) {
  60. if (id == val.id) {
  61. path.push(val);
  62. self.parsePath(val.parent_id);
  63. }
  64. });
  65. }
  66. }
  67. self.loadNote = function(id, obj) {
  68. var extend = data[id];
  69. var level = parseInt(extend ? extend.level : 1);
  70. $(obj).nextAll().remove();
  71. opts.callback(obj, extend ? extend : false);
  72. if (opts.limit != 0 && level >= opts.limit+1) return false;
  73. var mp = opts.mapping[level-1];
  74. var el = $(opts.htmlTpl)
  75. .data('level', level)
  76. .change(function() {
  77. if (!$(this).val()) return false;
  78. self.loadNote($(this).val(), $(this));
  79. });
  80. el.appendTo(DOM);
  81. if (opts.firstText && id == opts.rootId) {
  82. el.empty();
  83. $(el).append('<option value="-1">'+opts.firstText+'</option>');
  84. } else if (opts.defaultText) {
  85. el.empty();
  86. var defText = opts.defaultText;
  87. if (typeof(defText) == 'object') {
  88. var defText = defText[level-1];
  89. }
  90. $(el).append('<option value="-1">'+defText+'</option>');
  91. }
  92. if (mp) {
  93. if (typeof(mp) == 'object') {
  94. el.attr('name', mp[0]);
  95. if (mp[1]) {
  96. el.empty();
  97. el.append('<option value="-1">'+mp[1]+'</option>');
  98. }
  99. } else {
  100. el.attr('name', mp);
  101. }
  102. }
  103. var find = false;
  104. $.each(data, function(key, val) {
  105. if (opts.disableId != val.id) {
  106. if (val.parent_id == id) {
  107. $(el).append('<option value="'+val.id+'">'+val.name+'</option>');
  108. find = true;
  109. }
  110. }
  111. });
  112. if (!find) $(el).remove();
  113. return el;
  114. }
  115. self.init();
  116. return self;
  117. }