Eu sou um pouco de ambos os lados, na verdade:
- Quando o que eu preciso no lado javascript é de dados , eu uso JSON
- Quando o que eu preciso no lado do javascript é uma apresentação na qual não farei nenhum cálculo, geralmente uso HTML
A principal vantagem do uso de HTML é quando você deseja substituir uma parte completa da sua página pelo que retorna da solicitação do Ajax:
- Reconstruir uma parte da página em JS é (bastante) difícil
- Você provavelmente já possui algum mecanismo de modelagem no lado do servidor, usado para gerar a página em primeiro lugar ... Por que não reutilizá-la?
Geralmente, não levo em consideração o lado "desempenho", pelo menos no servidor:
- No servidor, gerar uma parte de HTML ou algum JSON provavelmente não fará muita diferença
- Sobre o tamanho das coisas que passam pela rede: bem, você provavelmente não usa centenas de KB de dados / html ... Usar o gzip no que estiver transferindo é o que fará a maior diferença (não escolher entre HTML e JSON)
- Uma coisa que pode ser levada em consideração, porém, são os recursos necessários no cliente para recriar o HTML (ou a estrutura DOM) dos dados JSON ... compare isso com a inserção de uma parte do HTML na página; -)
Finalmente, uma coisa que definitivamente importa:
- Quanto tempo você levará para desenvolver um novo sistema que enviará dados como código JSON + que o JS exigiu para injetar como HTML na página?
- Quanto tempo levará apenas para retornar HTML? E por quanto tempo você pode reutilizar parte do seu código do servidor já existente?
E para responder a outra resposta: se você precisar atualizar mais de uma parte da página, ainda existe a solução / hack de enviar todas essas partes dentro de uma grande cadeia que agrupa várias porções HTML e extrai as partes relevantes em JS.
Por exemplo, você pode retornar uma string que se parece com isso:
<!-- MARKER_BEGIN_PART1 -->
here goes the html
code for part 1
<!-- MARKER_END_PART1 -->
<!-- MARKER_BEGIN_PART2 -->
here goes the html
code for part 2
<!-- MARKER_END_PART2 -->
<!-- MARKER_BEGIN_PART3 -->
here goes the json data
that will be used to build part 3
from the JS code
<!-- MARKER_END_PART3 -->
Isso não parece muito bom, mas é definitivamente útil (eu já o usei algumas vezes, principalmente quando os dados HTML eram grandes demais para serem encapsulados no JSON) : você está enviando HTML para as partes da página que precisa de apresentação e você está enviando JSON para a situação em que precisa de dados ...
... E para extraí-los, o método de substring JS fará o truque, suponho ;-)