dmenu.async.sea.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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: '请选择...', //首个加载控件文本
  10. script: '', //请求脚本地址
  11. getPathScript: '',
  12. mapping: new Array(), //控件映射 [['province', '请选择省份...'], ['city', '请选择城市...']]
  13. callback: function(data) {}, //回调方法
  14. rootId: 0 //载入的根ID
  15. }, opts);
  16. var data = new Object();
  17. var path = new Array();
  18. //初始化
  19. if (opts.selected) {
  20. $.ajaxSetup({async:false});
  21. $.getJSON(opts.getPathScript, {cid:opts.selected}, function(data){
  22. var el = $(this);
  23. $.each(data, function(i, id){
  24. $('[value='+id+']', el).attr('selected', true);
  25. el = loadNote(id, el);
  26. });
  27. });
  28. } else {
  29. loadNote(opts.rootId, $(this));
  30. }
  31. function loadNote(id, obj) {
  32. var level = ($(obj).data('level') ? $(obj).data('level') : 0) + 1;
  33. $('.JS_DmenuSelect').each(function() {
  34. var lv = $(this).data('level');
  35. if (lv >= level) {
  36. $(this).remove();
  37. }
  38. });
  39. var mp = opts.mapping[level-1];
  40. var el = $(opts.htmlTpl)
  41. .data('level', level)
  42. .addClass('JS_DmenuSelect')
  43. .change(function() {
  44. if (!$(this).val()) return false;
  45. loadNote($(this).val(), $(this));
  46. });
  47. $.getJSON(opts.script, {pid:id}, function(data){
  48. if (level == 1) {
  49. el.appendTo(DOM);
  50. } else {
  51. el.insertAfter(obj);
  52. }
  53. if (opts.firstText && level == 1) {
  54. el.empty();
  55. $(el).append('<option value="-1">'+opts.firstText+'</option>');
  56. } else if (opts.defaultText) {
  57. el.empty();
  58. $(el).append('<option value="-1">'+opts.defaultText+'</option>');
  59. }
  60. if (mp) {
  61. el.attr('name', mp[0]);
  62. if (mp[1]) {
  63. el.empty();
  64. el.append('<option value="-1">'+mp[1]+'</option>');
  65. }
  66. }
  67. var find = false;
  68. $.each(data, function(key, val) {
  69. if (opts.disableId != val.id) {
  70. if (val.parent_id == id) {
  71. $(el).append('<option value="'+val.id+'" data-extend=\''+JSON.stringify(val)+'\'>'+val.name+'</option>');
  72. find = true;
  73. }
  74. }
  75. });
  76. if (!find) $(el).remove();
  77. opts.callback($(':selected', obj).data('extend') ? $(':selected', obj).data('extend') : false);
  78. });
  79. return el;
  80. }
  81. }
  82. };
  83. })