Я сделал этот простой тест с externalHTML, представляющим собой решение токимона (без клона), и outerHTML2, представляющим собой решение jessica (клон)
console.time("outerHTML");
for(i=0;i<1000;i++)
{
var html = $("<span style='padding:50px; margin:50px; display:block'><input type='text' title='test' /></span>").outerHTML();
}
console.timeEnd("outerHTML");
console.time("outerHTML2");
for(i=0;i<1000;i++)
{
var html = $("<span style='padding:50px; margin:50px; display:block'><input type='text' title='test' /></span>").outerHTML2();
}
console.timeEnd("outerHTML2");
и в моем браузере Chromium (версия 20.0.1132.57 (0)) был
externalHTML: 81мс
externalHTML2: 439 мс
но если мы используем решение Tokimon без встроенной функции externalHTML (которая теперь поддерживается, вероятно, почти во всех браузерах)
получаем
externalHTML: 594ms
externalHTML2: 332 мс
и в примерах реального мира будет больше циклов и элементов, поэтому идеальная комбинация будет
$.fn.outerHTML = function()
{
$t = $(this);
if( "outerHTML" in $t[0] ) return $t[0].outerHTML;
else return $t.clone().wrap('<p>').parent().html();
}
так что метод клонирования на самом деле быстрее, чем метод wrap / unwrap
(запрос 1.7.2)