Repository navigation
Expand file tree
/
Copy pathscript.js
More file actions
372 lines (322 loc) · 10.8 KB
/
Copy pathscript.js
File metadata and controls
372 lines (322 loc) · 10.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
// 全局变量
let currentServiceLevel = '';
let userLocation = null;
// 服务配置数据
const serviceConfig = {
low: {
title: '基础服务',
areas: ['余杭区', '西湖区', '拱墅区', '临平区', '上城区', '钱塘区', '滨江区', '萧山区', '临安区', '富阳区'],
details: {
studio: '专业工作室服务,提供优质体验。服务时间灵活,环境舒适。',
delivery: '上门服务,专业团队,安全可靠。需要提前预约确认。'
}
},
medium: {
title: '标准服务',
areas: ['余杭区', '西湖区', '上城区', '萧山区', '临平区'],
details: {
studio: '高端工作室服务,专业技师团队。服务时长60-100分钟,环境优雅。',
delivery: '精品上门服务,专业团队保障。服务时长60-100分钟,品质保证。'
}
},
high: {
title: '高级服务',
areas: [],
details: {
description: '尊享VIP服务体验,专业团队一对一服务。',
features: [
'专业技师团队',
'一对一专属服务',
'高品质服务环境',
'灵活预约时间',
'安全保障体系'
]
}
}
};
// 区域坐标数据(杭州各区的大致坐标)
const areaCoordinates = {
'余杭区': { lat: 30.2741, lng: 120.1551 },
'西湖区': { lat: 30.2599, lng: 120.1303 },
'拱墅区': { lat: 30.3191, lng: 120.1419 },
'临平区': { lat: 30.4218, lng: 120.2974 },
'上城区': { lat: 30.2429, lng: 120.1694 },
'钱塘区': { lat: 30.3191, lng: 120.3833 },
'滨江区': { lat: 30.2084, lng: 120.2119 },
'萧山区': { lat: 30.1833, lng: 120.2647 },
'临安区': { lat: 30.2333, lng: 119.7167 },
'富阳区': { lat: 30.0489, lng: 119.9603 }
};
// 页面加载完成后初始化
document.addEventListener('DOMContentLoaded', function() {
initializeApp();
});
// 初始化应用
async function initializeApp() {
// 检测微信浏览器
if (isWeChatBrowser()) {
showWeChatMask();
return;
}
// 检测地理位置
await checkLocation();
// 绑定事件监听器
bindEventListeners();
// 添加触感反馈
addHapticFeedback();
}
// 检测是否为微信浏览器
function isWeChatBrowser() {
const ua = navigator.userAgent.toLowerCase();
return ua.includes('micromessenger');
}
// 显示微信浏览器提示
function showWeChatMask() {
const wechatMask = document.getElementById('wechat-mask');
wechatMask.style.display = 'flex';
}
// 检测用户地理位置
async function checkLocation() {
try {
// 使用免费的IP地理位置API
const response = await fetch('https://ipapi.co/json/');
const data = await response.json();
userLocation = {
country: data.country_name,
region: data.region,
city: data.city,
ip: data.ip
};
// 检查是否为浙江地区
if (data.region !== 'Zhejiang' && data.country_name === 'China') {
showLocationRestrict();
return false;
}
return true;
} catch (error) {
console.log('无法获取地理位置信息,继续访问');
return true;
}
}
// 显示地理位置限制
function showLocationRestrict() {
const locationRestrict = document.getElementById('location-restrict');
locationRestrict.style.display = 'flex';
}
// 绑定事件监听器
function bindEventListeners() {
// 服务卡片点击事件
const serviceCards = document.querySelectorAll('.service-card');
serviceCards.forEach(card => {
card.addEventListener('click', handleServiceCardClick);
});
// 模态框关闭事件
const closeButtons = document.querySelectorAll('.close-btn');
closeButtons.forEach(btn => {
btn.addEventListener('click', closeModal);
});
// 点击模态框背景关闭
const modals = document.querySelectorAll('.modal');
modals.forEach(modal => {
modal.addEventListener('click', function(e) {
if (e.target === modal) {
closeModal();
}
});
});
// ESC键关闭模态框
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
closeModal();
}
});
}
// 处理服务卡片点击
function handleServiceCardClick(e) {
const card = e.currentTarget;
const level = card.dataset.level;
currentServiceLevel = level;
// 添加点击动画效果
card.style.transform = 'scale(0.95)';
setTimeout(() => {
card.style.transform = '';
}, 150);
if (level === 'high') {
// 高级服务直接跳转
window.open('http://baidu.com', '_blank');
} else {
// 显示区域选择
showAreaModal(level);
}
}
// 显示区域选择模态框
function showAreaModal(level) {
const modal = document.getElementById('area-modal');
const modalTitle = document.getElementById('modal-title');
const areaGrid = document.getElementById('area-grid');
const config = serviceConfig[level];
modalTitle.textContent = `${config.title} - 选择区域`;
// 清空并重新生成区域网格
areaGrid.innerHTML = '';
config.areas.forEach(area => {
const areaItem = document.createElement('div');
areaItem.className = 'area-item';
areaItem.textContent = area;
areaItem.addEventListener('click', () => handleAreaClick(area));
areaGrid.appendChild(areaItem);
});
// 添加服务详情按钮
const detailBtn = document.createElement('div');
detailBtn.className = 'area-item';
detailBtn.style.background = 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)';
detailBtn.style.color = 'white';
detailBtn.style.border = 'none';
detailBtn.innerHTML = '<i class="fas fa-info-circle"></i> 服务详情';
detailBtn.addEventListener('click', () => showServiceDetails(level));
areaGrid.appendChild(detailBtn);
modal.style.display = 'flex';
}
// 处理区域点击
function handleAreaClick(area) {
// 移除所有选中状态
const allAreaItems = document.querySelectorAll('.area-item');
allAreaItems.forEach(item => {
item.classList.remove('selected');
});
// 添加选中状态到当前点击的区域
const clickedItem = event.target;
clickedItem.classList.add('selected');
// 显示选中提示
showAreaSelectedMessage(area);
// 添加触感反馈
if (navigator.vibrate) {
navigator.vibrate(100);
}
}
// 显示区域选中提示
function showAreaSelectedMessage(area) {
// 创建提示元素
const message = document.createElement('div');
message.className = 'area-selected-message';
message.innerHTML = `
<i class="fas fa-check-circle"></i>
<span>已选择:${area}</span>
`;
// 添加到页面
document.body.appendChild(message);
// 显示动画
setTimeout(() => {
message.classList.add('show');
}, 10);
// 自动隐藏
setTimeout(() => {
message.classList.remove('show');
setTimeout(() => {
document.body.removeChild(message);
}, 300);
}, 2000);
}
// 显示服务详情
function showServiceDetails(level) {
const modal = document.getElementById('detail-modal');
const serviceDetails = document.getElementById('service-details');
const config = serviceConfig[level];
let detailsHTML = '';
if (level === 'high') {
detailsHTML = `
<h3>${config.title}</h3>
<p>${config.details.description}</p>
<h4>服务特色:</h4>
<ul>
${config.details.features.map(feature => `<li>${feature}</li>`).join('')}
</ul>
`;
} else {
detailsHTML = `
<h3>${config.title}</h3>
<h4>工作室服务:</h4>
<p>${config.details.studio}</p>
<h4>上门服务:</h4>
<p>${config.details.delivery}</p>
`;
}
serviceDetails.innerHTML = detailsHTML;
modal.style.display = 'flex';
}
// 关闭模态框
function closeModal() {
const modals = document.querySelectorAll('.modal');
modals.forEach(modal => {
modal.style.display = 'none';
});
}
// 添加触感反馈
function addHapticFeedback() {
// 为所有可点击元素添加触感反馈
const clickableElements = document.querySelectorAll('.service-card, .area-item, .close-btn');
clickableElements.forEach(element => {
element.addEventListener('touchstart', function() {
// 在支持的设备上触发触感反馈
if (navigator.vibrate) {
navigator.vibrate(50);
}
});
});
}
// 工具函数:防抖
function debounce(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
}
// 工具函数:节流
function throttle(func, limit) {
let inThrottle;
return function() {
const args = arguments;
const context = this;
if (!inThrottle) {
func.apply(context, args);
inThrottle = true;
setTimeout(() => inThrottle = false, limit);
}
};
}
// 错误处理
window.addEventListener('error', function(e) {
console.error('页面错误:', e.error);
});
// 未处理的Promise拒绝
window.addEventListener('unhandledrejection', function(e) {
console.error('未处理的Promise拒绝:', e.reason);
});
// 页面可见性变化处理
document.addEventListener('visibilitychange', function() {
if (document.hidden) {
// 页面隐藏时的处理
console.log('页面已隐藏');
} else {
// 页面显示时的处理
console.log('页面已显示');
}
});
// 网络状态监听
window.addEventListener('online', function() {
console.log('网络已连接');
});
window.addEventListener('offline', function() {
console.log('网络已断开');
});
// 导出函数供外部使用(如果需要)
window.AppUtils = {
checkLocation,
showAreaModal,
showServiceDetails,
closeModal
};