Criar um editor embutido requer esforço. Você começa trocando o elemento a ser editado com um input
ou textarea
campo. Para uma experiência de usuário perfeita, você também pode ter que usar algum CSS para combinar o estilo dos elementos trocados com o original. Assim que o usuário terminar de editar, você terá que trocar novamente os elementos depois de copiar todo o conteúdo para os originais.
o contentEditable
atributo torna esta tarefa muito mais fácil. Tudo o que você precisa fazer é definir este atributo para true
e os elementos HTML5 padrão se tornarão editáveis. Neste tutorial, criaremos um editor de rich text embutido com base nesse recurso.
O básico
Este atributo pode ter três valores válidos. Estes são true
, false
e inherit
. O valor que true
indica que o elemento é editável. Uma string vazia também será avaliada como verdadeira. false
indica que o elemento não é editável. O valor que inherit
é o valor padrão. inherit
indica que um elemento será editável se seu pai imediato for editável. Isso implica que, se você tornar um elemento editável, todos os seus filhos e não apenas os imediatos também se tornarão editáveis, a menos que você defina explicitamente seus contentEditable
atribuir a false
.
Você pode alterar esses valores dinamicamente com JavaScript. Se o novo valor não for nenhum dos três válidos, ele lança um SyntaxError
exceção.
Criando o Editor
Para criar o editor embutido, você precisa ter a capacidade de alterar o valor do contentEditable
atributo sempre que um usuário decide editar algo.
Ao alternar o contentEditable
atributo, é necessário saber qual valor o atributo possui atualmente. Para isso, você pode usar o isContentEditable
propriedade. Se isContentEditable
retorna true
para um elemento, o elemento é editável no momento, caso contrário, não. Usaremos essa propriedade em breve para determinar o estado de vários elementos em nosso documento.
Primeiro, precisamos criar um diretório chamado editor de conteúdo editável. Dentro dele, crie um novo arquivo chamado index.html. Você pode usar isso como um esqueleto para seu arquivo HTML.
Text Editor
O primeiro passo na construção do editor é a criação de um botão para alternar a edição e alguns elementos editáveis. Dentro de elemento, coloque isso:
A Nice Heading.
Last Edited By -
Some content that needs correction.
Cada elemento que pretendemos manter editável precisa ter seu próprio Id
. Isso será útil quando tivermos que salvar as alterações ou recuperá-las posteriormente para substituir o texto dentro de cada elemento.
O código JavaScript a seguir lida com toda a edição e salvamento.
const editBtn = document.getElementById('editBtn'); const editables = document.querySelectorAll('#title, #author, #content') editBtn.addEventListener('click', function(e) { if (!editables[0].isContentEditable) { editables[0].contentEditable="true"; editables[1].contentEditable="true"; editables[2].contentEditable="true"; editBtn.innerHTML = 'Save Changes'; editBtn.style.backgroundColor="#6F9"; } else { // Disable Editing editables[0].contentEditable="false"; editables[1].contentEditable="false"; editables[2].contentEditable="false"; // Change Button Text and Color editBtn.innerHTML = 'Enable Editing'; editBtn.style.backgroundColor="#F96"; // Save the data in localStorage for (var i = 0; i < editables.length; i++) { localStorage.setItem(editables[i].getAttribute('id'), editables[i].innerHTML); } } });
Você pode colocar este código em um etiqueta na parte inferior do
marcação. Nós usamos
querySelectorAll()
para armazenar todos os elementos editáveis em uma variável. Este método retorna um NodeList
que contém todos os elementos em nosso documento que são correspondidos por seletores especificados. Dessa forma, é mais fácil acompanhar os elementos editáveis com uma variável. Por exemplo, o título do nosso documento pode ser acessado usando editables[0]
que é o que faremos a seguir.
Em seguida, adicionamos um ouvinte de evento ao evento de clique do nosso botão. Toda vez que um usuário clica no botão Editar documento, verificamos se o título é editável. Se não for editável, definimos o contentEditable
propriedade em cada um dos elementos editáveis para true
. Além disso, o texto 'Edit Document'
muda para 'Save Changes'
. Depois que os usuários fizerem algumas edições, eles podem clicar no 'Save Changes'
botão e as alterações feitas podem ser salvas permanentemente.
Se o título for editável, definimos o contentEditable
propriedade em cada um dos elementos editáveis para false. Neste ponto, também podemos salvar o conteúdo do nosso documento no servidor para recuperar mais tarde ou sincronizar as alterações com uma cópia que existe em outro lugar. Neste tutorial vou salvar tudo em localStorage
em vez de. Ao salvar o valor em localStorage
estou usando o Id
de cada elemento para garantir que eu não sobrescreva nada.
Recuperando conteúdo salvo
Se você fizer alterações em qualquer um dos elementos da demonstração anterior e recarregar a página, notará que as alterações feitas desapareceram. Isso ocorre porque não há código para recuperar os dados salvos. Uma vez que o conteúdo foi salvo em localStorage
precisamos recuperá-lo mais tarde quando um usuário visitar a página da Web novamente.
if (typeof(Storage) !== "undefined") { if (localStorage.getItem('title') !== null) { editables[0].innerHTML = localStorage.getItem('title'); } if (localStorage.getItem('author') !== null) { editables[1].innerHTML = localStorage.getItem('author'); } if (localStorage.getItem('content') !== null) { editables[2].innerHTML = localStorage.getItem('content'); } }
O código acima verifica se o título, autor ou conteúdo já existe no localStorage
. Se o fizerem, definimos o innerHTML
dos respectivos elementos aos valores recuperados.
Salvamento automático
Para tornar o editor mais amigável, devemos adicionar o salvamento automático. O primeiro método salva automaticamente seu trabalho a cada cinco segundos.
setInterval(function() { for (var i = 0; i < editables.length; i++) { localStorage.setItem(editables[i].getAttribute('id'), editables[i].innerHTML); } }, 5000);
Você também pode salvar as alterações em cada keydown
evento.
document.addEventListener('keydown', function(e) { for (var i = 0; i < editables.length; i++) { localStorage.setItem(editables[i].getAttribute('id'), editables[i].innerHTML); } });
Neste tutorial, estou aderindo ao último método. Você pode acionar o salvamento automático com base em qualquer evento que pareça apropriado em seus projetos.
Criando uma barra de ferramentas
Agora, precisamos facilitar para as pessoas inserirem novos títulos e outros elementos de formatação. Para fazer isso, vamos adicionar uma barra de ferramentas. Primeiro, precisamos adicionar um pouco de HTML. Adicione este snippet ao topo do marcação.
Agora, vamos fazer isso realmente fazer alguma coisa. Precisamos adicionar um click
evento que insere um título no bloco de conteúdo.
document.querySelector("#addh1").addEventListener("click", function (e) { const text = prompt( "What text do you want the heading to have?", "Heading" ); editables[2].innerHTML = editables[2].innerHTML + `${text}
`; });
Isso anexa um click
evento para o botão H1 que solicita que você digite o texto usando o prompt()
função e coloca esse texto em um cabeçalho dentro do bloco de conteúdo. Você também pode editar o cabeçalho como texto normal, se desejar. Para adicionar este funcional para H2s, basta alterar o seletor de elementos e o HTML inserido.
document.querySelector("#addh2").addEventListener("click", function (e) { const text = prompt( "What text do you want the heading to have?", "Heading" ); editables[2].innerHTML = editables[2].innerHTML + `${text}
`; });
Você pode facilmente estender isso para outros elementos, como texto em negrito e sublinhado, apenas criando uma nova linha e uma versão do código acima com o novo seletor e diferentes tags HTML inseridas.
Estilizando o Editor
Atualmente, o editor não possui CSS. Você pode estilizá-lo como quiser, mas também temos um estilo pré-fabricado para você. Se você quiser o mesmo estilo que usei nas canetas de código, você pode usar este CSS.
body { font-family: Arial; font-size: 1.3em; line-height: 1.6em; } .headline { font-size: 2em; text-align: center; } #wrapper { width: 600px; background: #fff; padding: 1em; margin: 1em auto; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); border-radius: 3px; } button { border: none; padding: 0.8em; background: #f96; border-radius: 3px; color: white; font-weight: bold; margin: 0 0 1em; } button:hover, button:focus { cursor: pointer; outline: none; } #editor { padding: 1em; background: #e6e6e6; border-radius: 3px; }
Teste
Para testar seu trabalho, você pode usar algo como serve
. Para usar serve, basta executar npm i -g serve
e depois corra serve
dentro do diretório que contém seu trabalho. serve
iniciará automaticamente um servidor web contendo seu arquivo HTML, para o qual você pode navegar clicando no link impresso.
Editando a página inteira com o modo de design
contentEditable
é útil quando você precisa editar alguns elementos em uma página da web. Quando o conteúdo de todos ou quase todos os elementos de uma página da Web precisa ser alterado, você pode usar o designMode
propriedade. Esta propriedade é aplicável a todo o documento. Para transformá-lo on
e off
você usa document.designMode="on";
e document.designMode="off";
respectivamente.
Isso será valioso em situações em que você é o designer e outra pessoa é o criador do conteúdo. Você fornece a eles um design e algum texto fictício. Mais tarde, eles podem substituí-lo por conteúdo real. Ver designMode
em ação, abra a guia do console nas ferramentas de desenvolvedor do seu navegador. Modelo document.designMode="on";
no console e pressione Digitar. Tudo nesta página deve ser editável agora.
Pensamentos finais
o contentEditable
O atributo é conveniente em situações como editar artigos rapidamente ou permitir que os usuários editem seus comentários com um único clique. Esse recurso foi implementado pela primeira vez pelo IE 5.5. Mais tarde, foi padronizado pelo WHATWG. O suporte do navegador também é muito bom. Todos os principais navegadores além do Opera Mini suportam este atributo.
JavaScript tornou-se uma das linguagens padrão de trabalho na web. Não é sem curvas de aprendizado, e há muitas estruturas e bibliotecas para mantê-lo ocupado também. Se você está procurando recursos adicionais para estudar ou usar em seu trabalho, confira o que temos disponível no marketplace da Envato.
Este tutorial cobriu os fundamentos do contentEditable
atributo e como ele pode ser usado para criar um editor de texto embutido básico, bem como adicionar botões para formatação avançada.
Este post foi atualizado com contribuições de Jacob Jackson. Jacob é desenvolvedor web, redator técnico, freelancer e colaborador de código aberto.
Originally posted 2022-06-29 09:09:46.