loadPolicy()¶
Método para carregar e exibir políticas de privacidade, termos de uso e outras políticas diretamente em elementos HTML da sua aplicação.
📋 Visão Geral¶
O método loadPolicy() permite renderizar políticas dinâmicas criadas no dashboard Complyr diretamente em páginas HTML. As políticas são carregadas via API e inseridas no elemento especificado, mantendo a formatação e estilos configurados.
Características: - ✅ Sincronização Automática: Sempre exibe a versão mais recente da política - ✅ Formatação Preservada: Mantém estilos e estrutura configurados no dashboard - ✅ Seletor CSS: Aceita qualquer seletor CSS válido - ✅ Síncrono: Não retorna Promise (execução imediata) - ✅ Substituição Completa: Sobrescreve conteúdo existente do elemento
🎯 Casos de Uso¶
Quando Usar¶
- Páginas de Políticas Dedicadas:
/politica-de-privacidade,/termos-de-uso - Modais de Aceite: Exibir política antes de aceitar
- Formulários de Cadastro: Mostrar termos no momento do registro
- Páginas de Configuração: Área de privacidade com acesso às políticas
- E-commerce: Exibir política de cookies na área de checkout
- Compliance: Garantir que usuários vejam a versão mais recente
Quando NÃO Usar¶
- ❌ Para aceitar políticas (use
acceptPolicy()) - ❌ Para coletar consentimento (use o banner automático)
- ❌ Para links externos (use
<a href>normal)
📚 Assinatura do Método¶
TypeScript¶
interface ComplyrAPI {
/**
* Carrega e exibe uma política em um elemento HTML
* @param policyType - Tipo da política a carregar
* @param selector - Seletor CSS do elemento alvo
* @throws {Error} Se o seletor não encontrar nenhum elemento
* @throws {Error} Se o policyType for inválido
* @throws {Error} Se a política não existir ou não estiver publicada
*/
loadPolicy(policyType: string, selector: string): void;
}
JavaScript¶
🔧 Parâmetros¶
policyType (string, obrigatório)¶
Tipo da política a carregar. Deve corresponder a uma política criada e publicada no dashboard Complyr.
Valores Aceitos:
| Valor | Descrição | Obrigatório LGPD |
|---|---|---|
'privacy-policy' | Política de Privacidade | ✅ Sim (Art. 9º) |
'terms-of-service' | Termos de Uso | ❌ Opcional |
'cookie-policy' | Política de Cookies | ✅ Sim (se usar cookies) |
'data-processing' | Acordo de Processamento de Dados | ⚠️ B2B apenas |
Validação: - Deve ser uma string não vazia - Deve corresponder a uma política existente no workspace - Política deve estar com status published (publicada)
selector (string, obrigatório)¶
Seletor CSS do elemento HTML onde a política será renderizada.
Seletores Aceitos: - '#element-id' - Por ID (recomendado) - '.class-name' - Por classe (usa primeiro elemento encontrado) - '[data-policy]' - Por atributo - 'div.container > .policy' - Seletores complexos
Comportamento: - Se o seletor encontrar múltiplos elementos, apenas o primeiro será usado - Se o seletor não encontrar nenhum elemento, dispara erro - O conteúdo existente do elemento será completamente substituído
↩️ Valor de Retorno¶
Tipo: void (síncrono)
O método não retorna nenhum valor. A política é inserida diretamente no DOM.
💡 Exemplos de Uso¶
Exemplo 1: Página de Política de Privacidade¶
HTML:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Política de Privacidade - Minha Empresa</title>
<!-- Script Complyr -->
<script src="https://app.complyr.com.br/tag/js"
data-workspace-id="SEU_WORKSPACE_ID"
data-complyr-script async defer>
</script>
</head>
<body>
<header>
<h1>Política de Privacidade</h1>
<p>Última atualização: <span id="last-updated"></span></p>
</header>
<!-- Container onde a política será carregada -->
<main id="policy-container">
<p>Carregando política...</p>
</main>
<footer>
<a href="/">Voltar ao site</a>
</footer>
<script>
// Aguardar Complyr carregar
window.addEventListener('complyr:loaded', function() {
// Carregar Política de Privacidade
window.complyr.loadPolicy('privacy-policy', '#policy-container');
});
</script>
</body>
</html>
Exemplo 2: Modal de Termos de Uso¶
HTML + JavaScript:
<!-- Botão para abrir modal -->
<button id="show-terms-btn">Ver Termos de Uso</button>
<!-- Modal (oculto inicialmente) -->
<div id="terms-modal" class="modal" style="display: none;">
<div class="modal-content">
<span class="close-btn">×</span>
<h2>Termos de Uso</h2>
<!-- Container da política -->
<div id="terms-content" class="policy-content">
<p>Carregando...</p>
</div>
<button id="accept-terms-btn">Aceitar e Continuar</button>
</div>
</div>
<script>
window.addEventListener('complyr:loaded', function() {
const modal = document.getElementById('terms-modal');
const btn = document.getElementById('show-terms-btn');
const closeBtn = document.querySelector('.close-btn');
const acceptBtn = document.getElementById('accept-terms-btn');
// Abrir modal
btn.addEventListener('click', function() {
modal.style.display = 'block';
// Carregar termos apenas quando modal abrir (lazy loading)
window.complyr.loadPolicy('terms-of-service', '#terms-content');
});
// Fechar modal
closeBtn.addEventListener('click', function() {
modal.style.display = 'none';
});
// Aceitar termos
acceptBtn.addEventListener('click', async function() {
try {
// Registrar aceitação
await window.complyr.acceptPolicy('terms-of-service', 'usuario@example.com');
modal.style.display = 'none';
alert('Termos aceitos com sucesso!');
// Redirecionar para dashboard
window.location.href = '/dashboard';
} catch (error) {
console.error('Erro ao aceitar termos:', error);
alert('Erro ao aceitar termos. Tente novamente.');
}
});
});
</script>
<style>
.modal {
position: fixed;
z-index: 9999;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.7);
overflow: auto;
}
.modal-content {
background-color: #fff;
margin: 5% auto;
padding: 20px;
width: 80%;
max-width: 800px;
border-radius: 8px;
max-height: 80vh;
overflow-y: auto;
}
.policy-content {
margin: 20px 0;
max-height: 400px;
overflow-y: auto;
border: 1px solid #ddd;
padding: 15px;
background-color: #f9f9f9;
}
.close-btn {
color: #aaa;
float: right;
font-size: 28px;
font-weight: bold;
cursor: pointer;
}
.close-btn:hover {
color: #000;
}
</style>
Exemplo 3: React Component - Página de Política¶
// components/PolicyPage.tsx
import React, { useEffect, useState } from 'react';
interface PolicyPageProps {
policyType: 'privacy-policy' | 'terms-of-service' | 'cookie-policy' | 'data-processing';
title: string;
}
export function PolicyPage({ policyType, title }: PolicyPageProps) {
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
// Aguardar Complyr carregar
const loadPolicy = () => {
if (window.complyr) {
try {
window.complyr.loadPolicy(policyType, '#policy-content');
setLoading(false);
} catch (err: any) {
setError(err.message || 'Erro ao carregar política');
setLoading(false);
}
} else {
// Complyr ainda não carregou, aguardar
setTimeout(loadPolicy, 100);
}
};
loadPolicy();
}, [policyType]);
if (loading) {
return (
<div className="policy-page">
<h1>{title}</h1>
<div className="loading">
<p>Carregando política...</p>
<div className="spinner"></div>
</div>
</div>
);
}
if (error) {
return (
<div className="policy-page">
<h1>{title}</h1>
<div className="error">
<p>❌ {error}</p>
<button onClick={() => window.location.reload()}>
Tentar novamente
</button>
</div>
</div>
);
}
return (
<div className="policy-page">
<h1>{title}</h1>
{/* Container onde a política será carregada */}
<div id="policy-content" className="policy-content"></div>
<footer className="policy-footer">
<a href="/">← Voltar ao site</a>
<button onClick={() => window.print()}>🖨️ Imprimir</button>
</footer>
</div>
);
}
// Uso:
// app/politica-de-privacidade/page.tsx
export default function PrivacyPolicyPage() {
return (
<PolicyPage
policyType="privacy-policy"
title="Política de Privacidade"
/>
);
}
Exemplo 4: Vue.js Composable¶
// composables/usePolicy.ts
import { ref, onMounted } from 'vue';
export function usePolicy(
policyType: 'privacy-policy' | 'terms-of-service' | 'cookie-policy' | 'data-processing',
selector: string
) {
const loading = ref(true);
const error = ref<string | null>(null);
const loadPolicy = () => {
if (window.complyr) {
try {
window.complyr.loadPolicy(policyType, selector);
loading.value = false;
} catch (err: any) {
error.value = err.message || 'Erro ao carregar política';
loading.value = false;
}
} else {
// Aguardar Complyr carregar
setTimeout(loadPolicy, 100);
}
};
onMounted(() => {
loadPolicy();
});
return {
loading,
error,
reload: loadPolicy
};
}
Uso no Component:
<!-- pages/privacy-policy.vue -->
<template>
<div class="policy-page">
<h1>Política de Privacidade</h1>
<div v-if="loading" class="loading">
<p>Carregando política...</p>
</div>
<div v-else-if="error" class="error">
<p>❌ {{ error }}</p>
<button @click="reload">Tentar novamente</button>
</div>
<div v-else id="policy-content" class="policy-content"></div>
</div>
</template>
<script setup lang="ts">
import { usePolicy } from '@/composables/usePolicy';
const { loading, error, reload } = usePolicy('privacy-policy', '#policy-content');
</script>
Exemplo 5: Next.js App Router - Dynamic Policy Pages¶
// app/policies/[policyType]/page.tsx
import { PolicyViewer } from '@/components/PolicyViewer';
import { notFound } from 'next/navigation';
const VALID_POLICIES = {
'politica-de-privacidade': {
type: 'privacy-policy' as const,
title: 'Política de Privacidade'
},
'termos-de-uso': {
type: 'terms-of-service' as const,
title: 'Termos de Uso'
},
'politica-de-cookies': {
type: 'cookie-policy' as const,
title: 'Política de Cookies'
},
'processamento-de-dados': {
type: 'data-processing' as const,
title: 'Acordo de Processamento de Dados'
}
};
export function generateStaticParams() {
return Object.keys(VALID_POLICIES).map((slug) => ({
policyType: slug,
}));
}
export default function PolicyPage({
params
}: {
params: { policyType: string }
}) {
const policy = VALID_POLICIES[params.policyType as keyof typeof VALID_POLICIES];
if (!policy) {
notFound();
}
return (
<div className="container mx-auto py-8 px-4">
<h1 className="text-3xl font-bold mb-6">{policy.title}</h1>
<PolicyViewer policyType={policy.type} />
</div>
);
}
// components/PolicyViewer.tsx
'use client';
import { useEffect, useState } from 'react';
export function PolicyViewer({
policyType
}: {
policyType: string
}) {
const [loading, setLoading] = useState(true);
useEffect(() => {
const loadPolicy = () => {
if (window.complyr) {
window.complyr.loadPolicy(policyType, '#policy-viewer');
setLoading(false);
} else {
setTimeout(loadPolicy, 100);
}
};
loadPolicy();
}, [policyType]);
if (loading) {
return <div>Carregando...</div>;
}
return <div id="policy-viewer" className="prose max-w-none"></div>;
}
Exemplo 6: WordPress - Página de Política com Shortcode¶
<?php
/**
* Plugin Name: Complyr Policy Loader
* Description: Carrega políticas do Complyr usando shortcodes
* Version: 1.0
*/
// Adicionar script Complyr no header
function complyr_add_script() {
$workspace_id = get_option('complyr_workspace_id', '');
if (empty($workspace_id)) {
return;
}
?>
<script src="https://app.complyr.com.br/tag/js"
data-workspace-id="<?php echo esc_attr($workspace_id); ?>"
data-complyr-script async defer>
</script>
<?php
}
add_action('wp_head', 'complyr_add_script');
// Shortcode para carregar política
// Uso: [complyr_policy type="privacy-policy"]
function complyr_policy_shortcode($atts) {
$atts = shortcode_atts(array(
'type' => 'privacy-policy',
'id' => 'complyr-policy-' . uniqid()
), $atts);
$valid_types = array(
'privacy-policy',
'terms-of-service',
'cookie-policy',
'data-processing'
);
if (!in_array($atts['type'], $valid_types)) {
return '<p class="error">Tipo de política inválido.</p>';
}
$container_id = esc_attr($atts['id']);
$policy_type = esc_attr($atts['type']);
ob_start();
?>
<div id="<?php echo $container_id; ?>" class="complyr-policy-container">
<p>Carregando política...</p>
</div>
<script>
(function() {
function loadPolicy() {
if (window.complyr && typeof window.complyr.loadPolicy === 'function') {
window.complyr.loadPolicy(
'<?php echo $policy_type; ?>',
'#<?php echo $container_id; ?>'
);
} else {
setTimeout(loadPolicy, 100);
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', loadPolicy);
} else {
loadPolicy();
}
})();
</script>
<style>
.complyr-policy-container {
padding: 20px;
background-color: #f9f9f9;
border: 1px solid #ddd;
border-radius: 4px;
margin: 20px 0;
}
</style>
<?php
return ob_get_clean();
}
add_shortcode('complyr_policy', 'complyr_policy_shortcode');
// Adicionar configurações no WordPress Admin
function complyr_settings_page() {
add_options_page(
'Configurações Complyr',
'Complyr',
'manage_options',
'complyr-settings',
'complyr_settings_page_html'
);
}
add_action('admin_menu', 'complyr_settings_page');
function complyr_settings_page_html() {
if (!current_user_can('manage_options')) {
return;
}
if (isset($_POST['complyr_workspace_id'])) {
update_option('complyr_workspace_id', sanitize_text_field($_POST['complyr_workspace_id']));
echo '<div class="updated"><p>Configurações salvas!</p></div>';
}
$workspace_id = get_option('complyr_workspace_id', '');
?>
<div class="wrap">
<h1>Configurações Complyr</h1>
<form method="post">
<table class="form-table">
<tr>
<th scope="row">Workspace ID</th>
<td>
<input type="text"
name="complyr_workspace_id"
value="<?php echo esc_attr($workspace_id); ?>"
class="regular-text">
<p class="description">
Encontre seu Workspace ID no dashboard Complyr
</p>
</td>
</tr>
</table>
<?php submit_button('Salvar Configurações'); ?>
</form>
<hr>
<h2>Como usar</h2>
<p>Use o shortcode <code>[complyr_policy type="privacy-policy"]</code> em qualquer página ou post.</p>
<p>Tipos disponíveis:</p>
<ul>
<li><code>privacy-policy</code> - Política de Privacidade</li>
<li><code>terms-of-service</code> - Termos de Uso</li>
<li><code>cookie-policy</code> - Política de Cookies</li>
<li><code>data-processing</code> - Acordo de Processamento</li>
</ul>
</div>
<?php
}
Uso no WordPress: 1. Ativar o plugin 2. Ir em Configurações → Complyr 3. Adicionar Workspace ID 4. Criar página "Política de Privacidade" 5. Adicionar shortcode: [complyr_policy type="privacy-policy"]
🔄 Fluxo de Execução¶
sequenceDiagram
participant App as Aplicação
participant Complyr as window.complyr
participant API as Complyr API
participant DOM as DOM Element
App->>Complyr: loadPolicy('privacy-policy', '#container')
Complyr->>Complyr: Validar parâmetros
alt Parâmetros inválidos
Complyr-->>App: throw Error
end
Complyr->>DOM: Verificar se elemento existe
alt Elemento não encontrado
Complyr-->>App: throw Error
end
Complyr->>API: GET /policies/{workspaceId}/{policyType}
API-->>Complyr: HTML da política
Complyr->>DOM: Substituir innerHTML
Complyr->>DOM: Aplicar estilos configurados
Complyr-->>App: void (concluído) ⚠️ Tratamento de Erros¶
Erros Comuns¶
1. Elemento Não Encontrado¶
// ❌ ERRO
window.complyr.loadPolicy('privacy-policy', '#elemento-inexistente');
// Error: Element with selector '#elemento-inexistente' not found
// ✅ SOLUÇÃO
const element = document.querySelector('#policy-container');
if (element) {
window.complyr.loadPolicy('privacy-policy', '#policy-container');
} else {
console.error('Container de política não encontrado');
}
2. Tipo de Política Inválido¶
// ❌ ERRO
window.complyr.loadPolicy('invalid-policy', '#container');
// Error: Invalid policy type 'invalid-policy'
// ✅ SOLUÇÃO
const validTypes = [
'privacy-policy',
'terms-of-service',
'cookie-policy',
'data-processing'
];
const policyType = 'privacy-policy';
if (validTypes.includes(policyType)) {
window.complyr.loadPolicy(policyType, '#container');
} else {
console.error('Tipo de política inválido:', policyType);
}
3. Política Não Publicada¶
// ❌ ERRO
window.complyr.loadPolicy('terms-of-service', '#container');
// Error: Policy 'terms-of-service' not found or not published
// ✅ SOLUÇÃO
// 1. Verificar no dashboard Complyr se a política existe
// 2. Verificar se o status está como "Publicada"
// 3. Tratar erro graciosamente
try {
window.complyr.loadPolicy('terms-of-service', '#container');
} catch (error) {
console.error('Erro ao carregar política:', error);
// Exibir mensagem alternativa
document.querySelector('#container').innerHTML = `
<div class="error-message">
<p>Não foi possível carregar a política no momento.</p>
<p>Por favor, entre em contato com o suporte.</p>
</div>
`;
}
4. Complyr Não Carregado¶
// ❌ ERRO
// Script executado antes de Complyr carregar
window.complyr.loadPolicy('privacy-policy', '#container');
// TypeError: Cannot read property 'loadPolicy' of undefined
// ✅ SOLUÇÃO 1: Aguardar evento
window.addEventListener('complyr:loaded', function() {
window.complyr.loadPolicy('privacy-policy', '#container');
});
// ✅ SOLUÇÃO 2: Polling
function waitForComplyr(callback) {
if (window.complyr && typeof window.complyr.loadPolicy === 'function') {
callback();
} else {
setTimeout(() => waitForComplyr(callback), 100);
}
}
waitForComplyr(() => {
window.complyr.loadPolicy('privacy-policy', '#container');
});
// ✅ SOLUÇÃO 3: Promise
function whenComplyrReady() {
return new Promise((resolve) => {
if (window.complyr) {
resolve(window.complyr);
} else {
window.addEventListener('complyr:loaded', () => {
resolve(window.complyr);
}, { once: true });
}
});
}
// Uso
whenComplyrReady().then((complyr) => {
complyr.loadPolicy('privacy-policy', '#container');
});
Try/Catch Recomendado¶
function loadPolicyWithErrorHandling(policyType, selector) {
try {
// Verificar se Complyr está disponível
if (!window.complyr) {
throw new Error('Complyr não está carregado');
}
// Verificar se elemento existe
const element = document.querySelector(selector);
if (!element) {
throw new Error(`Elemento ${selector} não encontrado`);
}
// Carregar política
window.complyr.loadPolicy(policyType, selector);
console.log(`✅ Política ${policyType} carregada com sucesso`);
} catch (error) {
console.error('❌ Erro ao carregar política:', error);
// Exibir mensagem de erro para usuário
const fallbackElement = document.querySelector(selector);
if (fallbackElement) {
fallbackElement.innerHTML = `
<div style="padding: 20px; background: #fee; border: 1px solid #fcc;">
<p><strong>Erro ao carregar política</strong></p>
<p>${error.message}</p>
<button onclick="location.reload()">Tentar novamente</button>
</div>
`;
}
// Enviar para sistema de logging (opcional)
if (window.Sentry) {
Sentry.captureException(error);
}
}
}
// Uso
window.addEventListener('complyr:loaded', function() {
loadPolicyWithErrorHandling('privacy-policy', '#policy-container');
});
🎨 Customização de Estilos¶
As políticas são renderizadas com estilos configurados no dashboard Complyr, mas você pode aplicar CSS adicional:
Método 1: CSS Global¶
/* styles.css */
/* Container da política */
#policy-container {
max-width: 800px;
margin: 0 auto;
padding: 40px 20px;
font-family: 'Inter', sans-serif;
line-height: 1.6;
color: #333;
}
/* Títulos */
#policy-container h1 {
font-size: 2rem;
font-weight: 700;
margin-bottom: 1rem;
color: #111;
}
#policy-container h2 {
font-size: 1.5rem;
font-weight: 600;
margin-top: 2rem;
margin-bottom: 1rem;
color: #222;
}
/* Parágrafos */
#policy-container p {
margin-bottom: 1rem;
}
/* Listas */
#policy-container ul,
#policy-container ol {
margin-left: 1.5rem;
margin-bottom: 1rem;
}
#policy-container li {
margin-bottom: 0.5rem;
}
/* Links */
#policy-container a {
color: #0066cc;
text-decoration: underline;
}
#policy-container a:hover {
color: #0052a3;
}
/* Tabelas */
#policy-container table {
width: 100%;
border-collapse: collapse;
margin: 1rem 0;
}
#policy-container th,
#policy-container td {
padding: 0.75rem;
border: 1px solid #ddd;
text-align: left;
}
#policy-container th {
background-color: #f5f5f5;
font-weight: 600;
}
/* Responsividade */
@media (max-width: 768px) {
#policy-container {
padding: 20px 15px;
}
#policy-container h1 {
font-size: 1.5rem;
}
#policy-container h2 {
font-size: 1.25rem;
}
}
Método 2: Scoped Styles (React)¶
// components/PolicyPage.tsx
import styles from './PolicyPage.module.css';
export function PolicyPage() {
useEffect(() => {
window.complyr?.loadPolicy('privacy-policy', '#policy-content');
}, []);
return (
<div className={styles.policyPage}>
<div id="policy-content" className={styles.policyContent}></div>
</div>
);
}
/* PolicyPage.module.css */
.policyPage {
max-width: 800px;
margin: 0 auto;
padding: 40px 20px;
}
.policyContent {
font-family: 'Inter', sans-serif;
line-height: 1.6;
}
.policyContent :global(h1) {
font-size: 2rem;
margin-bottom: 1rem;
}
.policyContent :global(h2) {
font-size: 1.5rem;
margin-top: 2rem;
}
Método 3: Tailwind CSS¶
// components/PolicyViewer.tsx
export function PolicyViewer({ policyType }: { policyType: string }) {
useEffect(() => {
window.complyr?.loadPolicy(policyType, '#policy-viewer');
}, [policyType]);
return (
<div
id="policy-viewer"
className="
prose
prose-lg
max-w-none
prose-headings:font-bold
prose-h1:text-3xl
prose-h2:text-2xl
prose-p:text-gray-700
prose-a:text-blue-600
prose-a:no-underline
hover:prose-a:underline
"
></div>
);
}
🔍 Debug e Inspeção¶
Console Logging¶
// Ativar logs detalhados
localStorage.setItem('complyr_debug', 'true');
location.reload();
// Verá logs como:
// [Complyr] Loading policy: privacy-policy
// [Complyr] Target selector: #policy-container
// [Complyr] Fetching policy from API...
// [Complyr] Policy loaded successfully
// [Complyr] HTML inserted into #policy-container
// Desativar logs
localStorage.removeItem('complyr_debug');
Inspeção Manual¶
// Verificar se elemento existe
console.log('Elemento:', document.querySelector('#policy-container'));
// Verificar se Complyr carregou
console.log('Complyr disponível:', typeof window.complyr !== 'undefined');
// Verificar método loadPolicy
console.log('loadPolicy disponível:', typeof window.complyr?.loadPolicy === 'function');
// Ver conteúdo após carregamento
setTimeout(() => {
const container = document.querySelector('#policy-container');
console.log('HTML da política:', container?.innerHTML.substring(0, 500));
}, 2000);
🚀 Performance e Otimizações¶
Lazy Loading¶
Carregue políticas apenas quando necessário (ex: quando modal abrir):
// ❌ RUIM: Carregar política na inicialização da página
window.addEventListener('complyr:loaded', function() {
window.complyr.loadPolicy('privacy-policy', '#hidden-modal-content');
});
// ✅ BOM: Carregar apenas quando modal abrir
document.getElementById('show-policy-btn').addEventListener('click', function() {
openModal();
// Carregar apenas na primeira vez
if (!window.policyLoaded) {
window.complyr.loadPolicy('privacy-policy', '#modal-content');
window.policyLoaded = true;
}
});
Caching¶
O Complyr já faz cache automático das políticas. Para forçar recarregamento:
// Recarregar política (útil após atualização no dashboard)
function reloadPolicy(policyType, selector) {
const container = document.querySelector(selector);
if (container) {
// Limpar conteúdo
container.innerHTML = '<p>Recarregando...</p>';
// Aguardar um momento antes de recarregar
setTimeout(() => {
window.complyr.loadPolicy(policyType, selector);
}, 100);
}
}
// Botão para recarregar
document.getElementById('reload-btn').addEventListener('click', () => {
reloadPolicy('privacy-policy', '#policy-container');
});
Múltiplas Políticas na Mesma Página¶
<!-- Múltiplos containers -->
<div id="privacy-policy-container"></div>
<div id="terms-container"></div>
<div id="cookie-policy-container"></div>
<script>
window.addEventListener('complyr:loaded', function() {
// Carregar todas as políticas em paralelo
window.complyr.loadPolicy('privacy-policy', '#privacy-policy-container');
window.complyr.loadPolicy('terms-of-service', '#terms-container');
window.complyr.loadPolicy('cookie-policy', '#cookie-policy-container');
});
</script>
✅ Melhores Práticas¶
DOs ✅¶
// ✅ Aguardar Complyr carregar
window.addEventListener('complyr:loaded', function() {
window.complyr.loadPolicy('privacy-policy', '#container');
});
// ✅ Validar elemento antes de carregar
const element = document.querySelector('#policy-container');
if (element) {
window.complyr.loadPolicy('privacy-policy', '#policy-container');
}
// ✅ Tratar erros graciosamente
try {
window.complyr.loadPolicy('privacy-policy', '#container');
} catch (error) {
console.error('Erro:', error);
// Exibir mensagem de erro
}
// ✅ Usar IDs únicos para seletores
window.complyr.loadPolicy('privacy-policy', '#unique-policy-id');
// ✅ Aplicar estilos customizados via CSS externo
// (não modificar HTML da política diretamente)
DON'Ts ❌¶
// ❌ NÃO executar antes de Complyr carregar
window.complyr.loadPolicy('privacy-policy', '#container');
// TypeError: window.complyr is undefined
// ❌ NÃO assumir que elemento sempre existe
window.complyr.loadPolicy('privacy-policy', '#maybe-nonexistent');
// Error: Element not found
// ❌ NÃO ignorar erros
window.complyr.loadPolicy('invalid', '#container');
// Erro não tratado
// ❌ NÃO modificar HTML da política manualmente após carregar
document.querySelector('#container').innerHTML += '<p>Extra content</p>';
// Quebra formatação e pode causar problemas
// ❌ NÃO usar seletores genéricos que podem pegar múltiplos elementos
window.complyr.loadPolicy('privacy-policy', '.policy');
// Usa apenas o primeiro elemento (pode não ser o desejado)
🔗 Recursos Relacionados¶
Métodos da API: - identify() - Identificar usuários para Advanced Matching - acceptPolicy() - Registrar aceitação de política - revokeConsent() - Revogar consentimento - openPreferences() - Abrir modal de preferências
Recursos: - window.complyr - Objeto global da API - Eventos JavaScript - Lista completa de eventos - Exemplos Práticos - Casos de uso completos
Integrações: - Google Tag Manager - Integração GTM - Facebook Pixel - Integração Facebook Pixel
❓ Perguntas Frequentes¶
P: A política é atualizada automaticamente quando eu editar no dashboard?¶
R: Não em tempo real. A política é cacheada pelo navegador. Para ver mudanças: 1. Recarregue a página (F5) 2. Limpe o cache do navegador 3. Ou implemente botão de reload manual
P: Posso carregar a mesma política em múltiplos elementos?¶
R: Sim, basta chamar loadPolicy() múltiplas vezes com seletores diferentes:
window.complyr.loadPolicy('privacy-policy', '#sidebar-policy');
window.complyr.loadPolicy('privacy-policy', '#footer-policy');
P: Como exibir data de última atualização?¶
R: A política HTML retornada já inclui metadados. Você pode extraí-los:
window.addEventListener('complyr:loaded', function() {
window.complyr.loadPolicy('privacy-policy', '#policy-container');
// Aguardar carregamento
setTimeout(() => {
const container = document.querySelector('#policy-container');
const lastUpdated = container.querySelector('[data-last-updated]');
if (lastUpdated) {
document.getElementById('last-update-date').textContent =
lastUpdated.getAttribute('data-last-updated');
}
}, 1000);
});
P: Posso usar loadPolicy() sem o script Complyr?¶
R: Não. O método loadPolicy() faz parte da API JavaScript do Complyr e requer que o script esteja carregado.
P: A política funciona offline?¶
R: Depende do cache do navegador. Para garantir funcionamento offline, considere usar Service Workers ou pre-renderizar a política no servidor.
P: Como adicionar analytics quando política é carregada?¶
R: Use eventos customizados ou callbacks:
window.addEventListener('complyr:loaded', function() {
window.complyr.loadPolicy('privacy-policy', '#policy-container');
// Enviar evento para Google Analytics
if (window.gtag) {
gtag('event', 'policy_loaded', {
'policy_type': 'privacy-policy',
'page_location': window.location.href
});
}
});
P: Posso traduzir a política para outros idiomas?¶
R: Sim, crie versões separadas no dashboard Complyr para cada idioma e carregue dinamicamente:
const userLanguage = navigator.language.startsWith('en') ? 'en' : 'pt';
const policyType = userLanguage === 'en'
? 'privacy-policy-en'
: 'privacy-policy';
window.complyr.loadPolicy(policyType, '#policy-container');
📞 Suporte¶
Problemas com loadPolicy()?
- FAQ Geral - Perguntas frequentes
- Documentação Completa - Índice geral
- Email: contato@complyr.com.br