|
| 1 | +(function () { |
| 2 | + if (!window.uccustomize) { |
| 3 | + window.uccustomize = {}; |
| 4 | + } |
| 5 | + |
| 6 | + if (!window.uccustomize.findproduct) { |
| 7 | + window.uccustomize.findproduct = { |
| 8 | + // 前一次 request 的 URL |
| 9 | + _previousURL: null, |
| 10 | + // 準備用來組 request 的參數 |
| 11 | + _params: null, |
| 12 | + _getPreviousURL: function () { |
| 13 | + return this._previousURL || window.location.href; |
| 14 | + }, |
| 15 | + // 從 url 中取出每個變數的值 |
| 16 | + _getParamsFromUrl: function (url) { |
| 17 | + if (url.indexOf('?') > 0) { |
| 18 | + var params = url.split('?')[1], |
| 19 | + pmap = {}, |
| 20 | + param, pkey, pval; |
| 21 | + // 沒有變數, 回傳空物件 |
| 22 | + if (!params) return pmap; |
| 23 | + // 以 & 分割變數 |
| 24 | + params = params.split('&'); |
| 25 | + // 跑過所有變數段落 |
| 26 | + for (var i = 0; i < params.length; i++) { |
| 27 | + // 取當前變數 |
| 28 | + param = params[i]; |
| 29 | + if (param.indexOf('=') > 0) { |
| 30 | + // 將參數分割為 key value |
| 31 | + pkey = param.split('=')[0] || ''; |
| 32 | + pval = param.split('=')[1] || ''; |
| 33 | + // 不處理 is_ajax |
| 34 | + if (pkey == 'is_ajax') continue; |
| 35 | + // 若未建過則建新陣列 |
| 36 | + if (!pmap[pkey]) { |
| 37 | + pmap[pkey] = pval.split(','); |
| 38 | + } else { |
| 39 | + // 否則連結新陣列 |
| 40 | + pmap[pkey] = pmap[pkey].concat(pval.split(',')); |
| 41 | + } |
| 42 | + } |
| 43 | + } |
| 44 | + return pmap; |
| 45 | + } |
| 46 | + // url 不帶 ?, 回傳空物件 |
| 47 | + return {}; |
| 48 | + }, |
| 49 | + // 找出選項帶的特定參數 |
| 50 | + _findSpecificParam: function (ori, curr) { |
| 51 | + var res = {}; |
| 52 | + |
| 53 | + for (var key in ori) { |
| 54 | + // 選項參數中無該參數 |
| 55 | + // 表示該參數即為此選項的參數 |
| 56 | + // 取消勾選後就會不見了 |
| 57 | + // 如 url 為 a=1&b=2 選項為 a=1 |
| 58 | + if (!curr[key]) { |
| 59 | + res[key] = ori[key][0]; |
| 60 | + return res; |
| 61 | + } |
| 62 | + var oparam = ori[key].slice(), |
| 63 | + cparam = curr[key].slice(), |
| 64 | + val, index; |
| 65 | + // 參數長度不同, 則找出不同的回傳 |
| 66 | + if (oparam.length != cparam.length) { |
| 67 | + for (var i = 0; i < oparam.length; i++) { |
| 68 | + val = oparam[i]; |
| 69 | + index = cparam.indexOf(val); |
| 70 | + // 不同的值在原參數內 |
| 71 | + // 如 url 為 a=1&b=2,3 選項為 a=1&b=2 |
| 72 | + if (index == -1) { |
| 73 | + res[key] = val; |
| 74 | + return res; |
| 75 | + } else { |
| 76 | + cparam.splice(index, 1); |
| 77 | + } |
| 78 | + } |
| 79 | + // 不同的值在選項參數內 |
| 80 | + // 如 url 為 a=1&b=2 選項為 a=1&b=2,3 |
| 81 | + res[key] = cparam[0]; |
| 82 | + return res; |
| 83 | + } |
| 84 | + // 若此參數在選項參數中一致則移除 |
| 85 | + // 如 url 為 a=1&b=2,3 選項為 a=1&b=2 |
| 86 | + // 則到此選項參數中的 a 會被移掉 |
| 87 | + delete curr[key]; |
| 88 | + } |
| 89 | + // 參數只存在於選項內, 回傳選項參數 |
| 90 | + // 如 url 為 a=1 選項為 a=1&b=2 |
| 91 | + for (key in curr) { |
| 92 | + res[key] = curr[key][0]; |
| 93 | + return res; |
| 94 | + } |
| 95 | + return {}; |
| 96 | + }, |
| 97 | + // 將一組參數加入目前參數 |
| 98 | + _addParam: function (param) { |
| 99 | + // 若目前無參數就初始化 |
| 100 | + if (!this._params) this._params = {}; |
| 101 | + // 跑過每個傳入的參數 key |
| 102 | + for (var key in param) { |
| 103 | + // 若目前參數無該 key, 建立空陣列 |
| 104 | + if (!this._params[key]) this._params[key] = []; |
| 105 | + // 將傳入參數值存入對應陣列 |
| 106 | + /* 如 |
| 107 | + { |
| 108 | + cat4: [1, 2, 3], |
| 109 | + effect: [4, 5] |
| 110 | + } |
| 111 | + */ |
| 112 | + this._params[key].push(param[key]); |
| 113 | + } |
| 114 | + }, |
| 115 | + // 由選取的選項建立要使用的參數 |
| 116 | + _buildParams: function () { |
| 117 | + var wgt = this, |
| 118 | + prevParams = this._getParamsFromUrl(this._getPreviousURL()); |
| 119 | + this._params = null; |
| 120 | + // 取得每一個被選取的選項 |
| 121 | + $('.group-box-body a') |
| 122 | + .filter(function () { |
| 123 | + return $(this).find('.custom-checkbox-checked')[0]; |
| 124 | + }).each(function () { |
| 125 | + // 找出選項帶的參數 |
| 126 | + var param = wgt._findSpecificParam(prevParams, |
| 127 | + wgt._getParamsFromUrl($(this).attr('s_href'))); |
| 128 | + // 加入到目前參數 |
| 129 | + wgt._addParam(param); |
| 130 | + }); |
| 131 | + }, |
| 132 | + // 初始化上方條件 |
| 133 | + _initConditions: function () { |
| 134 | + var wgt = this; |
| 135 | + // 關閉原本綁定的動作 |
| 136 | + $('.condition').off() |
| 137 | + .click(function(e){ |
| 138 | + e.preventDefault(); |
| 139 | + // 以自己帶的 url 找到對應的左方選項 |
| 140 | + var url = $(this).attr("s_href"), |
| 141 | + $opt = $('.group-box-body a[s_href="'+url+'"]'), |
| 142 | + $cbx = $opt.find('.custom-checkbox'); |
| 143 | + // 被點擊時, 移除左方選項的選取狀態 |
| 144 | + // 也移除本身的 dom 元素 |
| 145 | + $cbx.removeClass('custom-checkbox-checked') |
| 146 | + .removeClass('show'); |
| 147 | + $(this).remove(); |
| 148 | + // 若點擊時沒有按著 Ctrl 鍵 |
| 149 | + // 則更新頁面 |
| 150 | + if (!e.ctrlKey) { |
| 151 | + wgt.ajaxLoad(); |
| 152 | + } |
| 153 | + }); |
| 154 | + // 清除鈕 |
| 155 | + // 關閉原本綁定的動作 |
| 156 | + $('.clear').off(). |
| 157 | + click(function(e){ |
| 158 | + e.preventDefault(); |
| 159 | + // 移除所有上方選項 |
| 160 | + $('.condition').remove(); |
| 161 | + // 清除所有選取狀態 |
| 162 | + $('.custom-checkbox-checked') |
| 163 | + .removeClass('custom-checkbox-checked') |
| 164 | + .removeClass('show'); |
| 165 | + // 若點擊時沒有按著 Ctrl 鍵 |
| 166 | + // 則更新頁面 |
| 167 | + if (!e.ctrlKey) { |
| 168 | + wgt.ajaxLoad(); |
| 169 | + } |
| 170 | + }); |
| 171 | + }, |
| 172 | + // 更新頁面 |
| 173 | + ajaxLoad: function () { |
| 174 | + // 打開遮罩 |
| 175 | + loading(); |
| 176 | + // 建立參數 |
| 177 | + this._buildParams(); |
| 178 | + // 取得不帶參數的 url |
| 179 | + var n = window.location.href.split('?')[0] |
| 180 | + p = [], |
| 181 | + wgt = this; |
| 182 | + // 組出 ajax url |
| 183 | + n += '?'; |
| 184 | + for (var key in this._params) { |
| 185 | + // 將所有參數加入陣列 |
| 186 | + // 陣列 ['1', '2', '3'].join(',') => 字串 '1,2,3' |
| 187 | + p.push(key+'='+this._params[key].join(',')); |
| 188 | + } |
| 189 | + // 陣列 ['a=1', 'b=2'].join('&') => 字串 'a=1&b=2' |
| 190 | + n += p.join('&'); |
| 191 | + // 存下本次 URL |
| 192 | + this._previousURL = n; |
| 193 | + $.ajax({ |
| 194 | + url: n, |
| 195 | + type: "GET", |
| 196 | + data: { |
| 197 | + is_ajax: !0 |
| 198 | + }, |
| 199 | + success: function(n) { |
| 200 | + $(".product-filter-list").html(n); |
| 201 | + wgt.init(); |
| 202 | + closeLoading(); |
| 203 | + $("body,html").animate({ |
| 204 | + scrollTop: 200 |
| 205 | + }, 800); |
| 206 | + }, |
| 207 | + error: function() {} |
| 208 | + }) |
| 209 | + }, |
| 210 | + // 初始化全部 |
| 211 | + init: function () { |
| 212 | + var wgt = this; |
| 213 | + // 所有選項 |
| 214 | + // 移除原本綁定 |
| 215 | + $('.group-box-body a').off() |
| 216 | + .click(function(e){ |
| 217 | + // 點擊時 |
| 218 | + e.preventDefault(); |
| 219 | + // 找到選項下 checkbox |
| 220 | + var $cbx = $(this).find('.custom-checkbox'); |
| 221 | + // 改變勾選狀態 |
| 222 | + if ($cbx.hasClass('custom-checkbox-checked')) { |
| 223 | + $cbx.removeClass('custom-checkbox-checked') |
| 224 | + .removeClass('show'); |
| 225 | + } else { |
| 226 | + $cbx.addClass('custom-checkbox-checked') |
| 227 | + .addClass('show'); |
| 228 | + } |
| 229 | + // 重生右側上方選項 |
| 230 | + set_right_condistion(); |
| 231 | + wgt._initConditions(); |
| 232 | + // 若點擊時沒有按著 Ctrl 則刷新頁面 |
| 233 | + if (!e.ctrlKey) { |
| 234 | + wgt.ajaxLoad(); |
| 235 | + } |
| 236 | + }); |
| 237 | + // 初始化右側上方選項 |
| 238 | + wgt._initConditions(); |
| 239 | + } |
| 240 | + }; |
| 241 | + // 初始化 |
| 242 | + window.uccustomize.findproduct.init(); |
| 243 | + } |
| 244 | +})(); |
0 commit comments