Podemos dizer que também temos document.write para alguns casos de uso.
O innerHTML foi padronizado no HTML5 e, com ele, um método irmão insertAdjacentHTML, que funciona como innerHTML, mas permite definir mais especificamente onde queremos inserir o conteúdo HTML: beforeBegin, afterBegin, beforeEnd e afterEnd.
varul=document.getElementById("list");ul.insertAdjacentHTML("beforeEnd","<li>A new li on the list.</li>");
Até agora, o principal problema com insertAdjacentHTML era a falta de suporte do navegador. Com a implementação do insertAdjacentHTML no Firefox a partir da versão 8, ele estará disponível em todos os principais navegadores, incluindo os dispositivos móveis. Se você quiser usá-lo agora e garantir que ele funcione em versões do Firefox anteriores à 8, use este polyfill.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Não contém as informações de que eu preciso","missingTheInformationINeed","thumb-down"],["Muito complicado / etapas demais","tooComplicatedTooManySteps","thumb-down"],["Desatualizado","outOfDate","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Problema com as amostras / o código","samplesCodeIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2011-08-27 UTC."],[],[]]