Eu quero executar uma função quando um usuário edita o conteúdo de um div
com contenteditable
atributo. Qual é o equivalente de um onchange
evento?
Estou usando o jQuery, portanto, qualquer solução que use o jQuery é preferida. Obrigado!
javascript
jquery
html
contenteditable
Jourkey
fonte
fonte
document.getElementById("editor").oninput = function() { ...}
.Respostas:
Eu sugiro ouvintes associados aos principais eventos disparados pelo elemento editável, mas você precisa estar ciente de que
keydown
ekeypress
eventos são disparados antes que o próprio conteúdo é alterado. Isso não abrangerá todos os meios possíveis de alterar o conteúdo: o usuário também pode usar recortar, copiar e colar nos menus Editar ou navegador de contexto, portanto, você também pode manipular os eventoscut
copy
epaste
. Além disso, o usuário pode soltar texto ou outro conteúdo, para que haja mais eventos (mouseup
por exemplo). Você pode pesquisar o conteúdo do elemento como um substituto.ATUALIZAÇÃO 29 de outubro de 2014
O evento HTML5
input
é a resposta a longo prazo. No momento da redação deste artigo, ele é suportado paracontenteditable
elementos nos navegadores atuais Mozilla (do Firefox 14) e WebKit / Blink, mas não no IE.Demo:
Demo: http://jsfiddle.net/ch6yn/2691/
fonte
cut
,copy
epaste
eventos em navegadores que os apoiam (IE 5+, o Firefox 3.0+, Safari 3+, Chrome)input
evento HTML5 .Aqui está uma versão mais eficiente que é usada
on
para todos os conteúdos editáveis. É baseado nas principais respostas aqui.O projeto está aqui: https://github.com/balupton/html5edit
fonte
document.getElementById('editor_input').innerHTML = 'ssss'
. Desvantagem é que ele requer IE11Considere usar MutationObserver . Esses observadores são projetados para reagir a alterações no DOM e como substituto de desempenho para eventos de mutação .
Prós:
Contras:
Saber mais:
fonte
input
evento HTML5 (que é suportadocontenteditable
em todos os navegadores WebKit e Mozilla que oferecem suporte a observadores de mutação), já que a mutação DOM pode ocorrer por script e por entrada do usuário, mas é uma solução viável para esses navegadores. Eu imagino que isso poderia prejudicar o desempenho mais do que oinput
evento também, mas não tenho provas concretas disso.input
evento HTML5 é acionado em cada uma dessas situações (especificamente arraste e solte, itálico, copie / recorte / cole no menu de contexto). Também testei negrito c / cmd / ctrl + be obtive os resultados esperados. Também verifiquei e pude verificar se oinput
evento não dispara em alterações programáticas (o que parece óbvio, mas é indiscutivelmente contrário a alguma linguagem confusa na página MDN relevante; consulte a parte inferior da página aqui para ver o que quero dizer: desenvolvedor .mozilla.org / pt-Eu modifiquei a resposta de lawwantsin assim e isso funciona para mim. Eu uso o evento keyup em vez de pressionar a tecla, o que funciona muito bem.
fonte
resposta rápida e suja não jQuery :
fonte
Duas opções:
1) Para navegadores modernos (sempre-verdes): o evento "input" atuaria como um evento "change" alternativo.
https://developer.mozilla.org/en-US/docs/Web/Events/input
ou
ou (com jQuery)
2) Para considerar os navegadores IE11 e modernos (sempre-verdes): isso observa as alterações dos elementos e seu conteúdo dentro da div.
https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
fonte
fonte
Aqui está o que funcionou para mim:
fonte
Esse tópico foi muito útil enquanto eu investigava o assunto.
Modifiquei parte do código disponível aqui em um plug-in jQuery para que ele seja reutilizável, principalmente para satisfazer minhas necessidades, mas outros podem apreciar uma interface mais simples para iniciar o uso inicial de tags editáveis por conteúdo.
https://gist.github.com/3410122
Atualizar:
Devido à sua crescente popularidade, o plugin foi adotado por Makesites.org
O desenvolvimento continuará daqui:
https://github.com/makesites/jquery-contenteditable
fonte
Aqui está a solução que acabei usando e funciona fabulosamente. Eu uso $ (this) .text () porque estou apenas usando uma div de uma linha com conteúdo editável. Mas você também pode usar .html () dessa maneira, não precisa se preocupar com o escopo de uma variável global / não global e o anterior é realmente anexado ao editor div.
fonte
Para evitar temporizadores e botões "salvar", você pode usar um evento de desfoque que é acionado quando o elemento perde o foco. mas, para ter certeza de que o elemento foi realmente alterado (não apenas focado e desfocado), seu conteúdo deve ser comparado à sua última versão. ou use o evento keydown para definir algum sinalizador "sujo" nesse elemento.
fonte
Uma resposta simples no JQuery, eu apenas criei este código e achei que seria útil para outros também
fonte
$("div [contenteditable=true]")
irá selecionar todos os filhos de uma div, direta ou indiretamente, que sejam editáveis por conteúdo.Resposta não JQuery ...
Para usá-lo, chame (digamos) um elemento de cabeçalho com id = "myHeader"
Esse elemento agora será editável pelo usuário até perder o foco.
fonte
O evento onchange não é acionado quando um elemento com o atributo contentEditable é alterado. Uma abordagem sugerida pode ser adicionar um botão, "salvar" a edição.
Verifique este plugin que lida com o problema dessa maneira:
fonte
Usar DOMCharacterDataModified em MutationEvents levará ao mesmo. O tempo limite está configurado para evitar o envio de valores incorretos (por exemplo, no Chrome, tive alguns problemas com a tecla de espaço)
Exemplo JSFIDDLE
fonte
DOMCharacterDataModified
não será acionado quando o usuário modificar o texto existente, por exemplo, aplicando negrito ou itálico.DOMSubtreeModified
é mais apropriado neste caso. Além disso, as pessoas devem lembrar que os navegadores herdados não suportam esses eventos.Eu construí um plugin jQuery para fazer isso.
Você pode simplesmente ligar
$('.wysiwyg').wysiwygEvt();
Você também pode remover / adicionar eventos, se desejar
fonte
innerHTML
é caro). Eu recomendaria usar oinput
evento onde ele existe e voltar a algo assim, mas com algum tipo de devolução.Em Angular 2+
fonte
Por favor, siga a seguinte solução simples
Em .ts:
em .html:
fonte
Confira essa ideia. http://pastie.org/1096892
Eu acho que está perto. O HTML 5 realmente precisa adicionar o evento de alteração às especificações. O único problema é que a função de retorno de chamada avalia se (antes == $ (this) .html ()) antes que o conteúdo seja realmente atualizado em $ (this) .html (). setTimeout não funciona, e é triste. Diz-me o que pensas.
fonte
Com base na resposta de @ balupton:
fonte