bootstrap-table-addrbar.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. (function (global, factory) {
  2. if (typeof define === "function" && define.amd) {
  3. define([], factory);
  4. } else if (typeof exports !== "undefined") {
  5. factory();
  6. } else {
  7. var mod = {
  8. exports: {}
  9. };
  10. factory();
  11. global.bootstrapTableAddrbar = mod.exports;
  12. }
  13. })(this, function () {
  14. 'use strict';
  15. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
  16. return typeof obj;
  17. } : function (obj) {
  18. return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
  19. };
  20. /**
  21. * @author: general
  22. * @version: 1.0.0
  23. * @website: note.generals.space
  24. * @email: generals.space@gmail.com
  25. * @github: https://github.com/generals-space/bootstrap-table-addrbar
  26. */
  27. (function ($) {
  28. 'use strict';
  29. /*
  30. * function: 获取浏览器地址栏中的指定参数.
  31. * key: 参数名
  32. * url: 默认为当前地址栏
  33. */
  34. function _GET(key, url) {
  35. var url = url ? url : window.location.search;
  36. /*
  37. * 注意这里正则表达式的书写方法
  38. * (^|&)key匹配: 直接以key开始或以&key开始的字符串
  39. * 同理(&|$)表示以&结束或是直接结束的字符串
  40. * ...当然, 我并不知道这种用法.
  41. */
  42. var reg = new RegExp('(^|&)' + key + '=([^&]*)(&|$)');
  43. var result = url.substr(1).match(reg);
  44. // if(result != null) return unescape(result[2]);
  45. if (result != null) return decodeURIComponent(result[2]);
  46. return null;
  47. }
  48. /*
  49. * function: 根据给定参数生成url地址
  50. * var dic = {name: 'genreal', age: 24}
  51. * var url = 'https://www.baidu.com?age=22';
  52. * _buildUrl(dic, url);
  53. * 将得到"https://www.baidu.com?age=24&name=genreal"
  54. * 哦, 忽略先后顺序吧...
  55. *
  56. * 补充: 可以参考浏览器URLSearchParams对象, 更加方便和强大.
  57. * 考虑到兼容性, 暂时不使用这个工具.
  58. */
  59. function _buildUrl(dict, url) {
  60. var url = url ? url : window.location.search;
  61. for (var key in dict) {
  62. var val = dict[key];
  63. // 搜索name=general这种形式的字符串(&是分隔符)
  64. var pattern = key + '=([^&]*)';
  65. var targetStr = key + '=' + val;
  66. /*
  67. * 如果目标url中包含了key键, 我们需要将它替换成我们自己的val
  68. * 不然就直接添加好了.
  69. */
  70. if (url.match(pattern)) {
  71. var tmp = new RegExp('(' + key + '=)([^&]*)', 'gi');
  72. url = url.replace(tmp, targetStr);
  73. } else {
  74. var seperator = url.match('[\?]') ? '&' : '?';
  75. url = url + seperator + targetStr;
  76. }
  77. }
  78. return url;
  79. }
  80. /*
  81. * 实例化bootstrapTable对象时, 合并用户选项
  82. */
  83. var _bootstrapTable = $.fn.bootstrapTable;
  84. $.fn.bootstrapTable = function (option) {
  85. if (!((typeof option === 'undefined' ? 'undefined' : _typeof(option)) === 'object')) {
  86. // 直接传入arguments不行, 因为它是一个类数组的对象,
  87. // 而bt对参数的处理是面向原生参数列表的.
  88. // 目前来看, bt还没有超过2个参数的方法, 暂时先这么用着
  89. return _bootstrapTable.call(this, arguments[0], arguments[1]);
  90. }
  91. // 拥有addrbar选项并且其值为true的才会继续执行
  92. if (!(option.hasOwnProperty('addrbar') && option.addrbar == true)) return _bootstrapTable.call(this, option);
  93. // 标志位, 初始加载后关闭
  94. option._addrbarInit = true;
  95. var _prefix = option.addrPrefix || '';
  96. var _defaults = _bootstrapTable.defaults;
  97. // 优先级排序: 用户指定值最优先, 未指定时从地址栏获取, 未获取到时采用默认值
  98. option.pageSize = option.pageSize || (_GET(_prefix + 'limit') ? parseInt(_GET(_prefix + 'limit')) : _defaults.pageSize);
  99. option.pageNumber = option.pageNumber || (_GET(_prefix + 'page') ? parseInt(_GET(_prefix + 'page')) : _defaults.pageNumber);
  100. option.sortOrder = option.sortOrder || (_GET(_prefix + 'order') ? _GET(_prefix + 'order') : _defaults.sortOrder);
  101. option.sortName = option.sortName || (_GET(_prefix + 'sort') ? _GET(_prefix + 'sort') : 'id');
  102. option.searchText = option.searchText || (_GET(_prefix + 'search') ? _GET(_prefix + 'search') : _defaults.searchText);
  103. option._onLoadSuccess = option.onLoadSuccess;
  104. option.onLoadSuccess = function (data) {
  105. // md, 这里的this是option是什么鬼(好像貌似就是option...ok, 当我没说)
  106. var opts = this;
  107. // 页面初始加载不必改写url
  108. if (opts._addrbarInit) {
  109. opts._addrbarInit = false;
  110. } else {
  111. var params = {};
  112. params[_prefix + 'page'] = opts.pageNumber, params[_prefix + 'limit'] = opts.pageSize, params[_prefix + 'order'] = opts.sortOrder, params[_prefix + 'sort'] = opts.sortName, params[_prefix + 'search'] = opts.searchText;
  113. // h5提供的修改浏览器地址栏的方法
  114. window.history.pushState({}, '', _buildUrl(params));
  115. }
  116. if (option._onLoadSuccess) option._onLoadSuccess.call(this, data);
  117. };
  118. return _bootstrapTable.call(this, option);
  119. };
  120. })(jQuery);
  121. });