У меня возникают трудности с настройкой загрузки некоторых моих файлов TypeScript в зависимости от OneTrust, независимо от того, доступен он или нет при загрузке страницы, и, если он доступен, загружаю определенные сценарии TypeScript только тогда, когда установлены определенные файлы cookie. Некоторые проекты, которые также полагаются на эту кодовую базу, в настоящее время могут не использовать OneTrust, поэтому сценарии для этого проекта должны по-прежнему нормально загружаться, когда OneTrust недоступен (хотя в будущем это будет изменено).
const isActive = typeof window !== 'undefined' && typeof window.OptanonWrapper === 'function';
или
const isOneTrustActive = typeof window !== 'undefined' && typeof window.OneTrust === 'object';
К сожалению, установка объектов обычно не завершена окончательно, что указывает на то, что OneTrust недоступен:
typeof window.OneTrust === 'undefined' (should be 'object')
typeof window.OnetrustActiveGroups === 'undefined' (should be 'string')
Они станут доступны только вскоре после того, как мои сценарии проверят их доступность.
Я не нашел события OneTrust, которое срабатывает после успешного завершения загрузки OneTrust.
Я знаю, что в OneTrust есть функция обратного вызова, которая будет запускаться при изменении файлов cookie, и она отлично работает:
window.OneTrust.OnConsentChanged(callback)
Есть ли что-то подобное для первоначального завершения загрузки OneTrust? Я не смог найти ничего подобного.
Сам OneTrust не поставляется с какими-либо инструментами JS, позволяющими узнать, когда баннер загружен и готов к использованию. Вам придется либо прослушивать событие load
в теге <script>
скрипта OneTrust, либо отправлять пользовательское событие в обратном вызове OptanonWrapper
.
<script type = "text/javascript">
function OptanonWrapper() {
const oneTrustLoadedEvent = new CustomEvent('onetrustloaded');
window.dispatchEvent(oneTrustLoadedEvent);
}
</script>
Это позволит вам запускать код всякий раз, когда OneTrust действительно готов, вместо опроса.
Ответ, который мне был нужен, я нашел благодаря ответу @emiel-zuurbier.
function OptanonWrapper() {
const event = new Event('onetrustloaded');
document.dispatchEvent(event);
window.OneTrustLoaded = true;
}
export const isOneTrustActive = (): boolean => {
return typeof window !== 'undefined' && typeof window.OptanonWrapper === 'function';
};
export const isOneTrustLoaded = (): boolean => {
// Set OneTrustLoaded window variable if not yet available --> not yet ready
if (!(typeof window.OneTrustLoaded === 'boolean')) {
window.OneTrustLoaded = false;
}
return window.OneTrustLoaded;
};
export const initOneTrustCallback = (immediateCallback: any, onChangeCallback: any): void => {
// OneTrust finished loading?
if (!isOneTrustLoaded()) {
document.addEventListener('onetrustloaded', () => {
window.OneTrustLoaded = true;
// Initial check for cookie state to either activate videos or not - without reloading page
immediateCallback();
// OneTrust OnConsentChanged will be called by OneTrust when cookies have been changed
window.OneTrust.OnConsentChanged(onChangeCallback);
});
return;
}
// Initial check for cookie state to either activate videos or not - without reloading page
immediateCallback();
// OnConsentChanged will be called by OneTrust when cookies have been changed (listener)
window.OneTrust.OnConsentChanged(onChangeCallback);
};
/* Init */
((): void => {
if (!isOneTrustActive()) {
// Initialize normal components and functions here without considering OneTrust cookies...
return;
}
// Initial OneTrust init
initOneTrustCallback(initFunction, onChangeFunction);
})();
Спасибо за информацию! Теперь я нашел решение своей проблемы с помощью этого: