create-fesd-app 1.0.14 → 1.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/assets/css/layouts/_cookiePolicy.sass +20 -3
- package/src/assets/js/commons/cookies/cookieData.js +128 -98
- package/src/assets/js/commons/cookies/cookiePolicy.js +147 -43
- package/src/assets/js/commons/methods.js +7 -7
- package/src/layouts/_template.pug +2 -2
- package/src/layouts/components/_cookiePolicy.pug +5 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-fesd-app",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.15",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"dev": "vite",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@tailwindcss/postcss": "^4.1.10",
|
|
26
26
|
"@tailwindcss/vite": "^4.1.10",
|
|
27
|
-
"@xwadex/fesd": "0.0.
|
|
27
|
+
"@xwadex/fesd": "0.0.38",
|
|
28
28
|
"ansi-colors": "^4.1.3",
|
|
29
29
|
"chalk": "^5.3.0",
|
|
30
30
|
"clsx": "^2.1.1",
|
|
@@ -100,6 +100,7 @@
|
|
|
100
100
|
cursor: pointer
|
|
101
101
|
+rwdmax(767)
|
|
102
102
|
.cookie-main
|
|
103
|
+
padding: 50px 25px
|
|
103
104
|
margin: auto auto 0 auto
|
|
104
105
|
.cookie-container
|
|
105
106
|
flex-direction: column
|
|
@@ -114,6 +115,9 @@
|
|
|
114
115
|
.cookie-container
|
|
115
116
|
.button-group
|
|
116
117
|
flex-direction: column
|
|
118
|
+
.cookie-settingBtn
|
|
119
|
+
margin-top: 30px
|
|
120
|
+
margin-right: auto
|
|
117
121
|
|
|
118
122
|
[data-step]
|
|
119
123
|
opacity: 0
|
|
@@ -193,9 +197,19 @@
|
|
|
193
197
|
align-items: center
|
|
194
198
|
flex-shrink: 0
|
|
195
199
|
.icon
|
|
200
|
+
position: relative
|
|
196
201
|
cursor: pointer
|
|
197
202
|
opacity: .2
|
|
198
203
|
transition: opacity .5s
|
|
204
|
+
&::after
|
|
205
|
+
position: absolute
|
|
206
|
+
left: 50%
|
|
207
|
+
top: 50%
|
|
208
|
+
transform: translate3d(-50%,-50%,0)
|
|
209
|
+
width: 30px
|
|
210
|
+
height: 50px
|
|
211
|
+
z-index: 1
|
|
212
|
+
content: ""
|
|
199
213
|
.icon-arrow
|
|
200
214
|
font-size: px(10)
|
|
201
215
|
+hover
|
|
@@ -283,7 +297,7 @@
|
|
|
283
297
|
border-radius: 500px
|
|
284
298
|
background: #fff
|
|
285
299
|
border: 1px solid rgba(0, 0, 0, .1)
|
|
286
|
-
transition:
|
|
300
|
+
transition: all 0.28s cubic-bezier(0.4, 0, 0.2, 1)
|
|
287
301
|
vertical-align: middle
|
|
288
302
|
cursor: pointer
|
|
289
303
|
&::after
|
|
@@ -305,13 +319,16 @@
|
|
|
305
319
|
height: 15px
|
|
306
320
|
background: #808080
|
|
307
321
|
border-radius: 50%
|
|
308
|
-
|
|
322
|
+
transform: translateX(0)
|
|
323
|
+
will-change: transform
|
|
324
|
+
transition: transform 0.28s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1)
|
|
309
325
|
&:active::before
|
|
310
326
|
box-shadow: 0 2px 8px rgba(0,0,0,0.28), 0 0 0 20px rgba(128,128,128,0.1)
|
|
311
327
|
input:checked + .switch
|
|
312
328
|
background: #006FFF
|
|
313
329
|
input:checked + .switch::before
|
|
314
|
-
left: 23px
|
|
330
|
+
// left: 23px
|
|
331
|
+
transform: translateX(18px)
|
|
315
332
|
background: #fff
|
|
316
333
|
input:checked + .switch::after
|
|
317
334
|
content: "啟用"
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// list 內細項若無帶 key 值, 就不會開啟 switch 開關; state 可以控制預設值
|
|
2
|
+
// 基本上進階版細項開關不開, 有需求才開
|
|
1
3
|
export const cookieData = [
|
|
2
4
|
{
|
|
3
5
|
title: "您的 Cookie 偏好設定",
|
|
@@ -5,9 +7,10 @@ export const cookieData = [
|
|
|
5
7
|
options: [
|
|
6
8
|
{
|
|
7
9
|
key: "required",
|
|
10
|
+
state: true,
|
|
11
|
+
disabled: true,
|
|
8
12
|
title: "必要",
|
|
9
13
|
text: "這些 Cookies 對於支持核心網站功能(例如提供安全登錄)至關重要。",
|
|
10
|
-
disabled: true,
|
|
11
14
|
data: {
|
|
12
15
|
items: [
|
|
13
16
|
{
|
|
@@ -15,18 +18,26 @@ export const cookieData = [
|
|
|
15
18
|
text: "第一方 cookies 由用戶訪問的網站(即主機域名)設置。網站通常使用第一方 cookies 用於跟踪訪客在網站上的行為並個性化他們在網站上的瀏覽體驗以及個性化他們的瀏覽體驗。",
|
|
16
19
|
list: [
|
|
17
20
|
{
|
|
21
|
+
key: "",
|
|
22
|
+
state: "",
|
|
18
23
|
title: "PHPSESSID",
|
|
19
24
|
text: "php用來辨識用戶的session id",
|
|
20
25
|
},
|
|
21
26
|
{
|
|
27
|
+
key: "",
|
|
28
|
+
state: "",
|
|
22
29
|
title: "XSRF-TOKEN",
|
|
23
30
|
text: "網站防止 CSRF(Cross-Site Request Forgery,跨站請求偽造)攻擊 的 token",
|
|
24
31
|
},
|
|
25
32
|
{
|
|
33
|
+
key: "",
|
|
34
|
+
state: "",
|
|
26
35
|
title: "web_session",
|
|
27
36
|
text: "網站用來辨識用戶的session id",
|
|
28
37
|
},
|
|
29
38
|
{
|
|
39
|
+
key: "",
|
|
40
|
+
state: "",
|
|
30
41
|
title: "hubspot",
|
|
31
42
|
text: "hubspot 使用了Cloudflare服務,區分真人訪客與惡意機器人",
|
|
32
43
|
},
|
|
@@ -37,49 +48,77 @@ export const cookieData = [
|
|
|
37
48
|
},
|
|
38
49
|
{
|
|
39
50
|
key: "analytics",
|
|
51
|
+
state: false,
|
|
52
|
+
disabled: false,
|
|
40
53
|
title: "分析與自訂",
|
|
41
54
|
text: "這些 Cookies 分析網站優化的使用情況。",
|
|
42
55
|
notice: "我們將無法分析您的網站使用情況,以提供自定義內容",
|
|
43
|
-
disabled: false,
|
|
44
56
|
data: {
|
|
45
|
-
// notice: "",
|
|
46
57
|
items: [
|
|
58
|
+
// {
|
|
59
|
+
// main: "第一方 Cookie 提供商",
|
|
60
|
+
// text: "第一方 cookies 由用戶訪問的網站(即主機域名)設置。網站通常使用第一方 cookies 用於跟踪訪客在網站上的行為並個性化他們在網站上的瀏覽體驗以及個性化他們的瀏覽體驗。",
|
|
61
|
+
// list: [
|
|
62
|
+
// {
|
|
63
|
+
// title: "gtm",
|
|
64
|
+
// key: "gtm",
|
|
65
|
+
// state: "",
|
|
66
|
+
// },
|
|
67
|
+
// {
|
|
68
|
+
// title: "ga",
|
|
69
|
+
// key: "ga",
|
|
70
|
+
// state: "",
|
|
71
|
+
// detail: [
|
|
72
|
+
// {
|
|
73
|
+
// title: "_ga",
|
|
74
|
+
// text: "用來區分不同使用者。每個使用者會被指派唯一的 ID",
|
|
75
|
+
// typeTitle: "時間 / 類型",
|
|
76
|
+
// typeDesc: "13 個月",
|
|
77
|
+
// },
|
|
78
|
+
// {
|
|
79
|
+
// title: "_ga_<container-id>",
|
|
80
|
+
// text: "追蹤單一屬性 (Property) 的資料。",
|
|
81
|
+
// typeTitle: "時間 / 類型",
|
|
82
|
+
// typeDesc: "13 個月",
|
|
83
|
+
// },
|
|
84
|
+
// ],
|
|
85
|
+
// },
|
|
86
|
+
// ],
|
|
87
|
+
// },
|
|
47
88
|
{
|
|
48
|
-
main: "
|
|
49
|
-
text: "
|
|
89
|
+
main: "第三方 Cookie 提供商",
|
|
90
|
+
text: "第三方 cookies 是由其他第三方實體放置在網站上,而不是網站本身,即使用者在地址欄中看到的網域以外的域名。第三方 cookies 通常跟踪訪客在網站之間的行為,通常用於針對性廣告目的。",
|
|
50
91
|
list: [
|
|
92
|
+
// {
|
|
93
|
+
// title: "googlefont",
|
|
94
|
+
// key: "",
|
|
95
|
+
// state: "",
|
|
96
|
+
// },
|
|
51
97
|
{
|
|
52
|
-
title: "
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
98
|
+
title: "Vimeo",
|
|
99
|
+
text: "https://vimeo.com/",
|
|
100
|
+
key: "",
|
|
101
|
+
state: "",
|
|
56
102
|
detail: [
|
|
57
103
|
{
|
|
58
|
-
title: "
|
|
59
|
-
text: "
|
|
104
|
+
title: "_cf_bm",
|
|
105
|
+
text: "Cloudflare bot manager manages incoming traffic that matches the criteria associated with bots.",
|
|
60
106
|
typeTitle: "時間 / 類型",
|
|
61
|
-
typeDesc: "
|
|
107
|
+
typeDesc: "30 分",
|
|
62
108
|
},
|
|
63
109
|
{
|
|
64
|
-
title: "
|
|
65
|
-
text: "
|
|
110
|
+
title: "_cfuvid",
|
|
111
|
+
text: "Cloudflare cookie used to enforce rate-limiting rules.",
|
|
66
112
|
typeTitle: "時間 / 類型",
|
|
67
|
-
typeDesc: "
|
|
113
|
+
typeDesc: "session",
|
|
68
114
|
},
|
|
69
115
|
],
|
|
70
116
|
},
|
|
71
|
-
],
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
main: "第三方 Cookie 提供商",
|
|
75
|
-
text: "第三方 cookies 是由其他第三方實體放置在網站上,而不是網站本身,即使用者在地址欄中看到的網域以外的域名。第三方 cookies 通常跟踪訪客在網站之間的行為,通常用於針對性廣告目的。",
|
|
76
|
-
list: [
|
|
77
|
-
{
|
|
78
|
-
title: "googlefont",
|
|
79
|
-
},
|
|
80
117
|
{
|
|
81
118
|
title: "Youtube",
|
|
82
119
|
text: "https://www.youtube.com/",
|
|
120
|
+
key: "",
|
|
121
|
+
state: "",
|
|
83
122
|
detail: [
|
|
84
123
|
{
|
|
85
124
|
title: "YSC",
|
|
@@ -118,78 +157,67 @@ export const cookieData = [
|
|
|
118
157
|
},
|
|
119
158
|
],
|
|
120
159
|
},
|
|
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
|
-
title: "meta",
|
|
183
|
-
text: "https://www.facebook.com/privacy/policy",
|
|
184
|
-
detail: [
|
|
185
|
-
{
|
|
186
|
-
title: "_fbp",
|
|
187
|
-
text: "用於辨識網站訪客,讓 Meta 可以顯示相關廣告(再行銷用途)。",
|
|
188
|
-
typeTitle: "時間 / 類型",
|
|
189
|
-
typeDesc: "90 天",
|
|
190
|
-
},
|
|
191
|
-
],
|
|
192
|
-
},
|
|
160
|
+
|
|
161
|
+
// {
|
|
162
|
+
// title: "Tiktok",
|
|
163
|
+
// text: "https://www.tiktok.com/zh-Hant-TW/",
|
|
164
|
+
// key: "",
|
|
165
|
+
// state: "",
|
|
166
|
+
// detail: [
|
|
167
|
+
// {
|
|
168
|
+
// title: "_ttp",
|
|
169
|
+
// text: "To measure and improve the performance of advertising campaigns and to personalize the customer experience (including ads) on TikTok.",
|
|
170
|
+
// typeTitle: "時間 / 類型",
|
|
171
|
+
// typeDesc: "13 個月",
|
|
172
|
+
// },
|
|
173
|
+
// {
|
|
174
|
+
// title: "msToken",
|
|
175
|
+
// text: "用於存儲用戶的會話令牌,確保用戶在瀏覽器會話期間保持登錄狀態。",
|
|
176
|
+
// typeTitle: "時間 / 類型",
|
|
177
|
+
// typeDesc: "10 天",
|
|
178
|
+
// },
|
|
179
|
+
// {
|
|
180
|
+
// title: "passport_csrf_token",
|
|
181
|
+
// text: "用於防止跨站請求偽造(CSRF)攻擊,確保請求的合法性。",
|
|
182
|
+
// typeTitle: "時間 / 類型",
|
|
183
|
+
// typeDesc: "60 天",
|
|
184
|
+
// },
|
|
185
|
+
// {
|
|
186
|
+
// title: "ttwid",
|
|
187
|
+
// text: "用於識別用戶的唯一 ID,協助 TikTok 進行用戶識別與防止機器人行為。",
|
|
188
|
+
// typeTitle: "時間 / 類型",
|
|
189
|
+
// typeDesc: "10 天",
|
|
190
|
+
// },
|
|
191
|
+
// ],
|
|
192
|
+
// },
|
|
193
|
+
// {
|
|
194
|
+
// title: "instagram",
|
|
195
|
+
// text: "https://www.instagram.com/",
|
|
196
|
+
// key: "",
|
|
197
|
+
// state: "",
|
|
198
|
+
// detail: [
|
|
199
|
+
// {
|
|
200
|
+
// title: "mid",
|
|
201
|
+
// text: "用於區分不同的用戶,協助 Instagram 提供個性化的內容推薦、廣告展示以及其他社交媒體功能。",
|
|
202
|
+
// typeTitle: "時間 / 類型",
|
|
203
|
+
// typeDesc: "13 個月",
|
|
204
|
+
// },
|
|
205
|
+
// ],
|
|
206
|
+
// },
|
|
207
|
+
// {
|
|
208
|
+
// title: "meta",
|
|
209
|
+
// text: "https://www.facebook.com/privacy/policy",
|
|
210
|
+
// key: "",
|
|
211
|
+
// state: "",
|
|
212
|
+
// detail: [
|
|
213
|
+
// {
|
|
214
|
+
// title: "_fbp",
|
|
215
|
+
// text: "用於辨識網站訪客,讓 Meta 可以顯示相關廣告(再行銷用途)。",
|
|
216
|
+
// typeTitle: "時間 / 類型",
|
|
217
|
+
// typeDesc: "90 天",
|
|
218
|
+
// },
|
|
219
|
+
// ],
|
|
220
|
+
// },
|
|
193
221
|
],
|
|
194
222
|
},
|
|
195
223
|
]
|
|
@@ -197,15 +225,17 @@ export const cookieData = [
|
|
|
197
225
|
},
|
|
198
226
|
{
|
|
199
227
|
key: "functionality",
|
|
228
|
+
state: false,
|
|
229
|
+
disabled: false,
|
|
200
230
|
title: "性能與功能",
|
|
201
231
|
text: "這些 Cookies 有助於測量和分析,以改善瀏覽體驗",
|
|
202
|
-
disabled: false,
|
|
203
232
|
},
|
|
204
233
|
{
|
|
205
234
|
key: "advertising",
|
|
235
|
+
state: false,
|
|
236
|
+
disabled: false,
|
|
206
237
|
title: "廣告",
|
|
207
238
|
text: "這些 Cookies 有助於提供與您相關的廣告內容",
|
|
208
|
-
disabled: false,
|
|
209
239
|
},
|
|
210
240
|
],
|
|
211
241
|
},
|
|
@@ -38,6 +38,10 @@ cookieSetting.basicCookiePolicy = () => {
|
|
|
38
38
|
$agreeBtn.on("click", () => {
|
|
39
39
|
$cookiePolicy.addClass("agree");
|
|
40
40
|
localStorage.setItem("frameworkCookie-agree", "true");
|
|
41
|
+
// 執行後端方法
|
|
42
|
+
if (typeof window._wdSetting === 'function') {
|
|
43
|
+
window._wdSetting()
|
|
44
|
+
}
|
|
41
45
|
});
|
|
42
46
|
|
|
43
47
|
$closeBtn.on("click", () => {
|
|
@@ -94,24 +98,20 @@ cookieSetting.dataAppend = () => {
|
|
|
94
98
|
const $block = $(".cookie-settingBlock")
|
|
95
99
|
if (!$block.length) return
|
|
96
100
|
|
|
97
|
-
const data = cookieData[0]
|
|
101
|
+
const data = $("#_wcookie").val() ? JSON.parse($("#_wcookie").val())[0] : cookieData[0]
|
|
98
102
|
const $step1 = $(".setting-container[data-step='1']")
|
|
99
103
|
const $step2 = $(".setting-container[data-step='2']")
|
|
100
104
|
|
|
101
|
-
// step1
|
|
105
|
+
// 產 step1 結構
|
|
102
106
|
$step1.find(".content-block").html(cookieElements.generateHtmlString(data.options, cookieElements.getStep1Element))
|
|
103
107
|
|
|
104
|
-
// step2
|
|
108
|
+
// step2 點擊打開
|
|
105
109
|
$("[data-open]").on("click", function () {
|
|
106
110
|
const index = $(this).closest(".item").data("index")
|
|
107
111
|
const opt = data.options[index]
|
|
108
112
|
const items = opt.data?.items || []
|
|
109
|
-
const currentVal = $(`input[type="checkbox"][data-name="${opt.key}"]`).first().prop('checked') ?? false
|
|
110
|
-
|
|
111
|
-
// Step2 上方
|
|
112
|
-
$step2.find(".top-block").html(cookieElements.getStep2TopElement(opt, index))
|
|
113
113
|
|
|
114
|
-
//
|
|
114
|
+
// 產 step2 下方結構
|
|
115
115
|
const htmlStep2bottom = items.length > 0
|
|
116
116
|
? items.map(i => `
|
|
117
117
|
<div class="item">
|
|
@@ -120,12 +120,18 @@ cookieSetting.dataAppend = () => {
|
|
|
120
120
|
<div class="text">${i.text}</div>
|
|
121
121
|
</div>
|
|
122
122
|
${
|
|
123
|
-
(i.list || []).map(li =>
|
|
123
|
+
(i.list || []).map((li, index) =>
|
|
124
124
|
(li.detail && li.detail.length > 0)
|
|
125
|
-
? cookieElements.getStep2BottomElement(li)
|
|
125
|
+
? cookieElements.getStep2BottomElement(li, index, opt.key)
|
|
126
126
|
: `
|
|
127
127
|
<div class="list">
|
|
128
|
-
<div class="title"
|
|
128
|
+
<div class="title">
|
|
129
|
+
<span>${li.title || ""}</span>
|
|
130
|
+
${li.key.length > 0 ? `<div class="switch-box ${opt.disabled ? " disabled" : ""}">
|
|
131
|
+
<input type="checkbox" hidden id="s2detail-switch-${index}" ${opt.disabled? "checked" : ""} data-name="${li.key}" data-parent="${opt.key || ""}">
|
|
132
|
+
<label class="switch" for="s2detail-switch-${index}" ${opt.disabled ? "checked" : ""}></label>
|
|
133
|
+
</div>` : ""}
|
|
134
|
+
</div>
|
|
129
135
|
<div class="text">${li.text || ""}</div>
|
|
130
136
|
</div>
|
|
131
137
|
`
|
|
@@ -134,56 +140,130 @@ cookieSetting.dataAppend = () => {
|
|
|
134
140
|
</div>
|
|
135
141
|
`).join("")
|
|
136
142
|
: `<div class="item"><div class="text">此分類目前沒有詳細資料。</div></div>`
|
|
137
|
-
|
|
143
|
+
|
|
144
|
+
// 產 step2 上方結構
|
|
145
|
+
$step2.find(".top-block").html(cookieElements.getStep2TopElement(opt, index))
|
|
146
|
+
// 產 step2 下方結構
|
|
138
147
|
$step2.find(".content-block").html(htmlStep2bottom)
|
|
139
|
-
|
|
140
|
-
|
|
148
|
+
// 開關狀態判斷
|
|
149
|
+
switchState(opt.key)
|
|
150
|
+
// 換頁
|
|
141
151
|
methods.pageChange(true)
|
|
142
|
-
methods.collapseEvent('[data-collapse-click]', '[data-collapse]', false, true)
|
|
152
|
+
methods.collapseEvent('[data-collapse-click]', '[data-collapse]', '[data-collapse-content]', false, true)
|
|
143
153
|
})
|
|
144
154
|
|
|
145
|
-
//
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
155
|
+
// 開關同步連動控制
|
|
156
|
+
// 若只有一顆控制按鈕, 可關閉
|
|
157
|
+
$(document).on('change', 'input[type="checkbox"][data-name]:not(:disabled)', function () {
|
|
158
|
+
const key = $(this).data('name')
|
|
159
|
+
const val = $(this).prop('checked')
|
|
160
|
+
|
|
161
|
+
$(`input[type="checkbox"][data-name="${key}"]`).not(this).prop('checked', val)
|
|
151
162
|
})
|
|
163
|
+
|
|
164
|
+
const switchState = (el) => {
|
|
165
|
+
const currentVal = $(`input[type="checkbox"][data-name="${el}"]`).first().prop('checked') ?? false
|
|
166
|
+
$step2.find(`input[type="checkbox"][data-name="${el}"]`).prop('checked', currentVal)
|
|
167
|
+
|
|
168
|
+
const $step2TopCheckbox = $(
|
|
169
|
+
`[data-step="2"] .top-block input[type="checkbox"][data-name="${el}"]`
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
const stepCurrentVal = $step2TopCheckbox.prop('checked') ?? false
|
|
173
|
+
$(`[data-step="2"] .content-block input[type="checkbox"][data-name]:not(:disabled)`)
|
|
174
|
+
.prop('checked', stepCurrentVal)
|
|
175
|
+
.trigger('change')
|
|
176
|
+
|
|
177
|
+
$(document).on(
|
|
178
|
+
'change',
|
|
179
|
+
`[data-step="2"] .top-block input[type="checkbox"][data-name="${el}"]`,
|
|
180
|
+
function () {
|
|
181
|
+
const val = $(this).prop('checked') ?? false
|
|
182
|
+
|
|
183
|
+
$(
|
|
184
|
+
`[data-step="2"] .content-block input[type="checkbox"][data-name]:not(:disabled)`
|
|
185
|
+
)
|
|
186
|
+
.prop('checked', val)
|
|
187
|
+
.trigger('change')
|
|
188
|
+
}
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
$(document).on(
|
|
192
|
+
'change',
|
|
193
|
+
`[data-step="2"] .content-block input[type="checkbox"][data-name]:not(:disabled)`,
|
|
194
|
+
function () {
|
|
195
|
+
const $all = $(
|
|
196
|
+
`[data-step="2"] .content-block input[type="checkbox"][data-name]:not(:disabled)`
|
|
197
|
+
)
|
|
198
|
+
const total = $all.length
|
|
199
|
+
const checked = $all.filter(':checked').length
|
|
200
|
+
|
|
201
|
+
if (!total) return
|
|
202
|
+
|
|
203
|
+
if (checked === total) {
|
|
204
|
+
// 全開
|
|
205
|
+
$step2TopCheckbox.prop('checked', true)
|
|
206
|
+
} else if (checked === 0) {
|
|
207
|
+
// 全關
|
|
208
|
+
$step2TopCheckbox.prop('checked', false)
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
}
|
|
152
214
|
}
|
|
153
215
|
|
|
154
216
|
// 存 cookie
|
|
155
217
|
cookieSetting.cookieSaveFn = (el) => {
|
|
156
218
|
const $container = $(".cookie-settingBlock")
|
|
157
|
-
const mainCookies = ['required', 'analytics', 'functionality', 'advertising']
|
|
158
219
|
|
|
220
|
+
// 紀錄每一個值存入
|
|
159
221
|
cookieSetting.save = () => {
|
|
160
222
|
let allOpen = true;
|
|
161
223
|
const mainCookies = ['required', 'analytics', 'functionality', 'advertising'];
|
|
162
224
|
const obj = {};
|
|
163
225
|
|
|
164
226
|
mainCookies.forEach((key) => {
|
|
227
|
+
// 先存大分類的 cookie
|
|
165
228
|
const isOpen = $(`input[type="checkbox"][data-name="${key}"]`)
|
|
166
229
|
.first()
|
|
167
230
|
.prop('checked');
|
|
231
|
+
const category = {
|
|
232
|
+
close: isOpen ? 0 : 1,
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
// 再存大分類底下所有細項的 cookie
|
|
236
|
+
const children = {};
|
|
237
|
+
$(`input[type="checkbox"][data-parent="${key}"][data-name]`)
|
|
238
|
+
.each(function () {
|
|
239
|
+
const childKey = $(this).data('name');
|
|
240
|
+
const childOpen = $(this).prop('checked');
|
|
241
|
+
children[childKey] = {
|
|
242
|
+
close: childOpen ? 0 : 1,
|
|
243
|
+
};
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
if (Object.keys(children).length > 0) {
|
|
247
|
+
category.list = children;
|
|
248
|
+
}
|
|
168
249
|
|
|
169
|
-
obj[key] =
|
|
250
|
+
obj[key] = category;
|
|
170
251
|
});
|
|
171
252
|
|
|
253
|
+
// 判斷是否除了 required 以外全部關閉
|
|
172
254
|
for (let i = 0; i < mainCookies.length; i++) {
|
|
173
255
|
const key = mainCookies[i];
|
|
174
|
-
|
|
175
256
|
if (key === 'required') continue;
|
|
176
|
-
|
|
177
257
|
if (obj[key].close !== 1) {
|
|
178
258
|
allOpen = false;
|
|
179
|
-
break;
|
|
259
|
+
break;
|
|
180
260
|
}
|
|
181
261
|
}
|
|
182
262
|
|
|
183
263
|
obj.close = allOpen ? 1 : 0;
|
|
184
264
|
|
|
185
265
|
Cookies.set('_wd', JSON.stringify(obj), {
|
|
186
|
-
expires: 180,
|
|
266
|
+
expires: 180,
|
|
187
267
|
path: '/',
|
|
188
268
|
sameSite: true,
|
|
189
269
|
});
|
|
@@ -191,21 +271,36 @@ cookieSetting.cookieSaveFn = (el) => {
|
|
|
191
271
|
|
|
192
272
|
// 重整後重抓 cookie 設定
|
|
193
273
|
cookieSetting.restore = () => {
|
|
194
|
-
const raw = Cookies.get('_wd')
|
|
195
|
-
if (!raw) return
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
274
|
+
const raw = Cookies.get('_wd');
|
|
275
|
+
if (!raw) return;
|
|
276
|
+
|
|
277
|
+
let mystore;
|
|
278
|
+
try {
|
|
279
|
+
mystore = JSON.parse(raw);
|
|
280
|
+
} catch {
|
|
281
|
+
return;
|
|
201
282
|
}
|
|
202
|
-
mainCookies.forEach((key) => {
|
|
203
|
-
if (!mystore[key]) return
|
|
204
|
-
const checked = mystore[key].close === 0
|
|
205
|
-
$(`input[type="checkbox"][data-name="${key}"]`).prop('checked', checked).trigger('change')
|
|
206
|
-
})
|
|
207
|
-
}
|
|
208
283
|
|
|
284
|
+
const mainCookies = ['required', 'analytics', 'functionality', 'advertising'];
|
|
285
|
+
|
|
286
|
+
mainCookies.forEach((key) => {
|
|
287
|
+
const category = mystore[key];
|
|
288
|
+
if (!category) return;
|
|
289
|
+
|
|
290
|
+
const checked = category.close === 0;
|
|
291
|
+
$(`input[type="checkbox"][data-name="${key}"]`)
|
|
292
|
+
.prop('checked', checked)
|
|
293
|
+
.trigger('change');
|
|
294
|
+
|
|
295
|
+
const children = category.list || {};
|
|
296
|
+
Object.keys(children).forEach((childKey) => {
|
|
297
|
+
const childChecked = children[childKey].close === 0;
|
|
298
|
+
$(`input[type="checkbox"][data-parent="${key}"][data-name="${childKey}"]`)
|
|
299
|
+
.prop('checked', childChecked)
|
|
300
|
+
.trigger('change');
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
};
|
|
209
304
|
// 一鍵全開
|
|
210
305
|
cookieSetting.enableAll = () => {
|
|
211
306
|
$(`input[type="checkbox"][data-name]:not(:disabled)`).prop('checked', true).trigger('change')
|
|
@@ -213,8 +308,12 @@ cookieSetting.cookieSaveFn = (el) => {
|
|
|
213
308
|
|
|
214
309
|
// 綁定按鈕
|
|
215
310
|
$("[data-cookie-all]").on('click', cookieSetting.enableAll)
|
|
311
|
+
// 儲存
|
|
216
312
|
$("[data-cookie-save]").on('click', function(){
|
|
217
313
|
cookieSetting.save()
|
|
314
|
+
})
|
|
315
|
+
// 關閉視窗
|
|
316
|
+
$("[data-cookie-close]").on('click', function(){
|
|
218
317
|
cookieSetting.closeEvent($container)
|
|
219
318
|
})
|
|
220
319
|
|
|
@@ -222,6 +321,7 @@ cookieSetting.cookieSaveFn = (el) => {
|
|
|
222
321
|
$(cookieSetting.restore)
|
|
223
322
|
}
|
|
224
323
|
|
|
324
|
+
// ⚠️ ** --- 結構這邊修改 --- ** ⚠️
|
|
225
325
|
// step 1 結構
|
|
226
326
|
cookieElements.getStep1Element = (opt, index) => {
|
|
227
327
|
return `
|
|
@@ -281,13 +381,17 @@ cookieElements.getStep2TopElement = (opt, index) => {
|
|
|
281
381
|
`
|
|
282
382
|
}
|
|
283
383
|
|
|
284
|
-
// step 2
|
|
285
|
-
cookieElements.getStep2BottomElement = (opt) => {
|
|
384
|
+
// step 2 下面細項結構
|
|
385
|
+
cookieElements.getStep2BottomElement = (opt,index,parentKey) => {
|
|
286
386
|
return `
|
|
287
387
|
<div class="list collapseItem" data-collapse>
|
|
288
388
|
<div class="title collapseTitle" data-collapse-click>
|
|
289
389
|
<div class="icon"><i class="icon-arrow"></i></div>
|
|
290
390
|
<span>${opt.title || ""}</span>
|
|
391
|
+
${opt.key ? `<div class="switch-box ${opt.disabled ? " disabled" : ""}">
|
|
392
|
+
<input type="checkbox" hidden id="s2detail-switch-${index}" ${opt.disabled ? "checked" : ""} data-name="${opt.key}" data-parent="${parentKey || ""}">
|
|
393
|
+
<label class="switch" for="s2detail-switch-${index}"></label>
|
|
394
|
+
</div>` : ""}
|
|
291
395
|
</div>
|
|
292
396
|
${opt.text ? `<div class="text">${opt.text}</div>` : ""}
|
|
293
397
|
<div class="list-detail collapseBox" data-collapse-content>
|
|
@@ -320,7 +424,7 @@ export const init = () => {
|
|
|
320
424
|
// cookie 基本版
|
|
321
425
|
cookieSetting.basicCookiePolicy()
|
|
322
426
|
// cookie 進階版
|
|
427
|
+
cookieSetting.dataAppend();
|
|
323
428
|
cookieSetting.clickEvent();
|
|
324
429
|
cookieSetting.cookieSaveFn();
|
|
325
|
-
cookieSetting.dataAppend();
|
|
326
430
|
}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
// plugins
|
|
2
|
-
import {
|
|
3
|
-
Anchor4,
|
|
4
|
-
} from '@xwadex/fesd';
|
|
2
|
+
import { Anchor4 } from '@xwadex/fesd';
|
|
5
3
|
|
|
6
4
|
export const toBackend = (contents) => {
|
|
7
5
|
if (!contents) return
|
|
@@ -16,7 +14,7 @@ export const toBackend = (contents) => {
|
|
|
16
14
|
}
|
|
17
15
|
|
|
18
16
|
// collapse
|
|
19
|
-
export function collapseEvent(clickTarget, parentBox, anchor = false, single = false) {
|
|
17
|
+
export function collapseEvent(clickTarget, parentBox, contentBox, anchor = false, single = false) {
|
|
20
18
|
if (!clickTarget || !parentBox) return;
|
|
21
19
|
|
|
22
20
|
const $clickTarget = $(clickTarget);
|
|
@@ -25,14 +23,16 @@ export function collapseEvent(clickTarget, parentBox, anchor = false, single = f
|
|
|
25
23
|
|
|
26
24
|
$clickTarget.on('click', function () {
|
|
27
25
|
const $parent = $(this).closest(parentBox);
|
|
28
|
-
|
|
26
|
+
const $content = $parent.find(contentBox);
|
|
27
|
+
|
|
28
|
+
if (!$parent.length || !$content.length) return;
|
|
29
29
|
if ($parent.hasClass('open')) return $parent.removeClass('open');
|
|
30
30
|
|
|
31
31
|
$parent.addClass('open');
|
|
32
32
|
if (single) $parentBoxes.not($parent).removeClass('open');
|
|
33
33
|
if (anchor) setTimeout(() => Anchor4.run({ target: $parent[0] }), 500);
|
|
34
34
|
});
|
|
35
|
-
}
|
|
35
|
+
};
|
|
36
36
|
|
|
37
37
|
export function noContentCheck() {
|
|
38
38
|
const params = new URLSearchParams(document.location.search);
|
|
@@ -61,7 +61,7 @@ export const pageChange = (type = true) => {
|
|
|
61
61
|
// 移除 show class
|
|
62
62
|
$('[data-step]').removeClass('show');
|
|
63
63
|
// data-step 監聽 transitionend
|
|
64
|
-
$('[data-step]').off('transitionend webkitTransitionEnd oTransitionEnd').on('transitionend webkitTransitionEnd oTransitionEnd', function() {
|
|
64
|
+
$('[data-step]').off('transitionend webkitTransitionEnd oTransitionEnd').on('transitionend webkitTransitionEnd oTransitionEnd', function () {
|
|
65
65
|
const $this = $(this);
|
|
66
66
|
|
|
67
67
|
if (!$this.hasClass('show')) {
|
|
@@ -48,7 +48,7 @@ html(lang="zh-Hant-TW" data-overlayscrollbars-initialize)
|
|
|
48
48
|
// cookie
|
|
49
49
|
block cookie
|
|
50
50
|
include ./components/_cookiePolicy.pug
|
|
51
|
-
|
|
51
|
+
|
|
52
52
|
modern-modal(data-modal-id="my-modal" data-modal-animate="clip-right")
|
|
53
53
|
.close-btn(data-modal-close)
|
|
54
|
-
.title Modal4
|
|
54
|
+
.title Modal4
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
p.text 關於本網站使用瀏覽器紀錄 Cookie 來提供您最好的使用體驗,我們使用的 Cookie 也包括了第三方 Cookie 。<br>相關資訊請訪問我們的隱私權與 Cookie 政策。如果您選擇繼續瀏覽或關閉這個提示,便表示您已接受我們的網站使用條款。
|
|
8
8
|
.button-group
|
|
9
9
|
.cookie-btn.close Reject 我拒絕
|
|
10
|
-
.cookie-btn.agree OK 我接受
|
|
10
|
+
.cookie-btn.agree(data-cookie-save) OK 我接受
|
|
11
11
|
.cookie-settingBtn(data-cookie-open)
|
|
12
12
|
span Cookie 偏好設定
|
|
13
13
|
.icon
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
// JS append 結構
|
|
26
26
|
.button-group
|
|
27
27
|
.cookie-btn.open(data-cookie-all) 啟用所有 Cookie
|
|
28
|
-
.cookie-btn.save(data-cookie-
|
|
28
|
+
.cookie-btn.save(data-cookie-close) SAVE 儲存本次變更
|
|
29
29
|
.setting-container(data-step="2")
|
|
30
30
|
.back(onclick="document.body.fesd.pageChange(false)")
|
|
31
31
|
.icon
|
|
@@ -35,3 +35,6 @@
|
|
|
35
35
|
// JS append 結構
|
|
36
36
|
.content-block
|
|
37
37
|
// JS append 結構
|
|
38
|
+
|
|
39
|
+
// 後端 cookie 資料放這兒
|
|
40
|
+
<input id="_wcookie" type="hidden" value="[{"title":"\u60a8\u7684 Cookie \u504f\u597d\u8a2d\u5b9a","text":"\u6211\u5011\u4f7f\u7528\u4e0d\u540c\u985e\u578b\u7684 Cookies \u4f86\u512a\u5316\u60a8\u5728\u6211\u5011\u7684\u7db2\u7ad9\u4e0a\u7684\u9ad4\u9a57\uff0c\u9ede\u64ca\u4e0b\u9762\u985e\u5225\u4ee5\u4e86\u89e3\u5176\u76ee\u7684\u8207\u66f4\u591a\u8a0a\u606f\u3002\u003Cbr\u003E\u60a8\u53ef\u4ee5\u9078\u64c7\u5141\u8a31\u7684 Cookies \u985e\u578b\uff0c\u4e5f\u53ef\u4ee5\u96a8\u6642\u66f4\u6539\u60a8\u7684\u504f\u597d\u8a2d\u5b9a\u3002\u003Cbr\u003E\u63d0\u9192\u60a8\uff0c\u505c\u7528 Cookies \u53ef\u80fd\u6703\u5f71\u97ff\u60a8\u5728\u7db2\u7ad9\u4e0a\u7684\u9ad4\u9a57\uff0c\u60a8\u53ef\u4ee5\u700f\u89bd\u6211\u5011\u7684\u96b1\u79c1\u6b0a\u653f\u7b56\uff0c\u9032\u4e00\u6b65\u4e86\u89e3\u6211\u5011\u5982\u4f55\u4f7f\u7528 Cookie\u3002","options":[{"key":"required","state":true,"disabled":true,"title":"\u56b4\u683c\u5fc5\u8981","text":"\u9019\u4e9b Cookies \u5c0d\u65bc\u652f\u6301\u6838\u5fc3\u7db2\u7ad9\u529f\u80fd\uff08\u4f8b\u5982\u63d0\u4f9b\u5b89\u5168\u767b\u9304\uff09\u81f3\u95dc\u91cd\u8981\u3002","data":{"items":[{"main":"\u7b2c\u4e00\u65b9 Cookie \u63d0\u4f9b\u5546","text":"\u7b2c\u4e00\u65b9 cookies \u7531\u7528\u6236\u8a2a\u554f\u7684\u7db2\u7ad9\uff08\u5373\u4e3b\u6a5f\u57df\u540d\uff09\u8a2d\u7f6e\u3002\u7db2\u7ad9\u901a\u5e38\u4f7f\u7528\u7b2c\u4e00\u65b9 cookies \u7528\u65bc\u8ddf\u8e2a\u8a2a\u5ba2\u5728\u7db2\u7ad9\u4e0a\u7684\u884c\u70ba\u4e26\u500b\u6027\u5316\u4ed6\u5011\u5728\u7db2\u7ad9\u4e0a\u7684\u700f\u89bd\u9ad4\u9a57\u4ee5\u53ca\u500b\u6027\u5316\u4ed6\u5011\u7684\u700f\u89bd\u9ad4\u9a57\u3002","list":[{"key":"","state":"","title":"PHPSESSID","text":"\u7db2\u7ad9\u7528\u65bc\u8fa8\u8b58\u7528\u6236\u7684session id"},{"key":"","state":"","title":"XSRF-TOKEN","text":"\u7db2\u7ad9\u7528\u65bc\u9632\u6b62 CSRF\uff08Cross-Site Request Forgery\uff0c\u8de8\u7ad9\u8acb\u6c42\u507d\u9020\uff09\u653b\u64caTOKEN"},{"key":"","state":"","title":"web_session","text":"\u7db2\u7ad9\u7528\u65bc\u8fa8\u8b58\u7528\u6236\u7684session id"},{"key":"","state":"","title":"_cfuvid","text":"hubspot\u8868\u55ae\u670d\u52d9\u4f7f\u7528\u4e86Cloudflare\u670d\u52d9\uff0c\u7528\u65bc\u5340\u5206\u771f\u4eba\u8a2a\u5ba2\u6216\u6a5f\u5668\u4eba"}]}]}},{"key":"analytics","state":false,"disabled":false,"title":"\u7d71\u8a08\u5206\u6790","text":"\u9019\u4e9b Cookies \u7d71\u8a08\/\u5206\u6790\u7db2\u7ad9\u4f7f\u7528\u60c5\u6cc1\uff0c\u4ee5\u63d0\u4f9b\u66f4\u597d\u7684\u7db2\u7ad9\u9ad4\u9a57\u3002","data":{"items":[{"main":"\u7b2c\u4e00\u65b9 Cookie \u63d0\u4f9b\u5546","text":"\u7b2c\u4e00\u65b9 cookies \u7531\u7528\u6236\u8a2a\u554f\u7684\u7db2\u7ad9\uff08\u5373\u4e3b\u6a5f\u57df\u540d\uff09\u8a2d\u7f6e\u3002\u7db2\u7ad9\u901a\u5e38\u4f7f\u7528\u7b2c\u4e00\u65b9 cookies \u7528\u65bc\u8ddf\u8e2a\u8a2a\u5ba2\u5728\u7db2\u7ad9\u4e0a\u7684\u884c\u70ba\u4e26\u500b\u6027\u5316\u4ed6\u5011\u5728\u7db2\u7ad9\u4e0a\u7684\u700f\u89bd\u9ad4\u9a57\u4ee5\u53ca\u500b\u6027\u5316\u4ed6\u5011\u7684\u700f\u89bd\u9ad4\u9a57\u3002","list":[{"title":"gtm","key":"","state":""},{"title":"ga","key":"","state":"","detail":[{"title":"_ga","text":"\u7528\u4f86\u5340\u5206\u4e0d\u540c\u4f7f\u7528\u8005\u3002\u6bcf\u500b\u4f7f\u7528\u8005\u6703\u88ab\u6307\u6d3e\u552f\u4e00\u7684 ID","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"13 \u500b\u6708"},{"title":"_ga_\u003Ccontainer-id\u003E","text":"\u8ffd\u8e64\u55ae\u4e00\u5c6c\u6027 (Property) \u7684\u8cc7\u6599\u3002","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"13 \u500b\u6708"}]}]}]}},{"key":"functionality","state":false,"disabled":false,"title":"\u529f\u80fd\/\u504f\u597d","text":"\u9019\u4e9b Cookies \u7d00\u9304\u60a8\u7684\u504f\u597d\u6216\u63d0\u4f9b\u66f4\u597d\u7684\u9ad4\u9a57","data":{"items":[{"main":"\u7b2c\u4e09\u65b9 Cookie \u63d0\u4f9b\u5546","text":"\u7b2c\u4e09\u65b9 cookies \u662f\u7531\u5176\u4ed6\u7b2c\u4e09\u65b9\u5be6\u9ad4\u653e\u7f6e\u5728\u7db2\u7ad9\u4e0a\uff0c\u800c\u4e0d\u662f\u7db2\u7ad9\u672c\u8eab\uff0c\u5373\u4f7f\u7528\u8005\u5728\u5730\u5740\u6b04\u4e2d\u770b\u5230\u7684\u7db2\u57df\u4ee5\u5916\u7684\u57df\u540d\u3002\u7b2c\u4e09\u65b9 cookies \u901a\u5e38\u8ddf\u8e2a\u8a2a\u5ba2\u5728\u7db2\u7ad9\u4e4b\u9593\u7684\u884c\u70ba\uff0c\u901a\u5e38\u7528\u65bc\u91dd\u5c0d\u6027\u5ee3\u544a\u76ee\u7684\u3002","list":[{"title":"googlefont","key":"","state":""},{"title":"Vimeo","text":"https:\/\/vimeo.com\/","key":"","state":"","detail":[{"title":"_cf_bm","text":"Cloudflare bot manager manages incoming traffic that matches the criteria associated with bots.","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"30 \u5206"},{"title":"_cfuvid","text":"Cloudflare cookie used to enforce rate-limiting rules.","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"session"}]},{"title":"Tiktok","text":"https:\/\/www.tiktok.com\/zh-Hant-TW\/","key":"","state":"","detail":[{"title":"_ttp","text":"To measure and improve the performance of advertising campaigns and to personalize the customer experience (including ads) on TikTok.","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"13 \u500b\u6708"},{"title":"msToken","text":"\u7528\u65bc\u5b58\u5132\u7528\u6236\u7684\u6703\u8a71\u4ee4\u724c\uff0c\u78ba\u4fdd\u7528\u6236\u5728\u700f\u89bd\u5668\u6703\u8a71\u671f\u9593\u4fdd\u6301\u767b\u9304\u72c0\u614b\u3002","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"10 \u5929"},{"title":"passport_csrf_token","text":"\u7528\u65bc\u9632\u6b62\u8de8\u7ad9\u8acb\u6c42\u507d\u9020\uff08CSRF\uff09\u653b\u64ca\uff0c\u78ba\u4fdd\u8acb\u6c42\u7684\u5408\u6cd5\u6027\u3002","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"60 \u5929"},{"title":"ttwid","text":"\u7528\u65bc\u8b58\u5225\u7528\u6236\u7684\u552f\u4e00 ID\uff0c\u5354\u52a9 TikTok \u9032\u884c\u7528\u6236\u8b58\u5225\u8207\u9632\u6b62\u6a5f\u5668\u4eba\u884c\u70ba\u3002","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"10 \u5929"}]}]}]}},{"key":"advertising","state":false,"disabled":false,"title":"\u5ee3\u544a\u8207\u884c\u92b7","text":"\u9019\u4e9b Cookies \u70ba\u8de8\u7db2\u7ad9\u8ffd\u8e64\u3001\u5ee3\u544a\u518d\u884c\u92b7","data":{"items":[{"main":"\u7b2c\u4e09\u65b9 Cookie \u63d0\u4f9b\u5546","text":"\u7b2c\u4e09\u65b9 cookies \u662f\u7531\u5176\u4ed6\u7b2c\u4e09\u65b9\u5be6\u9ad4\u653e\u7f6e\u5728\u7db2\u7ad9\u4e0a\uff0c\u800c\u4e0d\u662f\u7db2\u7ad9\u672c\u8eab\uff0c\u5373\u4f7f\u7528\u8005\u5728\u5730\u5740\u6b04\u4e2d\u770b\u5230\u7684\u7db2\u57df\u4ee5\u5916\u7684\u57df\u540d\u3002\u7b2c\u4e09\u65b9 cookies \u901a\u5e38\u8ddf\u8e2a\u8a2a\u5ba2\u5728\u7db2\u7ad9\u4e4b\u9593\u7684\u884c\u70ba\uff0c\u901a\u5e38\u7528\u65bc\u91dd\u5c0d\u6027\u5ee3\u544a\u76ee\u7684\u3002","list":[{"title":"Youtube","text":"https:\/\/www.youtube.com\/","key":"","state":"","detail":[{"title":"YSC","text":"\u7528\u65bc\u8ffd\u8e64\u5f71\u7247\u64ad\u653e\u6703\u8a71\uff08Session cookie\uff09\uff0c\u4e0d\u542b\u500b\u8cc7\u4f46\u53ef\u8b58\u5225\u55ae\u6b21\u89c0\u770b\u3002","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"session"},{"title":"__Secure-YNID","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"6 \u500b\u6708"},{"title":"__Secure-ROLLOUT_TOKEN","text":"\u7528\u65bc YouTube \/ Google \u529f\u80fd\u7684\u300c\u7248\u672c\u6efe\u52d5 \/ \u6e2c\u8a66\u529f\u80fd\u63a7\u5236\u300d\uff08feature rollout \/ A\/B \u6e2c\u8a66\u63a7\u5236\uff09","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"6 \u500b\u6708"},{"title":"VISITOR_INFO1_LIVE","text":"\u7528\u65bc\u8861\u91cf\u4f7f\u7528\u8005\u7684\u7db2\u8def\u983b\u5bec \/ \u5224\u65b7\u662f\u5426\u4f7f\u7528\u65b0\u7248\u6216\u820a\u7248 YouTube \u64ad\u653e\u5668\u4ecb\u9762\uff0c\u4ee5\u53ca\u67d0\u4e9b YouTube \u670d\u52d9\u4e2d\u7528\u65bc\u89c0\u5bdf\u4f7f\u7528\u8005\u8a2d\u5099 \/ \u6d41\u91cf\u80fd\u529b","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"6 \u500b\u6708"},{"title":"VISITOR_PRIVACY_METADATA","text":"\u7528\u4f86\u5132\u5b58\u4f7f\u7528\u8005\u5728\u7576\u524d\u7db2\u57df\uff08domain\uff09\u4e0a\u5c0d cookie \u540c\u610f \/ \u96b1\u79c1\u8a2d\u5b9a\u72c0\u614b\u7684\u5143\u8cc7\u6599\uff08metadata\uff09","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"6 \u500b\u6708"},{"title":"__Secure-YEC","text":"\u7528\u65bc\u6aa2\u6e2c\u6feb\u7528\u3001\u5ee3\u544a\u6b3a\u8a50\u3001Bot \u5075\u6e2c\uff0c\u4ee5\u53ca\u6539\u5584 YouTube \u670d\u52d9\uff08\u5982\u8207\u5f71\u7247\u64ad\u653e\uff0f\u5d4c\u5165\u6709\u95dc\u7684\u5206\u6790\u6216\u554f\u984c\u5075\u6e2c\uff09","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"13 \u500b\u6708"}]},{"title":"meta","text":"https:\/\/www.facebook.com\/privacy\/policy","key":"","state":"","detail":[{"title":"_fbp","text":"\u7528\u65bc\u8fa8\u8b58\u7db2\u7ad9\u8a2a\u5ba2\uff0c\u8b93 Meta \u53ef\u4ee5\u986f\u793a\u76f8\u95dc\u5ee3\u544a\uff08\u518d\u884c\u92b7\u7528\u9014\uff09\u3002","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"90 \u5929"}]},{"title":"instagram","text":"https:\/\/www.instagram.com\/","key":"","state":"","detail":[{"title":"mid","text":"\u7528\u65bc\u5340\u5206\u4e0d\u540c\u7684\u7528\u6236\uff0c\u5354\u52a9 Instagram \u63d0\u4f9b\u500b\u6027\u5316\u7684\u5167\u5bb9\u63a8\u85a6\u3001\u5ee3\u544a\u5c55\u793a\u4ee5\u53ca\u5176\u4ed6\u793e\u4ea4\u5a92\u9ad4\u529f\u80fd\u3002","typeTitle":"\u6642\u9593 \/ \u985e\u578b","typeDesc":"13 \u500b\u6708"}]}]}]}}]}]">
|