dmenu.sea.js 3.2 KB

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