Estou refatorando algum código JavaScript antigo e há muita manipulação de DOM acontecendo.
var d = document;
var odv = d.createElement("div");
odv.style.display = "none";
this.OuterDiv = odv;
var t = d.createElement("table");
t.cellSpacing = 0;
t.className = "text";
odv.appendChild(t);
Gostaria de saber se existe uma maneira melhor de fazer isso usando o jQuery. Eu tenho experimentado com:
var odv = $.create("div");
$.append(odv);
// And many more
Mas não tenho certeza se isso é melhor.
Respostas:
Aqui está o seu exemplo na linha "um".
Atualização : pensei em atualizar este post, pois ele ainda recebe bastante tráfego. Nos comentários abaixo, há alguma discussão sobre
$("<div>")
vs$("<div></div>")
vs$(document.createElement('div'))
como uma maneira de criar novos elementos, e qual é "melhor".Eu montei uma pequena referência e aqui estão aproximadamente os resultados de repetir as opções acima 100.000 vezes:
jQuery 1.4, 1.5, 1.6
jQuery 1.3
jQuery 1.2
Eu acho que não é uma grande surpresa, mas
document.createElement
é o método mais rápido. Obviamente, antes de começar a refatorar toda a sua base de código, lembre-se de que as diferenças de que estamos falando aqui (em todas as versões arcaicas do jQuery) equivalem a cerca de 3 milissegundos a cada mil elementos .Atualização 2
Atualizado para o jQuery 1.7.2 e colocando o benchmark no
JSBen.ch
qual provavelmente é um pouco mais científico do que meus benchmarks primitivos, além disso, ele pode ser disponibilizado agora!http://jsben.ch/#/ARUtz
fonte
$('div')
qual é visualmente muito semelhante, mas funcionalmente separado.$(document.createElement('div'))
e deveria ser a mais rápida?O simples fornecimento do HTML dos elementos que você deseja adicionar a um construtor jQuery
$()
retornará um objeto jQuery do HTML recém-criado, adequado para ser anexado ao DOM usando oappend()
método jQuery .Por exemplo:
Você pode preencher essa tabela programaticamente, se desejar.
Isso permite que você especifique qualquer HTML arbitrário que desejar, incluindo nomes de classe ou outros atributos, que você pode achar mais conciso do que usar
createElement
e, em seguida, definir atributos comocellSpacing
eclassName
via JS.fonte
$(htmlStr)
é implementado comodocument.createElement("div").innerHTML = htmlStr
. Em outras palavras, ele chama o analisador HTML do navegador. O HTML malformado é diferente no IE em comparação com outros navegadores.get
função que retorna o elemento DOM nativo. (Eu sei que este tópico é antigo, mas eu o adiciono para referência. ;-)) #[dom element].appendChild($('<html>')[0]);
Criar novos elementos DOM é um recurso principal do
jQuery()
método, consulte:fonte
$('<a>')
é inabalável!Eu estou fazendo assim:
fonte
já que
jQuery1.8
usar$.parseHTML()
para criar elementos é uma escolha melhor.existem dois benefícios:
1.se você usar da maneira antiga, que pode ser algo como
$(string)
, o jQuery examinará a string para garantir que você deseja selecionar uma tag html ou criar um novo elemento. Ao usar$.parseHTML()
, você diz ao jQuery que deseja criar um novo elemento explicitamente, para que o desempenho possa ser um pouco melhor.2.Muito mais importante é que você pode sofrer ataques entre sites ( mais informações ) se você usar o modo antigo. se você tiver algo como:
um bandido pode entrar
<script src="xss-attach.js"></script>
para provocar você. felizmente,$.parseHTML()
evite esse embaraço para você:No entanto, observe que
a
é um objeto jQuery enquantob
é um elemento html:fonte
parseHTML
é bom para html proveniente de fontes externas, mas que " todo o impulso se foi depois de agrupar os resultados em um novo objeto jQuery ". Ou seja, se você deseja codificar a criação de um novo elemento html envolto em jQuery, o$("<div>stuff</div>")
estilo ainda parece ganhar.ATUALIZAR
Desde as versões mais recentes do jQuery, o método a seguir não atribui propriedades passadas no segundo objeto
Resposta anterior
Eu sinto que usar
document.createElement('div')
junto comjQuery
é mais rápido:fonte
Embora essa seja uma pergunta muito antiga, pensei que seria bom atualizá-la com informações recentes;
Desde o jQuery 1.8, existe uma função jQuery.parseHTML () que agora é a maneira preferida de criar elementos. Além disso, há alguns problemas na análise de HTML por
$('(html code goes here)')
exemplo, o site oficial do jQuery menciona o seguinte em uma de suas notas de versão :Para se relacionar com a pergunta real, o exemplo fornecido pode ser traduzido para:
que, infelizmente, é menos conveniente do que usar apenas
$()
, mas oferece mais controle; por exemplo, você pode optar por excluir as tags de script (isso deixará os scripts embutidos como seonclick
fossem):Além disso, aqui está uma referência da resposta principal ajustada à nova realidade:
Link JSbin
jQuery 1.9.1
Parece que
parseHTML
está muito mais perto docreateElement
que$()
, mas todo o aumento se foi depois de agrupar os resultados em um novo objeto jQueryfonte
fonte
É a maneira mais curta / fácil de criar um elemento DIV no jQuery.
fonte
Acabei de criar um pequeno plugin jQuery para isso: https://github.com/ern0/jquery.create
Segue sua sintaxe:
O ID do nó DOM pode ser especificado como segundo parâmetro:
Isto é sério? Não. Mas essa sintaxe é melhor que $ ("<div> </div>") e é um valor muito bom para esse dinheiro.
Sou um novo usuário do jQuery, alternando do DOMAssistant, que possui uma função semelhante: http://www.domassistant.com/documentation/DOMAssistantContent-module.php
Meu plugin é mais simples, acho que attrs e o conteúdo é melhor adicionar por meio de métodos de encadeamento:
Além disso, é um bom exemplo para um simples plugin do jQuery (o 100º).
fonte
É tudo bem direto! Heres alguns exemplos rápidos ...
fonte
Como não foi mencionado nas respostas anteriores, estou adicionando um exemplo prático de como criar elementos com o jQuery mais recente, também com atributos adicionais como conteúdo, classe ou retorno de chamada onclick:
fonte
jQuery pronto para uso não tem o equivalente a um createElement. De fato, a maioria do trabalho do jQuery é feita internamente usando innerHTML em vez de pura manipulação de DOM. Como Adam mencionou acima, é assim que você pode obter resultados semelhantes.
Também existem plugins disponíveis que fazem uso do DOM sobre innerHTML, como appendDOM , DOMEC e FlyDOM , entre outros . Em termos de desempenho, o jquery nativo ainda é o de melhor desempenho (principalmente porque usa o innerHTML)
fonte