Estou tentando obter o HTML de um objeto selecionado com jQuery. Eu estou ciente da .html()
função; o problema é que preciso do HTML, incluindo o objeto selecionado (neste caso, uma linha da tabela, onde .html()
somente retorna as células dentro da linha).
Eu procurei e encontrei alguns métodos do tipo 'hackish' de clonar um objeto, adicionando-o a uma div recém criada, etc, etc, mas isso parece realmente sujo. Existe alguma maneira melhor ou a nova versão do jQuery (1.4.2) oferece algum tipo de outerHtml
funcionalidade?
$('div')[0].outerHTML
.Respostas:
Edição de 2014: A pergunta e esta resposta são de 2010. Na época, nenhuma solução melhor estava amplamente disponível. Agora, muitas das outras respostas são melhores: Eric Hu ou Re Capcha, por exemplo.
Este site parece ter uma solução para você: jQuery: outerHTML | Yelotofu
fonte
outerHTML
Firefox é suportado apenas desde a versão 11 (março de 2012).outerHTML
é um atributo proprietário inventado pela Microsoft, não um padrão W3C. (Curiosidade:innerHTML
é padronizado apenas desde HTML5 )el.outerHTML || document.createElement('div').appendChild( el.cloneNode( true ) ).parentNode.innerHTML
Acredito que atualmente (1/5/2012), todos os principais navegadores suportam a função outerHTML. Parece-me que esse trecho é suficiente. Eu pessoalmente escolheria memorizar isso:
EDIT : estatísticas básicas de suporte para
element.outerHTML
fonte
Não há necessidade de gerar uma função para ele. Apenas faça assim:
(A propósito, o console do seu navegador mostrará o que é registrado. A maioria dos navegadores mais recentes desde 2009 tem esse recurso.)
A mágica é esta no final:
O clone significa que você não está realmente perturbando o DOM. Execute-o sem ele e você verá as
p
tags inseridas antes / depois de todos os hiperlinks (neste exemplo), o que é indesejável. Então, sim, use.clone()
.O modo como funciona é que ele pega cada
a
tag, cria um clone na RAM, envolvep
etiquetas, obtém o pai dela (ou seja, ap
tag) e, em seguida, obtém suainnerHTML
propriedade.EDIT : aconselhou e mudou
div
tags parap
tags porque é menos digitado e funciona da mesma maneira.fonte
Que tal
prop('outerHTML')
:?E para definir:
Funcionou para mim.
PS : Isso é adicionado no jQuery 1.6 .
fonte
Estenda o jQuery:
E use-o assim:
$("#myTableRow").outerHTML();
fonte
return $('<div>').append(this.clone()).html();
é apenas um pouco mais direto ao ponto.Eu concordo com Arpan (13 de dezembro de 10 5:59).
Sua maneira de fazer isso é realmente uma maneira MUITO melhor de fazê-lo, já que você não usa clone. O método clone consome muito tempo, se você tiver elementos filhos, e ninguém mais parecia se importar com o fato de o IE ter o
outerHTML
IE ter atributo (sim, o IE realmente tem alguns truques úteis na manga).Mas eu provavelmente criaria o script dele um pouco diferente:
fonte
clone()
etextarea
, eu precisava de uma solução não-clone, e isso estava certo.outerHTML
quando disponível, pois é compatível com o Chrome, além do Internet Explorer.Para ser verdadeiramente jQuery-esque, convém
outerHTML()
ser um getter e um setter e ter seu comportamento o mais semelhantehtml()
possível:Isso nos permite passar um argumento para
outerHTML
, que pode serfunction (index, oldOuterHTML) { }
- onde o valor retornado se tornará o novo HTML para o elemento (a menos quefalse
seja retornado).Para obter mais informações, consulte os documentos do jQuery para
html()
.fonte
Você também pode usar get (Recupere os elementos DOM correspondentes ao objeto jQuery.).
por exemplo:
Como método de extensão:
Ou
Escolha múltipla e retorne o html externo de todos os elementos correspondentes.
Retorna:
fonte
Para criar um plug-in jQuery COMPLETO como
.outerHTML
, adicione o seguinte script a qualquer arquivo js e inclua após o jQuery em seu cabeçalho:Isso permitirá que você não apenas obtenha o outerHTML de um elemento, mas também receba um retorno de vários elementos ao mesmo tempo! e pode ser usado nos dois estilos padrão do jQuery:
Para vários elementos
Exemplos de trechos:
Mostrar snippet de código
fonte
você também pode fazer dessa maneira
onde id é o id do elemento que você está procurando
fonte
$("#" + id).attr("id")
é incrivelmente redundante. Se você já possui o ID em uma variável, por que está usando um seletor jquery para extrair o elemento do dom e consultando seu atributo ID?Usei a solução de Jessica (que foi editada por Josh) para fazer com que o outerHTML funcionasse no Firefox. O problema, porém, é que meu código estava quebrando porque a solução dela envolveu o elemento em um DIV. A adição de mais uma linha de código resolveu esse problema.
O código a seguir fornece o outerHTML, deixando a árvore DOM inalterada.
E use-o assim: $ ("# myDiv"). OuterHTML ();
Espero que alguém ache útil!
fonte
Violino aqui: http://jsfiddle.net/ezmilhouse/Mv76a/
fonte
Se o cenário estiver anexando uma nova linha dinamicamente, você poderá usar este:
.myrow
é o nome da classe do<tr>
. Ele faz uma cópia da última linha e a insere como uma nova última linha. Isso também funciona no IE7 , enquanto o[0].outerHTML
método não permite atribuições no ie7fonte
node.cloneNode () dificilmente parece um hack. Você pode clonar o nó e anexá-lo a qualquer elemento pai desejado e também manipulá-lo, manipulando propriedades individuais, em vez de ter que, por exemplo, executar expressões regulares nele ou adicioná-lo ao DOM e manipulá-lo depois.
Dito isto, você também pode iterar sobre os atributos do elemento para construir uma representação em string HTML dele. Parece provável que é assim que qualquer função outerHTML seria implementada se o jQuery adicionasse uma.
fonte
Eu usei a solução da Volomike atualizada por Jessica. Basta adicionar uma verificação para ver se o elemento existe e retornar em branco caso não exista.
Obviamente, use-o como:
fonte
Você pode encontrar uma boa opção .outerHTML () aqui https://github.com/darlesson/jquery-outerhtml .
Ao contrário de .html () que retorna apenas o conteúdo HTML do elemento, esta versão de .outerHTML () retorna o elemento selecionado e seu conteúdo HTML ou o substitui como método .replaceWith (), mas com a diferença que permite que o HTML substituto seja herdado por o encadeamento.
Exemplos também podem ser vistos no URL acima.
fonte
Observe que a solução de Josh funciona apenas para um único elemento.
Indiscutivelmente, o HTML "externo" só faz sentido quando você tem um único elemento, mas há situações em que faz sentido pegar uma lista de elementos HTML e transformá-los em marcação.
Estendendo a solução de Josh, este manipulará vários elementos:
Edit: outro problema com a solução de Josh corrigida, veja o comentário acima.
fonte
Outra solução semelhante com adição
remove()
do objeto DOM temporário.fonte
Eu fiz esse teste simples com outerHTML sendo a solução tokimon (sem clone) e outerHTML2 sendo a solução jessica (clone)
e o resultado no meu navegador chromium (versão 20.0.1132.57 (0)) foi
outerHTML: 81ms
outerHTML2: 439ms
mas se usarmos a solução tokimon sem a função outerHTML nativa (que agora é suportada provavelmente em quase todos os navegadores)
Nós temos
outerHTML: 594ms
outerHTML2: 332ms
e haverá mais loops e elementos em exemplos do mundo real, então a combinação perfeita seria
O método clone é realmente mais rápido que o método wrap / desembrulhar
(jquery 1.7.2)
fonte
Aqui está um plugin outerHTML muito otimizado para jquery: ( http://jsperf.com/outerhtml-vs-jquery-clone-hack/5 => os outros dois trechos de código rápido não são compatíveis com alguns navegadores como FF <11)
@ Andy E => Eu não concordo com você. outerHMTL não precisa de um getter E de um setter: o jQuery já nos fornece 'replaceWith' ...
@mindplay => Por que você está juntando todo o outerHTML? jquery.html retorna apenas o conteúdo HTML do PRIMEIRO elemento.
(Desculpe, não tem reputação suficiente para escrever comentários)
fonte
Curto e grosso.
ou evento mais doce com a ajuda das funções de seta
ou sem jQuery
ou se você não gostar dessa abordagem, verifique se
fonte
Isso é bastante simples com JavaScript baunilha ...
fonte
Isso é ótimo para alterar elementos no dom, mas NÃO funciona, ou seja, ao passar uma string html para o jquery como este:
Após alguma manipulação, criei uma função que permite que o acima funcione, ou seja, para strings html:
fonte
$.html = el => $("<div>"+el+"</div>").html().trim();
fonte
Me deparei com isso enquanto procurava uma resposta para o meu problema, que era tentar remover uma linha da tabela e adicioná-la novamente na parte inferior da tabela (porque eu estava criando linhas de dados dinamicamente, mas queria mostrar um 'Adicionar novo Linha do tipo 'Record' na parte inferior).
Eu tive o mesmo problema, na medida em que estava retornando o innerHtml, perdendo as tags TR, que continham o ID dessa linha e significavam que era impossível repetir o procedimento.
A resposta que encontrei foi que a
remove()
função jquery realmente retorna o elemento que ele remove como um objeto. Então, para remover e adicionar novamente uma linha, era tão simples quanto isso ...Se você não estiver removendo o objeto, mas quiser copiá-lo em outro lugar, use a
clone()
função.fonte
O plugin jQuery como uma abreviação para obter diretamente todo o elemento HTML:
E use-o assim:
$(".element").outerHTML();
fonte
Onde 'x' é o número do nó, começando com 0 como o primeiro, deve obter o nó certo que você deseja, se estiver tentando obter um nó específico. Se você tem nós filhos, deve realmente colocar um ID no que deseja, para se concentrar apenas nele. Usar essa metodologia e nenhum 'x' funcionou bem para mim.
fonte
.html()
no elemento especificado. ISSO FUNCIONA e eu gostaria de uma explicação de por que não.Solução simples.
fonte
Talvez eu não esteja entendendo sua pergunta corretamente, mas isso obterá o html do elemento pai do elemento selecionado.
É isso que você procura?
fonte