Skip to content

Commit 8a4fc43

Browse files
authored
Create uccustomize.js
1 parent b223dbb commit 8a4fc43

File tree

1 file changed

+244
-0
lines changed

1 file changed

+244
-0
lines changed

tmp/uccustomize.js

Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
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

Comments
 (0)