change_area.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. $(function () {
  2. // 后端数据结构
  3. var areaData = {
  4. 'data': {
  5. // 选择的数量
  6. 'area': {
  7. '北京': [],
  8. '河南': [
  9. '洛阳市',
  10. '驻马店市',
  11. '周口市',
  12. '郑州市'
  13. ],
  14. '湖南': ['长沙市'],
  15. '澳门': [],
  16. '甘肃': []
  17. },
  18. 'buyset': {
  19. // 购买的全省的数量(不带市)
  20. 'areacount': 5,
  21. 'buyerclasscount': 11,
  22. // 购买的城市
  23. 'newcitys': []
  24. }
  25. },
  26. 'errMsg': '',
  27. 'success': true
  28. };
  29. // 已经购买过的城市数量
  30. var alreadyBuy = {
  31. country: 0,
  32. province: 0,
  33. city: {
  34. // 一共买了多少个城市
  35. totalCount: 0,
  36. // 分布在几个省份
  37. pCount: 0
  38. }
  39. }
  40. // ----------------- 以下定义功能函数 ----------------------------
  41. function createMoreCity(arr) {
  42. var tempHtml = arr.map(function (v) {
  43. return '<button class="city">' + v.name + '</button>'
  44. }).join('')
  45. return tempHtml
  46. }
  47. // 数组求和
  48. function arrSum(arr) {
  49. var sum = 0
  50. arr.forEach(function (item, i) {
  51. sum += item
  52. })
  53. return sum
  54. }
  55. // 是否锁定按钮
  56. function isLockedTipButtons(f) {
  57. $('.tips_btn button.save-btn').prop('disabled', f)
  58. }
  59. // 省下拉市事件
  60. var isAnimating = false
  61. function slideFunc() {
  62. if (isAnimating) return
  63. isAnimating = true
  64. if ($(this).next('.tab_content:not(:animated)').css("display") == "block") {
  65. $(this).children().children('i').removeClass('rotate-arrow')
  66. } else {
  67. $(this).children().children('i').addClass('rotate-arrow')
  68. }
  69. $(this).toggleClass('selected').next('.tab_content:not(:animated)').slideToggle(500)
  70. $(this).parent().siblings().children('.tab').removeClass('selected');
  71. setTimeout(function () {
  72. isAnimating = false
  73. }, 500)
  74. }
  75. // 新增求值 ---- 统计数量,不做视图操作
  76. function getResult() {
  77. var selectedCount = {
  78. country: 0,
  79. province: 0,
  80. city: {
  81. // 一共选了多少个城市
  82. totalCount: 0,
  83. // 分布在几个省份
  84. pCount: 0
  85. }
  86. }
  87. // 获取所有点亮的城市的值
  88. var selected = getActiveCityDetail()
  89. if (Object.keys(selected).length === 0) {
  90. isLockedTipButtons(true)
  91. } else {
  92. isLockedTipButtons(false)
  93. }
  94. //是否需要升级
  95. if (needUpgrade(getBuySet(selected, areaData.data.industry), {
  96. areacount: areaData.data.buyset.areacount,
  97. citys: areaData.data.buyset.newcitys,
  98. buyerclasscount: areaData.data.buyset.buyerclasscount
  99. })[1]) {
  100. if (areaData.data.isTrial) {
  101. $(".result-selected .info-tip").text("已超出现订单购买范围,需购买");
  102. }
  103. $(".result-selected .info-tip").show();
  104. } else {
  105. $(".result-selected .info-tip").hide();
  106. }
  107. for (var p in selected) {
  108. if (p === '全国') {
  109. selectedCount = {
  110. country: -1,
  111. province: 0,
  112. city: {
  113. totalCount: 0,
  114. pCount: 0
  115. }
  116. }
  117. return setDataInResult(selectedCount);
  118. }
  119. if (selected[p].length === 0) {
  120. selectedCount.province++
  121. } else {
  122. selectedCount.city.pCount++
  123. selected[p].forEach(function (item, index) {
  124. selectedCount.city.totalCount++
  125. })
  126. }
  127. }
  128. setDataInResult(selectedCount);
  129. }
  130. function setDataInResult(selected) {
  131. // 已选择数量数据渲染
  132. if (selected.country === -1) {
  133. $('.result-selected .result-info .info-overview').text('全国')
  134. return
  135. } else {
  136. // 已选择数量
  137. var count = {
  138. p: selected.province + '个省',
  139. c: selected.city.totalCount + '个市',
  140. s: '分布在' + selected.city.pCount + '个省内'
  141. }
  142. if (selected.province === 0) {
  143. $('.result-selected .result-info .info-overview').text(count.c + '(' + count.s + ')')
  144. } else if (selected.city.totalCount === 0) {
  145. $('.result-selected .result-info .info-overview').text(count.p)
  146. } else {
  147. $('.result-selected .result-info .info-overview').text(count.p + '、' + count.c + '(' + count.s + ')')
  148. }
  149. }
  150. }
  151. // 点亮的城市数量详情(需要省和城市名称)
  152. function getActiveCityDetail() {
  153. var isWholeCountry = $('.tab.whole input').is(':checked')
  154. if (isWholeCountry) {
  155. // 选择全国
  156. var str = $('.area-list li .tab.whole .province').text().replace(/\s+ | [\r\n]/g, '')
  157. var obj = {}
  158. obj[str] = []
  159. return obj
  160. } else {
  161. var arr = []
  162. $('.area-list li:not(.index)').each(function (i, dom) {
  163. var $dom = $(dom)
  164. if ($dom.children('.tab').hasClass('whole')) return
  165. var isMunicipality = $dom.find('.tab').hasClass('municipality')
  166. var pName = $dom.find('.province').text().replace(/\s+ | [\r\n]/g, '')
  167. var selectedObj = {
  168. name: pName,
  169. children: []
  170. }
  171. // 是否是直辖市或自治区
  172. if (isMunicipality) {
  173. if ($dom.find('input:not([disabled])').is(':checked')) {
  174. arr.push(selectedObj)
  175. }
  176. } else {
  177. var allCitylength = $dom.find('button').length
  178. if ($dom.find('button.active').length === allCitylength) {
  179. arr.push(selectedObj)
  180. } else {
  181. $dom.find('button.active').each(function (c, buttonDOM) {
  182. var cName = $(buttonDOM).text().replace(/\s+ | [\r\n]/g, '')
  183. selectedObj.children.push(cName)
  184. })
  185. if (selectedObj.children.length) {
  186. arr.push(selectedObj)
  187. }
  188. }
  189. }
  190. })
  191. // 处理arr
  192. // [
  193. // {
  194. // name: '安徽',
  195. // children: ["合肥市", "蚌埠市", "阜阳市"]
  196. // },
  197. // {
  198. // name: '海南',
  199. // children: ["三亚市", "文昌市"]
  200. // },
  201. // {
  202. // name: '河南',
  203. // children: ["郑州市", "信阳市"]
  204. // }
  205. // ]
  206. var selectedCityDetail = {}
  207. arr.forEach(function (item, i) {
  208. selectedCityDetail[item.name] = item.children
  209. })
  210. return selectedCityDetail
  211. }
  212. }
  213. // 初始选择的城市恢复,根据传入的p恢复为Active蓝色按钮
  214. // 需要放到init之后
  215. function renderSelectedCityActive(p = {}) {
  216. for (const k in p) {
  217. if (k === '全国') {
  218. $('.area-list li:not(.index):eq(0)').find('input').trigger('click')
  219. return
  220. }
  221. if (p[k].length == 0) {
  222. // 购买的省份
  223. $('.province').each(function () {
  224. var t = $(this).text().trim();
  225. if (k == t && p[k].length == 0) {
  226. var li = $(this).parents('li')
  227. // 改变按钮状态
  228. li.find('.city').addClass('active')
  229. // 改变input的状态
  230. li.find('input.checkbox').prop('checked', true)
  231. }
  232. })
  233. } else {
  234. $('.city').each(function () {
  235. var t = $(this).text().trim();
  236. p[k].forEach(v => {
  237. if (v !== t) return
  238. // 改变按钮状态
  239. $this = $(this)
  240. $this.addClass('active')
  241. // 改变input的样式
  242. $this.parents('li').find('input.checkbox').addClass('opt')
  243. })
  244. })
  245. }
  246. }
  247. }
  248. function resetButtonLock(f) {
  249. $('#cancel').prop('disabled', f)
  250. }
  251. // 根据数据进行求总数 --- 上方已购买数据信息的初始化
  252. function initAlreadyBuy(buyset, citys) {
  253. if (buyset.areacount === -1) {
  254. $('.result-purchased .result-info .buy-set-info').text('全国')
  255. alreadyBuy = {
  256. country: -1,
  257. province: 0,
  258. city: {
  259. totalCount: 0,
  260. pCount: 0
  261. }
  262. }
  263. return
  264. } else {
  265. // 购买的全省的数量(不包含市)
  266. alreadyBuy.province = buyset.areacount;
  267. // 购买的城市总数量
  268. alreadyBuy.city.pCount = citys.length
  269. alreadyBuy.city.totalCount = arrSum(citys)
  270. var buySetInfo = {
  271. p: alreadyBuy.province + '个省',
  272. c: alreadyBuy.city.totalCount + '个市',
  273. s: '分布在' + alreadyBuy.city.pCount + '个省内'
  274. }
  275. if (alreadyBuy.province === 0) {
  276. $('.result-purchased .result-info .buy-set-info').text(buySetInfo.c + '(' + buySetInfo.s + ')')
  277. } else if (alreadyBuy.city.totalCount === 0) {
  278. $('.result-purchased .result-info .buy-set-info').text(buySetInfo.p)
  279. } else {
  280. $('.result-purchased .result-info .buy-set-info').text(buySetInfo.p + '、' + buySetInfo.c + '(' + buySetInfo.s + ')')
  281. }
  282. }
  283. }
  284. // 初始化方法
  285. function init() {
  286. var data = areaData.data
  287. var buyset = data.buyset;
  288. var citys = buyset.newcitys;
  289. initAlreadyBuy(buyset, citys)
  290. // 根据返回数据进行渲染(默认选中已选择的)
  291. renderSelectedCityActive(data.area)
  292. getResult()
  293. }
  294. // ----------------- 以下绑定事件 ----------------------------
  295. // 0.渲染城市列表
  296. $(".select-area-box ul li:not('.index')").each(function () {
  297. var text = $(this).find(".province").text().trim()
  298. var data = null
  299. chinaMapJSON.some(function (v) {
  300. data = v
  301. return v.name.indexOf(text) !== -1
  302. })
  303. var box = $(this).find('div.tab_content')
  304. var html = createMoreCity(data.city)
  305. box.html(html)
  306. })
  307. // fastClick初始化: https://github.com/ftlabs/fastclick
  308. FastClick.attach(document.body)
  309. // 1.省下拉市
  310. $(".select-area-box .tab:not(.municipality)").on('click', slideFunc)
  311. // 2.点击全国按钮onchange事件;
  312. $('.checkbox.other').on('change', function () {
  313. var isChecked = $(this).is(':checked')
  314. if (isChecked) {
  315. $(this).prop('checked', true);
  316. $('.checkbox:not(.other):not([disabled])').prop('checked', false).removeClass('opt');
  317. $('.city:not([disabled])').removeClass('active');
  318. $('.tab_content').slideUp();
  319. }
  320. getResult()
  321. })
  322. // 3.点击非全国按钮onchange事件
  323. $('.checkbox:not(.other)').on('change', function () {
  324. $('.checkbox.other').prop('checked', false);
  325. var isChecked = $(this).is(':checked');
  326. if (isChecked) {
  327. $(this).prop('checked', true).removeClass('opt');
  328. $(this).parents('li').find('.city').addClass('active');
  329. // 控制点击checkbox时候是否展开下方的城市列表
  330. // $(this).parent().parent('.tab:not(.municipality)').siblings('.tab_content').slideDown();
  331. } else {
  332. $(this).prop('checked', false);
  333. $(this).parents('li').find('.city').removeClass('active');
  334. }
  335. getResult();
  336. })
  337. // 4.点击城市按钮触发的事件
  338. $('.tab_content').on('click', '.city', function () {
  339. // 全国取消选中
  340. $('.checkbox.other').prop('checked', false);
  341. $(this).toggleClass('active')
  342. // 省下所有选中的地市数量
  343. var activeCityLength = $(this).parent().find('.city.active').length;
  344. // 省下一共有几个城市
  345. var cityLength = $(this).parent().find('.city').length;
  346. var oInput = $(this).parents('li').find('input.checkbox')
  347. if (activeCityLength === cityLength) {//当选中的城市数量等于该省下所有城市总数时,即为全选
  348. if ($(this).siblings('.city[disabled]').length === 0) {
  349. oInput.removeClass('opt').prop('checked', true)
  350. }
  351. } else if (activeCityLength === 0) {
  352. oInput.prop('checked', false).removeClass('opt')
  353. } else {//半选
  354. oInput.prop("checked", false).addClass('opt')
  355. }
  356. getResult();
  357. })
  358. // 5. 重置按钮点击事件
  359. $('.reset-btn').on('click', function () {
  360. alreadyBuy = {
  361. country: 0,
  362. province: 0,
  363. city: {
  364. // 一共买了多少个城市
  365. totalCount: 0,
  366. // 分布在几个省份
  367. pCount: 0
  368. }
  369. }
  370. $('.checkbox').prop('checked', false).removeAttr('disabled');
  371. $('.city').removeClass('active');
  372. $('input').removeClass('opt')
  373. $('.tab_content').slideUp();
  374. $('.tab .iconfont').removeClass('rotate-arrow')
  375. init();
  376. })
  377. // 6.锚点跳转
  378. $("body").on('click', '.slide a', function () {
  379. var s = $(this).html()
  380. if (s == '#') {
  381. return;
  382. }
  383. document.querySelector('#' + s).scrollIntoView({
  384. block: 'center'
  385. });
  386. })
  387. // 阻止input checkbox选中取消 触发父元素下拉事件
  388. $('.checkbox').click(function (e) {
  389. e.stopPropagation();
  390. })
  391. // ----------------------- 以下数据交互 ------------------
  392. function getDataWitXHR() {
  393. $DoPost('/subscribepay/vipsubscribe/getSubBuyMsg', {}, function (res) {
  394. if (!res.success) return
  395. areaData.data = res.data
  396. sessionStorage.setItem('sub_vip_state', JSON.stringify(res.data))
  397. init()
  398. })
  399. }
  400. var subVipState = sessionStorage.getItem('sub_vip_state')
  401. if (subVipState) {
  402. areaData.data = JSON.parse(subVipState)
  403. init()
  404. } else {
  405. getDataWitXHR()
  406. }
  407. // 确认按钮事件
  408. $('.save-btn').on('click', function () {
  409. // 获取点亮的城市详情
  410. areaData.data.area = getActiveCityDetail()
  411. sessionStorage.setItem('sub_vip_state', JSON.stringify(areaData.data))
  412. history.back()
  413. })
  414. // 获取点亮的城市的列表详情(带省名和城市名)
  415. // getActiveCityDetail()
  416. // 回显为蓝色激活样式
  417. // renderSelectedCityActive()
  418. })