Forum.html()vs. append ()

Digamos que tenho um mergulhador vazio.
<div id='myDiv'></div>

é isto:

$('#myDiv').html("<div id='mySecondDiv'></div>");

o mesmo que:

var mySecondDiv=$("<div id='mySecondDiv'></div>");
$('#myDiv').append(mySecondDiv);
 225
Author: Argiropoulos Stavros, 2010-06-10

6 answers

Sempre que passa uma cadeia de HTML a qualquer um dos métodos do jQuery, isto é o que acontece:

Um elemento temporário é criado, vamos chamá-lo x. x innerHTML é definido para a cadeia de HTML que você passou. Em seguida, jQuery irá transferir cada um dos nós produzidos (ou seja, x's childNodes) para um fragmento de documento recém-criado, que então irá cache para a próxima vez. Ele então devolverá o fragmento childNodes como uma nova coleção DOM.

Note que na verdade é muito mais complicado do que isso, como jQuery faz um monte de verificações cross-browser e várias outras otimizações. Por exemplo, se passar apenas <div></div> a jQuery(), o jQuery irá por um atalho e simplesmente fará document.createElement('div').

EDIT : para ver a quantidade de verificações que o jQuery efectua, veja aqui, Aqui e aqui.


innerHTML é geralmente a aproximação mais rápida, embora não deixe que isso governe o que você faz o tempo todo. abordagem de jQuery não é tão simples quanto element.innerHTML = ... -- Como mencionei, há um monte de verificações e otimizações ocorrendo.


A técnica correcta depende muito da situação. Se você quiser criar um grande número de elementos idênticos, então a última coisa que você quer fazer é criar um loop massivo, criando um novo objeto jQuery em cada iteração. Por exemplo, a forma mais rápida de criar 100 divs com jQuery:
jQuery(Array(101).join('<div></div>'));

Existem também questões de legibilidade e manutenção para tomar em conta.

Isto:

$('<div id="' + someID + '" class="foobar">' + content + '</div>');

... é muito mais difícil de manter do que isto:

$('<div/>', {
    id: someID,
    className: 'foobar',
    html: content
});
 298
Author: James, 2012-06-21 02:26:40
Não são iguais. O primeiro substitui O HTML sem criar Primeiro outro objecto jQuery. O segundo cria uma embalagem adicional de jQuery para o segundo div, então adiciona para o primeiro.

um invólucro jQuery (por exemplo):

$("#myDiv").html('<div id="mySecondDiv"></div>');

$("#myDiv").append('<div id="mySecondDiv"></div>');

duas embalagens jquery (por exemplo):

var mySecondDiv=$('<div id="mySecondDiv"></div>');
$('#myDiv').html(mySecondDiv);

var mySecondDiv=$('<div id="mySecondDiv"></div>');
$('#myDiv').append(mySecondDiv);

Você tem alguns casos de Uso diferentes acontecendo. Se você quiser substituir o conteúdo, .html é uma grande chamada uma vez que é o equivalente a innerHTML = "...". No entanto, se você só quiser adicionar conteúdo, o conjunto de pacotes extra $() é desnecessário.

Utilize apenas duas embalagens se necessitar de manipular o div Adicionado mais tarde. Mesmo nesse caso, você ainda pode precisar usar apenas um:

var mySecondDiv = $("<div id='mySecondDiv'></div>").appendTo("#myDiv");
// other code here
mySecondDiv.hide();
 53
Author: Doug Neiner, 2010-06-10 14:51:53

Se por {[0] } queres dizer .append, Então o resultado é o mesmo se #myDiv está vazio.

O desempenho é o mesmo? não sei.

.html(x) acaba fazendo a mesma coisa que .empty().append(x)

 18
Author: mkoryak, 2014-06-23 13:01:52
Bem ...html () usa .innerHTML que é mais rápido do que a criação DOM.
 9
Author: Luca Matteis, 2010-06-10 14:42:36

Você pode obter o segundo método para atingir o mesmo efeito por:

var mySecondDiv = $('<div></div>');
$(mySecondDiv).find('div').attr('id', 'mySecondDiv');
$('#myDiv').append(mySecondDiv);

O Luca mencionou que html() apenas insere hte HTML o que resulta num desempenho mais rápido.

No entanto, em algumas ocasiões, você optaria pela segunda opção, considere:
// Clumsy string concat, error prone
$('#myDiv').html("<div style='width:'" + myWidth + "'px'>Lorem ipsum</div>");

// Isn't this a lot cleaner? (though longer)
var newDiv = $('<div></div>');
$(newDiv).find('div').css('width', myWidth);
$('#myDiv').append(newDiv);
 6
Author: kizzx2, 2010-06-11 01:28:07

Para além das respostas dadas, no caso de teres algo assim:

<div id="test">
    <input type="file" name="file0" onchange="changed()">
</div>
<script type="text/javascript">
    var isAllowed = true;
    function changed()
    {
        if (isAllowed)
        {
            var tmpHTML = $('#test').html();
            tmpHTML += "<input type=\"file\" name=\"file1\" onchange=\"changed()\">";
            $('#test').html(tmpHTML);
            isAllowed = false;
        }
    }
</script>

O que significa que você quer adicionar automaticamente mais um envio de Ficheiros se quaisquer ficheiros forem enviados, o código mencionado não irá funcionar, porque depois de o ficheiro ser carregado, o primeiro elemento de envio de Ficheiros será recriado e, como tal, o ficheiro carregado será apagado dele. Devias usar .adicionar () em vez disso:

    function changed()
    {
        if (isAllowed)
        {
            var tmpHTML = "<input type=\"file\" name=\"file1\" onchange=\"changed()\">";
            $('#test').append(tmpHTML);
            isAllowed = false;
        }
    }
 2
Author: Arianbakh, 2014-03-17 11:03:39