O UEditor é um editor de texto rico (WYSIWYG) robusto, desenvolvido pela divisão de Web Frontend do Baidu. Ele é amplamente utilizado por ser de código aberto, gratuito e oferecer uma experiência de usuário similar ao Microsoft Word, permitindo que usuários formatem textos complexos sem a necessidade de conhecimento direto em HTML.
Para implementar o editor em sua versão básica, o procedimento padrão envolve a inclusão dos scripts de configuração e núcleo, seguida pela inicialização em um elemento de container:
<!-- Container do editor -->
<script id="instanciaEditor" name="conteudo_html" type="text/plain">
Insira o texto inicial aqui.
</script>
<!-- Arquivos de script -->
<script type="text/javascript" src="ueditor.config.js"></script>
<script type="text/javascript" src="ueditor.all.js"></script>
<!-- Inicialização -->
<script type="text/javascript">
var editor = UE.getEditor('instanciaEditor');
</script>
A barra de ferramentas pode ser customizada conforme a necessidade do projeto, seja alterando o arquivo de configuração global ou passando as opções diretamente na instância:
<script type="text/javascript">
var editorCustomizado = UE.getEditor('instanciaEditor', {
toolbars: [
['fullscreen', 'undo', 'redo', 'bold', 'italic', 'underline', 'strikethrough'],
['forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'cleardoc']
]
});
</script>
Durante a integração em projetos reais, alguns problemas comuns podem surgir. Abaixo, detalhamos as principais falhas e suas respectivas correções.
1. Erro de Referência: ZeroClipboard is not defined
Este erro ocorre geralmente porque o arquivo ZeroClipboard.js tenta detectar o ambiente de carregamento (AMD, CommonJS ou Global) e acaba não expotrando a variável global corretamente em certos contextos de módulos.
Solução A (Modificação do Código Fonte):
Localize o bloco de exportação no arquivo ZeroClipboard.js e force a atribuição global:
// Código original ajustado
if (typeof define === "function" && define.amd) {
define(function() { return ZeroClipboard; });
} else if (typeof module === "object" && module.exports) {
module.exports = ZeroClipboard;
}
// Força a definição global independente do ambiente
window.ZeroClipboard = ZeroClipboard;
Solução B (Configuração via RequireJS):
Se estiver utilizando o RequireJS, defina o caminho explicitamente e carregue o módulo antes de inicializar o editor:
require.config({
paths: {
"ZeroClipboard": "./caminho/para/ZeroClipboard"
}
});
require(['ZeroClipboard'], function (zClip) {
window.ZeroClipboard = zClip;
});
2. Falha na Segunda Carga do Editor
Um problema recorrente é o editor carregar normalmente na primeira vez, mas falhar ao ser renderizado novamente em aplicações Single Page (SPA) ou modais dinâmicos.
A solução mais eficaz é garantir a destruição da instância anterior antes de tentar criar uma nova ou ao fechar o componente que contém o editor:
function gerenciarInstancia() {
var idEditor = "instanciaEditor";
var instanciaExistente = UE.getEditor(idEditor);
if (instanciaExistente) {
// Remove a instância residual para evitar conflitos na nova carga
instanciaExistente.destroy();
}
// Inicializa novamente
UE.getEditor(idEditor);
}
3. Menus Suspensos Ocultos por Modais (Z-Index)
Em interfaces que utilizam modais (como Bootstrap ou camadas CSS próprias), os menus de seleção de fonte ou tamanho do UEditor podem aparecer "atrás" do modal.
Para resolver isso, localize a propriedade zIndex no arquivo ueditor.config.js e atribua um valor superior ao da sua camada modal:
// ueditor.config.js
zIndex: 1500 // Ajuste este valor conforme a necessidade da sua UI
4. Desabilitando a Notificação de "Salvo com Sucesso"
O recursso de salvamento automático pode exibir notificações que intreferem na experiência do usuário. Para remover o aviso visual mantendo ou não a funcionalidade, siga estes passos:
Passo 1: No arquivo ueditor.config.js, defina enableAutoSave como false.
Passo 2: No arquivo ueditor.all.js, localize o evento contentchange e adicione uma verificação para interromper a execução se o salvamento estiver desativado:
// Dentro da função de listener 'contentchange'
if (!this.getOpt('enableAutoSave')) {
return;
}