Estou usando diálogos jquery para apresentar formulários (obtidos via AJAX). Em alguns formulários, estou usando um CKEditor para as áreas de texto. O editor exibe bem no primeiro carregamento.
Quando o usuário cancela a caixa de diálogo, estou removendo o conteúdo para que seja carregado novamente em uma solicitação posterior. O problema é que, depois que a caixa de diálogo é recarregada, o CKEditor afirma que o editor já existe.
uncaught exception: [CKEDITOR.editor] The instance "textarea_name" already exists.
A API inclui um método para destruir editores existentes, e vi pessoas alegando que essa é uma solução:
if (CKEDITOR.instances['textarea_name']) {
CKEDITOR.instances['textarea_name'].destroy();
}
CKEDITOR.replace('textarea_name');
Isso não está funcionando para mim, pois recebo um novo erro:
TypeError: Result of expression 'i.contentWindow' [null] is not an object.
Este erro parece ocorrer em "destroy ()" em vez de "replace ()". Alguém experimentou isso e encontrou uma solução diferente?
É possível 're-renderizar' o editor existente, ao invés de destruí-lo e substituí-lo?
ATUALIZADO Aqui está outra questão que trata do mesmo problema, mas ele forneceu um caso de teste para download .
fonte
fonte
Eu também tive esse problema, mas resolvi de uma forma bem mais simples ...
Eu estava usando a classe "ckeditor" em meu script jQuery como o seletor para quais áreas de texto eu queria usar para o CKEditor. O script JS ckeditor padrão também usa essa classe para identificar quais áreas de texto usar para CKEditor.
Isso significa que há um conflito entre meu script jQuery e o script ckeditor padrão.
Eu simplesmente mudei a classe da textarea e meu script jQuery para 'do_ckeditor' (você pode usar qualquer coisa, exceto "ckeditor") e funcionou.
fonte
Esta é a solução mais simples (e única) que funcionou para mim:
A exclusão dessa entrada na matriz evita que a verificação de segurança do formulário destrua seu aplicativo.
destroy () e remove () não funcionaram para mim.
fonte
delete
oudestroy()
limpe totalmente a instância do editor. Coisas como o dicionário e outros objetos associados ainda estarão à espreita.Talvez isso o ajude - fiz algo semelhante usando jquery, exceto que estou carregando um número desconhecido de objetos ckeditor. Demorei para descobrir isso - não está claro na documentação.
E aqui está o que eu executo para obter o conteúdo dos editores:
ATUALIZAÇÃO : mudei minha resposta para usar o método correto - que é .destroy (). .remove () deve ser interno e foi documentado incorretamente em um ponto.
fonte
Eu tive um problema semelhante onde estávamos fazendo várias instâncias do CKeditor para o conteúdo carregado via ajax.
Manteve o DOM na memória e não removeu todas as ligações.
Deu o erro i.contentWindow error sempre que eu crio uma nova instância com novos dados do ajax. Mas isso foi apenas até eu descobrir que estava destruindo a instância depois de limpar o DOM.
Use destroy () enquanto a instância e seu DOM estiverem presentes na página, então funcionará perfeitamente bem.
fonte
Para solicitações de ajax,
este recortado remove todas as instâncias do documento. Em seguida, cria novas instâncias.
fonte
fonte
O
i.contentWindow is null
erro parece ocorrer ao chamar destroy em uma instância do editor que estava vinculada a uma textarea que não estava mais no DOM.CKEDITORY.destroy
leva um parâmetronoUpdate
.O APIdoc afirma:
Portanto, para evitar o erro, chame destroy antes de remover o elemento textarea do DOM ou chame destory (true) para evitar a tentativa de atualizar o elemento DOM inexistente.
(usando a versão 3.6.2 com adaptador jQuery)
fonte
Isto é o que funcionou para mim:
fonte
Estou usando isso antes de minhas chamadas para criar uma instância (algumas por carregamento de página). Não tenho certeza de como isso afeta o tratamento da memória e quais não. Isso só funcionaria se você quisesse substituir todas as instâncias em uma página.
fonte
Eu preparei minha própria solução com base em todos os códigos acima.
Funciona perfeitamente para mim.
Às vezes, após a solicitação AJAX, há uma estrutura DOM incorreta. Por exemplo:
Isso também causará problemas e o ckEditor não funcionará. Portanto, certifique-se de ter a estrutura DOM correta.
fonte
Eu tive o mesmo problema com instâncias, estava procurando em todos os lugares e, finalmente, esta implementação funciona para mim:
fonte
Você pode remover qualquer instância do ckeditor pelo método remove do ckeditor. A instância será id ou nome da textarea.
fonte
Na verdade, remover a classe ".ckeditor" do seu código resolve o problema. A maioria de nós seguiu o exemplo de integração jQuery da documentação do ckeditor:
e pensei "... talvez eu possa apenas me livrar ou a parte '.jquery_'".
Tenho perdido meu tempo ajustando a função de retorno de chamada (porque o {skin: 'office2003'} realmente funcionou), enquanto o problema estava vindo de outro lugar.
Acho que a documentação deve mencionar que o uso de "ckeditor" como um nome de classe não é recomendado, porque é uma palavra-chave reservada.
Felicidades.
fonte
Eu aprendi isso
excluir CKEDITOR.instances [editorName];
por si só, realmente removeu a instância. TODOS os outros métodos que li e vi, incluindo o que foi encontrado aqui no stackoverflow de seus usuários, não funcionaram para mim.
Na minha situação, estou usando uma chamada ajax para puxar uma cópia do conteúdo enrolado em e de. O problema acontece porque estou usando um evento jQuery .live para vincular um link "Editar este documento" e, em seguida, aplicando a instância ckeditor após o sucesso do carregamento do ajax. Isso significa que, quando clico em outro link de um link com outro evento .live, devo usar delete CKEDITOR.instances [editorName] como parte de minha tarefa de limpar a janela de conteúdo (segurando o formulário) e, em seguida, buscar novamente o conteúdo mantido no banco de dados ou outro recurso.
fonte
Eu tive o mesmo problema com um diálogo jQuery.
Por que destruir a instância se você apenas deseja remover os dados anteriores?
fonte
Eu escolhi renomear todas as instâncias em vez de destruir / substituir - já que às vezes a instância carregada com AJAX não substitui realmente aquela no núcleo da página ... mantém mais na RAM, mas menos conflito desta forma.
fonte
Estou em uma situação em que tenho que controlar que geram diálogos, cada um deles precisa ter um ckeditor embutido nesses diálogos. E acontece que as áreas de texto compartilham o mesmo id. (normalmente esta é uma prática muito ruim, mas eu tenho 2 jqGrids, um de itens atribuídos e outro de itens não atribuídos.) Eles compartilham uma configuração quase idêntica. Portanto, estou usando um código comum para configurar ambos.
Então, quando eu carrego uma caixa de diálogo, para adicionar linhas, ou para editá-los, de qualquer jqGrid; Devo remover todas as instâncias de CKEDITOR em todas as áreas de texto.
Isso fará um loop em todas as áreas de texto e, se houver uma instância CKEDITOR, então a destruirá.
Alternativamente, se você usar jQuery puro:
fonte
remover
class="ckeditor"
, pode ter acionado a inicialização do ckeditorfonte
Eu tive o mesmo problema em que estava recebendo uma exceção de referência nula e a palavra "nula" seria exibida no editor. Tentei um punhado de soluções, incluindo atualizar o editor para 3.4.1 sem sucesso.
Acabei tendo que editar a fonte. Por volta das linhas 416 a 426 em _source \ plugins \ wysiwygarea \ plugin.js, há um snippet como este:
Pelo menos no FF, o iframe não é completamente instanciado no momento em que é necessário. Envolvi o resto da função após essa linha com uma função setTimeout:
O texto é renderizado de forma consistente agora nos diálogos modais.
fonte
Para suportar o carregamento dinâmico (Ajax) de formulários (sem atualizações de página entre) que contêm áreas de texto com o mesmo (o mesmo formulário é chamado novamente) ou IDs diferentes (formulário previamente descarregado) e convertê-los em elementos CKEditor, fiz o seguinte (usando o JQuery adaptador):
Depois que a página termina cada chamada Ajax que entrega uma textarea a ser convertida, faço uma chamada para a seguinte função:
Isso se parece com isto (pressupõe que suas áreas de texto sejam convertidas em RTE's have class = "yourCKClass" ):
Devo mencionar que a linha:
poderia (e deveria) ser simplesmente:
no entanto, descobri que o editor frequentemente mostrava o conteúdo correto por um segundo após o carregamento e esvaziava o editor do conteúdo desejado. Portanto, essa linha com o código de retorno de chamada força o conteúdo do CKEditor a ser igual ao conteúdo da área de texto de origem. Causa tremulação quando usado. Se você puder evitar usá-lo, faça-o ..
fonte
Eu tive exatamente o mesmo problema que o jackboberg. Eu estava usando o carregamento dinâmico de formulários em diálogos jquery e, em seguida, anexando vários widgets (datepickers, ckeditors etc ...). E tentei todas as soluções mencionadas acima, nenhuma delas funcionou para mim.
Por alguma razão, o ckeditor apenas anexou na primeira vez que carreguei o formulário, na segunda vez recebi exatamente a mesma mensagem de erro que o jackboberg.
Eu analisei meu código e descobri que se você anexar o ckeditor no "meio do ar", enquanto o conteúdo do formulário ainda não foi colocado no diálogo, o ckeditor não anexará suas ligações corretamente. Isso é porque o ckeditor está conectado no "meio do ar", da segunda vez que você o anexa no "meio do ar" ... puf ... um erro é gerado, pois a primeira instância não foi removida corretamente do DOM.
Este foi o meu código que produziu o erro:
Esta é a correção que funcionou:
fonte
Encontrei exatamente a mesma coisa e o problema é que o plugin wordcount estava demorando muito para inicializar. 30+ segundos. O usuário clica na visualização que exibe o ckeditor e, em seguida, cancela, carregando com o ajax uma nova página no dom. O plug-in estava reclamando porque o iframe ou qualquer outro item para o qual contentWindow está apontando não estava mais visível no momento em que estava pronto para ser adicionado ao contentWindow. Você pode verificar isso clicando em sua visualização e aguardando que a contagem de palavras apareça no canto inferior direito do editor. Se você cancelar agora, não terá problemas. Se você não esperar por isso, receberá o erro i.contentWindow is null. Para consertar, apenas descarte o plugin:
Se você precisar de um contador de palavras, registre-se para os eventos de colagem e tecla no editor com uma função que conta as palavras.
fonte
Para aqueles que usam o "adaptador" jquery e estão tendo problemas (como eu), como uma solução super hackeada, mas funcional, é fazer algo assim:
O ponto principal é esta parte:
Isso corrige o problema de o texto do editor não estar visível na próxima vez que você abrir a caixa de diálogo. Sei que isso é muito hackeado, mas considerando que a maioria deles será usada para ferramentas de administração, não acho que seja uma preocupação tão grande como normalmente seria .. e isso funciona, então espero que possa salvar alguém Tempo ;)
fonte
Este é o código totalmente funcional para jquery .load () api e ckeditor, no meu caso, estou carregando uma página com ckeditor em div com alguns efeitos jquery. Espero que ajude você.
fonte
É muito simples. No meu caso, executei o método jquery abaixo, que destruirá as instâncias do ckeditor durante o carregamento da página. Isso funcionou e resolveu o problema -
Método JQuery -
É isso aí. Espero que ajude você.
Saúde, Sirish.
fonte
Esta função funciona para mim no CKEditor versão 4.4.5, não tem nenhum vazamento de memória
// chame esta função como abaixo
fonte
CKeditor 4.2.1
Há muitas respostas aqui, mas para mim eu precisava de algo mais (um pouco sujo também, se alguém puder melhorar, por favor, faça). Para mim, MODALs onde meu problema.
Eu estava renderizando o CKEditor em modal, usando Foundation. Idealmente, eu teria destruído o editor ao fechar, mas não queria mexer com a Fundação.
Eu chamei delete, tentei remover e outro método, mas foi com isso que finalmente me decidi.
Eu estava usando textarea para preencher não DIVs.
Minha Solução
esse era o meu método para retornar minha formatação específica, que você pode não querer.
fonte
Experimente isto:
fonte