editArea.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. // 后端数据结构
  2. var areaData = {
  3. "data": {
  4. "area": {
  5. // "北京": [],
  6. // "河南": [
  7. // "洛阳市",
  8. // "驻马店市",
  9. // "周口市",
  10. // // "郑州市"
  11. // ],
  12. // "澳门": [],
  13. // "甘肃": []
  14. },
  15. "buyset": {
  16. "areacount": -1,
  17. "buyerclasscount": 11,
  18. "citys": {
  19. // "河南": 4
  20. }
  21. },
  22. "industry": [
  23. "党委办",
  24. "公共资源交易",
  25. "公安",
  26. "出版广电",
  27. "国资委",
  28. "地震",
  29. "安监",
  30. "工商",
  31. "法院",
  32. "电信行业",
  33. "财政"
  34. ]
  35. },
  36. "errMsg": "",
  37. "success": true
  38. }
  39. //加载数据
  40. function getData() {
  41. $DoPost("/subscribepay/editSub/getSubBuyMsg", {}, function (r) {
  42. if (r.success) {
  43. areaData = r;
  44. }
  45. }, false);
  46. }
  47. // 渲染城市方法
  48. function createMoreCity(arr) {
  49. var tempHtml = arr.map(function (v) {
  50. return '<button class="city">' + v.name + '</button>'
  51. }).join('')
  52. return tempHtml
  53. }
  54. // 省下拉市事件
  55. function slideFun(obj) {
  56. if (obj.next('.tab_content:not(:animated)').css("display") == "block") {
  57. obj.children().children('i').css({
  58. "display": "inline-block",
  59. "transform": "rotate(0)"
  60. })
  61. } else {
  62. obj.children().children('i').css({
  63. "display": "inline-block",
  64. "transform": "rotate(-180deg)"
  65. })
  66. }
  67. obj.toggleClass('selected').next('.tab_content:not(:animated)').slideToggle(500)
  68. obj.parent().siblings().children('.tab').removeClass('selected');
  69. }
  70. var obj
  71. // 改变选择结果方法
  72. function getResult() {
  73. obj = {};
  74. //$('.result_name').empty();
  75. $('.province').each(function () {
  76. let provinceText = $(this).text().trim();//省份名称
  77. let isChecked = $(this).children('.checkbox').is(':checked');
  78. let isHalf = $(this).children('.checkbox').hasClass('half');
  79. let arr = [];
  80. if (isChecked) {
  81. obj[provinceText] = [];
  82. } else if (isHalf && !isChecked) {
  83. let $that = $(this);
  84. obj[$that.text().trim()] = [];
  85. $that.parent().siblings().find('.city').each(function () {
  86. let parent = $(this).parent().siblings().find('.province').text().trim();
  87. if ($(this).is('.active') && parent == $that.text().trim()) {
  88. arr.push($(this).text().trim())
  89. }
  90. })
  91. obj[$that.text().trim()] = arr
  92. }
  93. })
  94. $('count').html($('.checkbox:not(.other):checked').length);
  95. //$('.result_name').append(getAreaClassArr_index(obj).join("、"));
  96. //校验是否修改
  97. if (theSameAs(obj) || $.isEmptyObject(obj)) {
  98. $('#enter').attr("disabled", "disabled");
  99. } else {
  100. $('#enter').removeAttr("disabled");
  101. }
  102. }
  103. // 初始化页面方法
  104. function init() {
  105. let p = areaData.data.area;
  106. let count = areaData.data.buyset.citys;
  107. // 1.渲染城市列表
  108. $(".select-area-box ul li:not('.index')").each(function () {
  109. var text = $(this).find(".province").text().trim()
  110. var data = null
  111. chinaMapJSON.some(function (v) {
  112. data = v
  113. return v.name.indexOf(text) !== -1
  114. })
  115. var box = $(this).find('div.tab_content')
  116. var html = createMoreCity(data.city)
  117. box.html(html)
  118. })
  119. // 2.当areacount == -1时,全国为选中状态,为正数时为选中的省份数目,全国选项不显示
  120. let pLength = Object.keys(areaData.data.area).length;
  121. let cLength = Object.keys(areaData.data.buyset.citys).length
  122. console.log(pLength, cLength)
  123. if (areaData.data.buyset.areacount == -1 && pLength == 0 && cLength == 0) {
  124. // 当购买的全国切选中的是全国时
  125. // $('.optional_count').html("可选择全部区域")
  126. //$('.all_area').show()
  127. $('.optional_count').hide()
  128. $('.total').html('34')
  129. $('.count').html('34')
  130. $('.tab.whole').parent('li').show();
  131. $('.checkbox.other').prop('checked', true);
  132. // $('.checkbox:not(.other)').attr('disabled',true)
  133. //$('.result_name').append(`<span>全国</span>`);
  134. } else if (areaData.data.buyset.areacount == -1 && pLength != 0) {
  135. // 当购买的全国而没有选择全国,选择部分省市时
  136. //$('.all_area').show();
  137. $('.province').removeAttr('data-count');
  138. $('.optional_count').hide();
  139. $('.total').html('34');
  140. initResult()
  141. } else {
  142. //$('.all_area').hide()
  143. $('.optional_count').show()
  144. $('.total').html(areaData.data.buyset.areacount)
  145. $('.tab.whole').parent('li').hide();
  146. // $('.checkbox.other').attr('disabled',true);
  147. initResult()
  148. }
  149. }
  150. function initResult() {
  151. let isAll = areaData.data.buyset.areacount;
  152. let p = areaData.data.area;
  153. let count = areaData.data.buyset.citys;
  154. // 渲染已选择结果
  155. for (const k in p) {
  156. console.log(p[k], k)
  157. if (p[k].length == 0) {
  158. $('.province').each(function () {
  159. let t = $(this).text().trim();
  160. if (k == t && p[k].length == 0) {
  161. // 如果购买的是全省,则不可点击下拉事件(不可修改城市)
  162. if (isAll != -1) {
  163. $(this).parent().siblings().children('.city').addClass('active').attr('disabled', true);
  164. $(this).parent('.tab').parent('li').siblings().find('.checkbox:not(.half)').parents('.tab').unbind('click')
  165. } else {
  166. $(this).parent().siblings().children('.city').addClass('active').removeAttr('disabled')
  167. }
  168. $(this).children('.checkbox').prop('checked', true)
  169. }
  170. })
  171. } else {
  172. console.log(k, p[k].length)
  173. $('.city').each(function () {
  174. let t = $(this).text().trim();
  175. p[k].forEach(v => {
  176. // console.log(v,t)
  177. if (v == t) {
  178. let that = $(this).parents('li').find('.tab:not(.municipality)');
  179. console.log("v==t")
  180. // 如果是可修改城市的省份,则可以进行下拉展示
  181. that.bind('click', function () {
  182. slideFun($(this));
  183. })
  184. $(this).addClass('active').parent().siblings('.tab').find('input').addClass('half');
  185. return;
  186. }
  187. })
  188. })
  189. for (const c in count) {
  190. if (p[k].length >= count[c]) {
  191. if (isAll != -1) {
  192. $('.city:not(.active)').attr('disabled', true)
  193. } else {
  194. $('.city:not(.active)').removeAttr('disabled')
  195. }
  196. }
  197. }
  198. }
  199. }
  200. // 添加可选择城市文字 和自定义属性值
  201. if (areaData.data.buyset.areacount != -1) {
  202. for (const c in count) {
  203. $('.province').each(function () {
  204. let t = $(this).text().trim();
  205. if (c == t) {
  206. $(this).attr("data-count", count[c]);
  207. $(this).after(`<em class="optional">可选择 ${count[c]} 个市</em>`)
  208. let that = $(this).parent('.tab:not(.municipality)');
  209. that.bind('click', function () {
  210. slideFun($(this));
  211. })
  212. }
  213. })
  214. }
  215. }
  216. //$('.result_name').append(getAreaClassArr_index(areaData.data.area).join("、"));
  217. $('.count').html($('.checkbox:not(.other):checked').length)
  218. // 如果选中的省份数量等于购买的省份数量,则将其他未选中的省份禁用
  219. if ($('.checkbox:not(.other):checked').length == $('.total').html()) {
  220. $('.checkbox:not(:checked)').attr('disabled', true);
  221. }
  222. $('#enter').attr("disabled", "disabled");
  223. }
  224. $(function () {
  225. // 省下拉事件
  226. $('.tab:not(.municipality)').on('click', function () {
  227. if ($(this).next('.tab_content:not(:animated)').css("display") == "block") {
  228. $(this).children().children('i').css({
  229. "display": "inline-block",
  230. "transform": "rotate(0)"
  231. })
  232. } else {
  233. $(this).children().children('i').css({
  234. "display": "inline-block",
  235. "transform": "rotate(-180deg)"
  236. })
  237. }
  238. $(this).toggleClass('selected').next('.tab_content:not(:animated)').slideToggle(500)
  239. $(this).parent().siblings().children('.tab').removeClass('selected');
  240. });
  241. getData();
  242. // 初始化
  243. init();
  244. /**** 点击checkbox实现onchange事件 *****/
  245. // 1.点击全国按钮onchange事件;
  246. $('.checkbox.other').on('change', function () {
  247. let isChecked = $(this).is(':checked');
  248. if (isChecked) {
  249. $('.count').html('34')
  250. $('.checkbox:not(.other)').prop('checked', false).removeClass('half')
  251. $('.city').removeClass('active');
  252. $('.tab_content').slideUp()
  253. getResult()
  254. } else {
  255. $('.checkbox:not(.other)').removeAttr('disabled')
  256. $('.city').removeAttr('disabled')
  257. getResult()
  258. }
  259. })
  260. // 2.点击非全国按钮onchange事件;
  261. $('.checkbox:not(.other)').on('change', function () {
  262. $('.checkbox.other').prop('checked', false);
  263. let checkedLength = $('.checkbox:checked').length;
  264. let totalLength = $('.total').text();
  265. $('.count').html(checkedLength)
  266. if (checkedLength < totalLength) {
  267. $('.checkbox:not(.other)').removeAttr('disabled')
  268. getResult()
  269. } else {
  270. $('.checkbox:not(:checked)').attr('disabled', true)
  271. getResult()
  272. }
  273. if ($(this).is(':checked')) {
  274. if (areaData.data.buyset.areacount != -1) {
  275. $(this).prop('checked', true).removeClass('half').parents('li').find('.city').addClass('active').attr('disabled', true);
  276. } else {
  277. $(this).prop('checked', true).removeClass('half').parents('li').find('.city').addClass('active');
  278. }
  279. getResult()
  280. } else {
  281. $(this).prop('checked', false).removeClass('half').parent().parent().siblings().find('.city').removeClass('active').removeAttr('disabled');
  282. getResult()
  283. }
  284. })
  285. // 3.点击半选按钮触发的事件
  286. $('.checkbox.half').on('change', function () {
  287. console.log($(this).is(':checked'))
  288. if ($(this).is(':checked')) {
  289. if (areaData.data.buyset.areacount != -1) {
  290. $(this).prop('checked', true).removeClass('half').parents('li').find('.city').addClass('active').attr('disabled', true);
  291. } else {
  292. $(this).prop('checked', true).removeClass('half').parents('li').find('.city').addClass('active');
  293. }
  294. getResult()
  295. } else {
  296. $(this).prop('checked', false);
  297. $(this).parent().parent().siblings().find('.city').removeClass('active').removeAttr('disabled');
  298. $(this).parent().siblings('.optional').show();
  299. getResult()
  300. }
  301. })
  302. // 4.点击城市按钮触发的事件
  303. $('.tab_content').on('click', '.city', function () {
  304. let count = $(this).parent().siblings().find('.province').attr('data-count');
  305. $(this).toggleClass('active');
  306. $('.checkbox.other').prop('checked', false);
  307. var isActive = $(this).parent().find('.city.active').length
  308. let cityLength = $(this).parent().find('.city').length
  309. if (isActive === cityLength) {//当选中的城市数量等于该省下所有城市总数时,即为全选
  310. var oInput = $(this).parents('li').find('input.checkbox')
  311. oInput.removeClass('half').prop('checked', true)
  312. getResult()
  313. } else {//半选
  314. $(this).parents('li').find('input.checkbox').addClass('half').prop("checked", false)
  315. if (isActive > 0 && isActive != count) {
  316. $(this).parents('li').find('input.checkbox').addClass('half');
  317. $(this).parent('div').find('.city:not(.active)').removeAttr('disabled')
  318. getResult()
  319. } else if (isActive > 0 && isActive == count) {
  320. $(this).parents('li').find('input.checkbox').addClass('half');
  321. $(this).parent('div').find('.city:not(.active)').attr('disabled', true)
  322. getResult()
  323. } else {
  324. $(this).parent('div').find('.city:not(.active)').removeAttr('disabled')
  325. $(this).parents('li').find('input.checkbox').removeClass('half').prop('checked', false)
  326. getResult()
  327. }
  328. }
  329. })
  330. // 阻止input checkbox选中取消 触发父元素下拉事件
  331. $('.checkbox').click(function (e) {
  332. e.stopPropagation();
  333. })
  334. // 锚点跳转
  335. $("body").on('click', '.slide a', function () {
  336. var s = $(this).html()
  337. if (s == '#') {
  338. return;
  339. }
  340. document.querySelector('#' + s).scrollIntoView({
  341. block: 'center'
  342. });
  343. })
  344. // 取消按钮事件 返回上一页
  345. $('#cancel').click(function () {
  346. // window.history.go(-1)
  347. //$('.result_name').empty()
  348. $('.checkbox').prop('checked', false).removeAttr('disabled');
  349. $('.city').removeClass('active');
  350. $('.tab_content').slideUp();
  351. $('.optional').remove()
  352. init();
  353. })
  354. // 确定修改事件
  355. $('#enter').click(function () {
  356. $('#enter').attr("disabled", "disabled");
  357. $DoPost("/subscribepay/editSub/submit", {
  358. "type": "area",
  359. "value": JSON.stringify(obj)
  360. }, function (r) {
  361. if (r.success) {
  362. window.location.replace('/front/vipsubscribe/submitEditSubFinish');
  363. }
  364. $('#enter').removeAttr("disabled");
  365. }, false);
  366. })
  367. });
  368. function theSameAs(select) {
  369. let tmp1 = getAreaClassArr(select);
  370. let tmp2 = getAreaClassArr(areaData.data.area);
  371. return (JSON.stringify(tmp1[0].sort()) === JSON.stringify(tmp2[0].sort())) && (JSON.stringify(tmp1[1].sort()) === JSON.stringify(tmp2[1].sort()));
  372. }