问题描述
由于欧盟针对广告发布商制定了特殊法律。我想为我的用户显示Cookie同意书。但是我只是无法在互联网上找到任何好的框架来确定用户是否来自欧盟国家。
有什么办法可以做到这一点?
希望得到一些涵盖细节的答案。
谢谢
解决方法
如果我正确理解您的问题,则可以通过确定用户的本地时区来轻松地做到这一点。有几种方法。
Moment.js
Moment Timezone具有猜测用户时区的功能。只要您使用的是最新版本,它就非常准确。
示例:
<div id="guess"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data-2012-2022.min.js"></script>
<script>
document.getElementById('guess').innerText = moment.tz.guess();
</script>
Moment.js使用Intl API,它是内置的JavaScript国际化API。它还具有其数据库,用于检查Intl API的结果以提供更准确的信息。它还需要您包含Moment.js才能起作用。
Jstz软件包
Jstz是用于检测时区的简单打火机包。它还使用了Intl API,因此您可以放心其结果。要使用该软件包,您可以按照以下方式获取CDN:
<div id="guess"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>
<script>
document.getElementById('guess').innerText = jstz.determine().name();
</script>
国际API本身:
您可以直接使用Intl API!
Intl对象是ECMAScript国际化API的命名空间,该API提供语言敏感的字符串比较,数字格式以及日期和时间格式。 Intl对象提供对多个构造函数的访问以及国际化构造函数和其他对语言敏感的函数所共有的功能。
用法示例:
<div id="guess"></div>
<script>
document.getElementById('guess').innerText = Intl.DateTimeFormat().resolvedOptions().timeZone;
</script>
您可以从这些用于检测时区的库中注意到的是,它们不需要您端的任何网络调用。这意味着,如果您只打算选择用户时区,则可能不需要进行IP查找。
然后,您可以将时区与特定的欧盟时区进行匹配,并确定您的用户是否来自欧盟内部。
如果要对用户进行实际/准确的定位,则必须使用GeoLocation。这是一个执行此操作的简单脚本:https://raw.githubusercontent.com/AdeyinkaAdegbenro/Detect_Location/master/detect_location.js。
您可能要检查的其他API(最适合您):
,除了已接受的答案之外,我还做了很多努力来确定哪些时区受 GDPR 法律的约束。我使用了 dayjs 包(与 momentjs 基本相同)。
consentRequired() {
dayjs.extend(timezone);
const tz = dayjs.tz.guess();
switch (tz) {
case 'Europe/Vienna':
return true;
case 'Europe/Brussels':
return true;
case 'Europe/Sofia':
return true;
case 'Europe/Zagreb':
return true;
case 'Asia/Famagusta':
return true;
case 'Asia/Nicosia':
return true;
case 'Europe/Prague':
return true;
case 'Europe/Copenhagen':
return true;
case 'Europe/Tallinn':
return true;
case 'Europe/Helsinki':
return true;
case 'Europe/Paris':
return true;
case 'Europe/Berlin':
return true;
case 'Europe/Busingen':
return true;
case 'Europe/Athens':
return true;
case 'Europe/Budapest':
return true;
case 'Europe/Dublin':
return true;
case 'Europe/Rome':
return true;
case 'Europe/Riga':
return true;
case 'Europe/Vilnius':
return true;
case 'Europe/Luxembourg':
return true;
case 'Europe/Malta':
return true;
case 'Europe/Amsterdam':
return true;
case 'Europe/Warsaw':
return true;
case 'Atlantic/Azores':
return true;
case 'Atlantic/Madeira':
return true;
case 'Europe/Lisbon':
return true;
case 'Europe/Bucharest':
return true;
case 'Europe/Bratislava':
return true;
case 'Europe/Ljubljana':
return true;
case 'Africa/Ceuta':
return true;
case 'Atlantic/Canary':
return true;
case 'Europe/Madrid':
return true;
case 'Europe/Stockholm':
return true;
default:
return false;
}
}