Eu tenho uma string HTML que representa um elemento: '<li>text</li>'
. Eu gostaria de anexá-lo a um elemento no DOM (a ul
no meu caso). Como posso fazer isso com o Prototype ou com os métodos DOM?
(Eu sei que eu poderia fazer isso facilmente no jQuery, mas infelizmente não estamos usando o jQuery.)
javascript
dom
prototypejs
Omer Bokhari
fonte
fonte
var nodes = document.fromString("<b>Hello</b> <br>");
Respostas:
Nota: a maioria dos navegadores atuais suporta
<template>
elementos HTML , que fornecem uma maneira mais confiável de ativar a criação de elementos a partir de strings. Veja a resposta de Mark Amery abaixo para obter detalhes .Para navegadores mais antigos e node / jsdom : (que ainda não suporta
<template>
elementos no momento da escrita), use o seguinte método. É a mesma coisa que as bibliotecas costumam fazer para obter elementos DOM de uma string HTML ( com algum trabalho extra para o IE solucionar problemas com a implementação deinnerHTML
):Observe que, diferentemente dos modelos HTML, isso não funcionará para alguns elementos que não podem ser legalmente filhos de a
<div>
, como<td>
s.Se você já estiver usando uma biblioteca, recomendo que você siga o método aprovado pela biblioteca de criar elementos a partir de strings HTML:
update()
método .jQuery(html)
ejQuery.parseHTML
métodos.fonte
createElementFromHTML
é enganoso, poisdiv.firstChild
retorna aNode
que não é porHTMLElement
exemplo, não podenode.setAttribute
. Para criar umElement
retornodiv.firstElementChild
da função.<div>
empacotamento do HTML que eu adicionei.innerHTML
me incomodou. Eu nunca pensei em usar.firstChild
.div
e a saída é[object SVGSVGElement]
enquanto o log do console me fornece o elemento DOM correto. O que estou fazendo errado?O HTML 5 introduziu o
<template>
elemento que pode ser usado para essa finalidade (como agora descrito nas especificações do WhatWG e nos documentos MDN ).Um
<template>
elemento é usado para declarar fragmentos de HTML que podem ser utilizados em scripts. O elemento é representado no DOM como umHTMLTemplateElement
que possui uma.content
propriedade doDocumentFragment
tipo, para fornecer acesso ao conteúdo do modelo. Isso significa que você pode converter uma string HTML em elementos DOM, definindo oinnerHTML
de um<template>
elemento e acessando a propriedadetemplate
's.content
.Exemplos:
Observe que abordagens semelhantes que usam um elemento de contêiner diferente, como um
div
, não funcionam bem. O HTML tem restrições sobre quais tipos de elementos podem existir dentro de quais outros tipos de elementos; por exemplo, você não pode colocar atd
como filho direto de adiv
. Isso faz com que esses elementos desapareçam se você tentar definir oinnerHTML
de adiv
para contê-los. Como<template>
s não têm essas restrições em seu conteúdo, essa falha não se aplica ao usar um modelo.No entanto,
template
não é suportado em alguns navegadores antigos. Em janeiro de 2018, posso usar ... estima que 90% dos usuários globalmente estão usando um navegador que suportatemplate
s . Em particular, nenhuma versão do Internet Explorer os suporta; A Microsoft não implementou otemplate
suporte até o lançamento do Edge.Se você tiver sorte o suficiente para escrever código direcionado apenas a usuários em navegadores modernos, vá em frente e use-o agora. Caso contrário, pode ser necessário esperar um pouco para que os usuários os atualizem.
fonte
html.trim
mas pela análise interna da configuração innerHTML. No meu caso, remove espaços importantes fazendo parte de um textNode. :-(Use insertAdjacentHTML () . Ele funciona com todos os navegadores atuais, mesmo com o IE11.
fonte
insertAdjacentHTML
funciona com todos os navegadores desde o IE 4.0.innerHTML += ...
é que as referências aos elementos anteriores ainda estão intactas usando esse método.beforebegin
,afterbegin
,beforeend
,afterend
. Veja o artigo MDN.Implementações DOM mais recentes têm
range.createContextualFragment
, o que faz o que você deseja de uma maneira independente da estrutura.É amplamente suportado. Para ter certeza, verifique sua compatibilidade no mesmo link MDN, pois ele será alterado. Em maio de 2017, é isso:
fonte
innerHTML
de uma div; certos elementos, comotd
s, serão ignorados e não aparecerão no fragmento resultante.Não há necessidade de nenhum ajuste, você tem uma API nativa:
fonte
<td>text</td>
. Isso ocorre porqueDOMParser
está tentando analisar um documento HTML completo e nem todos os elementos são válidos como elementos raiz de um documento.Para certos fragmentos de html
<td>test</td>
, como as soluções div.innerHTML, DOMParser.parseFromString e range.createContextualFragment (sem o contexto correto) mencionados em outras respostas aqui, não criarão o<td>
elemento.O jQuery.parseHTML () lida com eles adequadamente (extraí a função parseHTML do jQuery 2 em uma função independente que pode ser usada em bases de código que não sejam de jquery).
Se você suporta apenas o Edge 13+, é mais simples usar a tag do modelo HTML5:
fonte
Aqui está uma maneira simples de fazer isso:
fonte
Você pode criar nós DOM válidos a partir de uma sequência usando:
document.createRange().createContextualFragment()
O exemplo a seguir adiciona um elemento de botão na página que recebe a marcação de uma sequência:
fonte
DocumentFragment
objeto, ele ainda - para minha grande surpresa - sofre do mesmo defeito que a resposta aceita: se o fizerdocument.createRange().createContextualFragment('<td>bla</td>')
, obtém um fragmento que contém apenas o texto 'bla' sem o<td>
elemento. Ou pelo menos, é o que observo no Chrome 63; Eu não me aprofundei nas especificações para descobrir se é o comportamento correto ou não.Com o Prototype, você também pode:
HTML:
JS:
fonte
Estou usando esse método (funciona no IE9 +), embora ele não analise
<td>
ou outros filhos diretos inválidos do corpo:fonte
Para aprimorar ainda mais o trecho útil .toDOM () que podemos encontrar em lugares diferentes, agora podemos usar com segurança backticks ( literais de modelo ).
Assim, podemos ter aspas simples e duplas na declaração foo html.
Isso se comporta como heredocs para aqueles familiarizados com o termo.
Além disso, isso pode ser aprimorado com variáveis, para criar modelos complexos:
Então, por que não usar diretamente
.innerHTML +=
? Ao fazer isso, todo o DOM está sendo recalculado pelo navegador, é muito mais lento.https://caniuse.com/template-literals
fonte
Eu adicionei um
Document
protótipo que cria um elemento da string:fonte
td
s.HTML5 e ES6
<template>
Demo
fonte
Tarde, mas apenas como uma nota;
É possível adicionar um elemento trivial ao elemento de destino como um contêiner e removê-lo após o uso.
// Testado no chrome 23.0, firefox 18.0, ie 7-8-9 e opera 12.11.
fonte
Solução mais rápida para renderizar DOM a partir da string:
E aqui você pode verificar o desempenho da manipulação do DOM React vs JS nativo
Agora você pode simplesmente usar:
E, claro, em um futuro próximo, você usará referências da memória, porque var "elemento" é o seu novo DOM criado em seu documento.
E lembre-se "innerHTML =" é muito lento: /
fonte
Aqui está o meu código e funciona:
fonte
No começo, pensei em compartilhar isso com uma abordagem complicada, mas simples, que eu criei ... Talvez alguém encontre algo útil.
fonte
Por que não fazer com js nativos?
fonte
fonte
Você pode usar a seguinte função para converter o texto "HTML" no elemento
fonte
td
s.Use jnerator
fonte
Aqui está o código de trabalho para mim
Eu queria converter a string ' Text ' em elemento HTML
fonte
wwww
?var msg = "test" jQuery.parseHTML (msg)
fonte
Isso também funcionará:
Parece mais uma maneira jquery com as chamadas de função encadeadas.
fonte