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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-fesd-app",
3
- "version": "1.0.14",
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.37",
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: background 0.28s cubic-bezier(0.4, 0, 0.2, 1)
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
- transition: left 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)
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: "第一方 Cookie 提供商",
49
- text: "第一方 cookies 由用戶訪問的網站(即主機域名)設置。網站通常使用第一方 cookies 用於跟踪訪客在網站上的行為並個性化他們在網站上的瀏覽體驗以及個性化他們的瀏覽體驗。",
89
+ main: "第三方 Cookie 提供商",
90
+ text: "第三方 cookies 是由其他第三方實體放置在網站上,而不是網站本身,即使用者在地址欄中看到的網域以外的域名。第三方 cookies 通常跟踪訪客在網站之間的行為,通常用於針對性廣告目的。",
50
91
  list: [
92
+ // {
93
+ // title: "googlefont",
94
+ // key: "",
95
+ // state: "",
96
+ // },
51
97
  {
52
- title: "gtm",
53
- },
54
- {
55
- title: "ga",
98
+ title: "Vimeo",
99
+ text: "https://vimeo.com/",
100
+ key: "",
101
+ state: "",
56
102
  detail: [
57
103
  {
58
- title: "_ga",
59
- text: "用來區分不同使用者。每個使用者會被指派唯一的 ID",
104
+ title: "_cf_bm",
105
+ text: "Cloudflare bot manager manages incoming traffic that matches the criteria associated with bots.",
60
106
  typeTitle: "時間 / 類型",
61
- typeDesc: "13 個月",
107
+ typeDesc: "30 ",
62
108
  },
63
109
  {
64
- title: "_ga_<container-id>",
65
- text: "追蹤單一屬性 (Property) 的資料。",
110
+ title: "_cfuvid",
111
+ text: "Cloudflare cookie used to enforce rate-limiting rules.",
66
112
  typeTitle: "時間 / 類型",
67
- typeDesc: "13 個月",
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
- title: "Vimeo",
123
- text: "https://vimeo.com/",
124
- detail: [
125
- {
126
- title: "_cf_bm",
127
- text: "Cloudflare bot manager manages incoming traffic that matches the criteria associated with bots.",
128
- typeTitle: "時間 / 類型",
129
- typeDesc: "30 分",
130
- },
131
- {
132
- title: "_cfuvid",
133
- text: "Cloudflare cookie used to enforce rate-limiting rules.",
134
- typeTitle: "時間 / 類型",
135
- typeDesc: "session",
136
- },
137
- ],
138
- },
139
- {
140
- title: "Tiktok",
141
- text: "https://www.tiktok.com/zh-Hant-TW/",
142
- detail: [
143
- {
144
- title: "_ttp",
145
- text: "To measure and improve the performance of advertising campaigns and to personalize the customer experience (including ads) on TikTok.",
146
- typeTitle: "時間 / 類型",
147
- typeDesc: "13 個月",
148
- },
149
- {
150
- title: "msToken",
151
- text: "用於存儲用戶的會話令牌,確保用戶在瀏覽器會話期間保持登錄狀態。",
152
- typeTitle: "時間 / 類型",
153
- typeDesc: "10 天",
154
- },
155
- {
156
- title: "passport_csrf_token",
157
- text: "用於防止跨站請求偽造(CSRF)攻擊,確保請求的合法性。",
158
- typeTitle: "時間 / 類型",
159
- typeDesc: "60 天",
160
- },
161
- {
162
- title: "ttwid",
163
- text: "用於識別用戶的唯一 ID,協助 TikTok 進行用戶識別與防止機器人行為。",
164
- typeTitle: "時間 / 類型",
165
- typeDesc: "10 天",
166
- },
167
- ],
168
- },
169
- {
170
- title: "instagram",
171
- text: "https://www.instagram.com/",
172
- detail: [
173
- {
174
- title: "mid",
175
- text: "用於區分不同的用戶,協助 Instagram 提供個性化的內容推薦、廣告展示以及其他社交媒體功能。",
176
- typeTitle: "時間 / 類型",
177
- typeDesc: "13 個月",
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
- // Step2 下方
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">${li.title || ""}</div>
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
- $step2.find(`input[type="checkbox"][data-name="${opt.key}"]`).prop('checked', currentVal)
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
- $(document).on('change', 'input[type="checkbox"][data-name]:not(:disabled)', function () {
147
- const key = $(this).data('name')
148
- const val = $(this).prop('checked')
149
-
150
- $(`input[type="checkbox"][data-name="${key}"]`).prop('checked', val)
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] = { close: isOpen ? 0 : 1 };
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, // 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
- let mystore
197
- try {
198
- mystore = JSON.parse(raw)
199
- } catch {
200
- return
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
- if (!$parent.length) return;
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-save) SAVE 儲存本次變更
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="[{&quot;title&quot;:&quot;\u60a8\u7684 Cookie \u504f\u597d\u8a2d\u5b9a&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;options&quot;:[{&quot;key&quot;:&quot;required&quot;,&quot;state&quot;:true,&quot;disabled&quot;:true,&quot;title&quot;:&quot;\u56b4\u683c\u5fc5\u8981&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;data&quot;:{&quot;items&quot;:[{&quot;main&quot;:&quot;\u7b2c\u4e00\u65b9 Cookie \u63d0\u4f9b\u5546&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;list&quot;:[{&quot;key&quot;:&quot;&quot;,&quot;state&quot;:&quot;&quot;,&quot;title&quot;:&quot;PHPSESSID&quot;,&quot;text&quot;:&quot;\u7db2\u7ad9\u7528\u65bc\u8fa8\u8b58\u7528\u6236\u7684session id&quot;},{&quot;key&quot;:&quot;&quot;,&quot;state&quot;:&quot;&quot;,&quot;title&quot;:&quot;XSRF-TOKEN&quot;,&quot;text&quot;:&quot;\u7db2\u7ad9\u7528\u65bc\u9632\u6b62 CSRF\uff08Cross-Site Request Forgery\uff0c\u8de8\u7ad9\u8acb\u6c42\u507d\u9020\uff09\u653b\u64caTOKEN&quot;},{&quot;key&quot;:&quot;&quot;,&quot;state&quot;:&quot;&quot;,&quot;title&quot;:&quot;web_session&quot;,&quot;text&quot;:&quot;\u7db2\u7ad9\u7528\u65bc\u8fa8\u8b58\u7528\u6236\u7684session id&quot;},{&quot;key&quot;:&quot;&quot;,&quot;state&quot;:&quot;&quot;,&quot;title&quot;:&quot;_cfuvid&quot;,&quot;text&quot;:&quot;hubspot\u8868\u55ae\u670d\u52d9\u4f7f\u7528\u4e86Cloudflare\u670d\u52d9\uff0c\u7528\u65bc\u5340\u5206\u771f\u4eba\u8a2a\u5ba2\u6216\u6a5f\u5668\u4eba&quot;}]}]}},{&quot;key&quot;:&quot;analytics&quot;,&quot;state&quot;:false,&quot;disabled&quot;:false,&quot;title&quot;:&quot;\u7d71\u8a08\u5206\u6790&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;data&quot;:{&quot;items&quot;:[{&quot;main&quot;:&quot;\u7b2c\u4e00\u65b9 Cookie \u63d0\u4f9b\u5546&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;list&quot;:[{&quot;title&quot;:&quot;gtm&quot;,&quot;key&quot;:&quot;&quot;,&quot;state&quot;:&quot;&quot;},{&quot;title&quot;:&quot;ga&quot;,&quot;key&quot;:&quot;&quot;,&quot;state&quot;:&quot;&quot;,&quot;detail&quot;:[{&quot;title&quot;:&quot;_ga&quot;,&quot;text&quot;:&quot;\u7528\u4f86\u5340\u5206\u4e0d\u540c\u4f7f\u7528\u8005\u3002\u6bcf\u500b\u4f7f\u7528\u8005\u6703\u88ab\u6307\u6d3e\u552f\u4e00\u7684 ID&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;13 \u500b\u6708&quot;},{&quot;title&quot;:&quot;_ga_\u003Ccontainer-id\u003E&quot;,&quot;text&quot;:&quot;\u8ffd\u8e64\u55ae\u4e00\u5c6c\u6027 (Property) \u7684\u8cc7\u6599\u3002&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;13 \u500b\u6708&quot;}]}]}]}},{&quot;key&quot;:&quot;functionality&quot;,&quot;state&quot;:false,&quot;disabled&quot;:false,&quot;title&quot;:&quot;\u529f\u80fd\/\u504f\u597d&quot;,&quot;text&quot;:&quot;\u9019\u4e9b Cookies \u7d00\u9304\u60a8\u7684\u504f\u597d\u6216\u63d0\u4f9b\u66f4\u597d\u7684\u9ad4\u9a57&quot;,&quot;data&quot;:{&quot;items&quot;:[{&quot;main&quot;:&quot;\u7b2c\u4e09\u65b9 Cookie \u63d0\u4f9b\u5546&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;list&quot;:[{&quot;title&quot;:&quot;googlefont&quot;,&quot;key&quot;:&quot;&quot;,&quot;state&quot;:&quot;&quot;},{&quot;title&quot;:&quot;Vimeo&quot;,&quot;text&quot;:&quot;https:\/\/vimeo.com\/&quot;,&quot;key&quot;:&quot;&quot;,&quot;state&quot;:&quot;&quot;,&quot;detail&quot;:[{&quot;title&quot;:&quot;_cf_bm&quot;,&quot;text&quot;:&quot;Cloudflare bot manager manages incoming traffic that matches the criteria associated with bots.&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;30 \u5206&quot;},{&quot;title&quot;:&quot;_cfuvid&quot;,&quot;text&quot;:&quot;Cloudflare cookie used to enforce rate-limiting rules.&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;session&quot;}]},{&quot;title&quot;:&quot;Tiktok&quot;,&quot;text&quot;:&quot;https:\/\/www.tiktok.com\/zh-Hant-TW\/&quot;,&quot;key&quot;:&quot;&quot;,&quot;state&quot;:&quot;&quot;,&quot;detail&quot;:[{&quot;title&quot;:&quot;_ttp&quot;,&quot;text&quot;:&quot;To measure and improve the performance of advertising campaigns and to personalize the customer experience (including ads) on TikTok.&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;13 \u500b\u6708&quot;},{&quot;title&quot;:&quot;msToken&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;10 \u5929&quot;},{&quot;title&quot;:&quot;passport_csrf_token&quot;,&quot;text&quot;:&quot;\u7528\u65bc\u9632\u6b62\u8de8\u7ad9\u8acb\u6c42\u507d\u9020\uff08CSRF\uff09\u653b\u64ca\uff0c\u78ba\u4fdd\u8acb\u6c42\u7684\u5408\u6cd5\u6027\u3002&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;60 \u5929&quot;},{&quot;title&quot;:&quot;ttwid&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;10 \u5929&quot;}]}]}]}},{&quot;key&quot;:&quot;advertising&quot;,&quot;state&quot;:false,&quot;disabled&quot;:false,&quot;title&quot;:&quot;\u5ee3\u544a\u8207\u884c\u92b7&quot;,&quot;text&quot;:&quot;\u9019\u4e9b Cookies \u70ba\u8de8\u7db2\u7ad9\u8ffd\u8e64\u3001\u5ee3\u544a\u518d\u884c\u92b7&quot;,&quot;data&quot;:{&quot;items&quot;:[{&quot;main&quot;:&quot;\u7b2c\u4e09\u65b9 Cookie \u63d0\u4f9b\u5546&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;list&quot;:[{&quot;title&quot;:&quot;Youtube&quot;,&quot;text&quot;:&quot;https:\/\/www.youtube.com\/&quot;,&quot;key&quot;:&quot;&quot;,&quot;state&quot;:&quot;&quot;,&quot;detail&quot;:[{&quot;title&quot;:&quot;YSC&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;session&quot;},{&quot;title&quot;:&quot;__Secure-YNID&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;6 \u500b\u6708&quot;},{&quot;title&quot;:&quot;__Secure-ROLLOUT_TOKEN&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;6 \u500b\u6708&quot;},{&quot;title&quot;:&quot;VISITOR_INFO1_LIVE&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;6 \u500b\u6708&quot;},{&quot;title&quot;:&quot;VISITOR_PRIVACY_METADATA&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;6 \u500b\u6708&quot;},{&quot;title&quot;:&quot;__Secure-YEC&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;13 \u500b\u6708&quot;}]},{&quot;title&quot;:&quot;meta&quot;,&quot;text&quot;:&quot;https:\/\/www.facebook.com\/privacy\/policy&quot;,&quot;key&quot;:&quot;&quot;,&quot;state&quot;:&quot;&quot;,&quot;detail&quot;:[{&quot;title&quot;:&quot;_fbp&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;90 \u5929&quot;}]},{&quot;title&quot;:&quot;instagram&quot;,&quot;text&quot;:&quot;https:\/\/www.instagram.com\/&quot;,&quot;key&quot;:&quot;&quot;,&quot;state&quot;:&quot;&quot;,&quot;detail&quot;:[{&quot;title&quot;:&quot;mid&quot;,&quot;text&quot;:&quot;\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&quot;,&quot;typeTitle&quot;:&quot;\u6642\u9593 \/ \u985e\u578b&quot;,&quot;typeDesc&quot;:&quot;13 \u500b\u6708&quot;}]}]}]}}]}]">