2011-07-24 3 views
4

Я пытаюсь получить согласованный, перекрестный браузер outerHtml для элемента jQuery, в частности $("html").outerHtml(). Например, если исходная страница это:Есть ли способ получить лучший способ получить внешнийHtml?

<html><script src="blah.js"></script><div class="foo" id='bar'></p></div></html> 

Я хочу, чтобы иметь возможность использовать $("html").outerHtml();, чтобы получить HTML строку в том числе и сам элемент, который был бы:

<html><script src="blah.js"></script><div class="foo" id="bar"><p></p></div></html> 

Я использую Brandon Аарон outerHtml plugin который выглядит примерно так:

return $('<div>').append($("html").first().clone()).html(); 

Однако это, кажется, на самом деле пытается перезагрузить любые внешние ссылки файлов в документе (сценарии, stylesheets), который кажется довольно чрезмерным только для того, чтобы получить HTML-код элемента оболочки. Может ли Javascript помещать HTML-элемент внутри элемента DIV?

Локально, я получаю эту ошибку. Что-то связанное с правилами AJAX?

XMLHttpRequest не может загрузить файл: /// C: /demo.js? _ = 1311466511031. Происхождение null не разрешено Access-Control-Allow-Origin.

Есть ли лучший способ получить внешнийHtml? Я бы очень хотел избежать сетевых вызовов при этом.

+0

Вы уверены, что не хотите * внутреннего * HTML-кода 'body'? Какова ваша целевая цель с этими данными? –

+0

Да, очень точно. Я проверяю HTML или HTML-фрагменты. Да, я знаю, что это не то же самое, что и источник HTML. – peterjwest

+0

Вы всегда можете сделать отдельный HTTP-запрос для размещения документа при поиске синтаксического анализа HTML в целом. Однако это не решает проблему для фрагментов. –

ответ

4

написал свое собственное решение, которое просто визуализирует оберточную элемент:

(function($){ 
    $.fn.outerHtml = function() { 
    if (this.length == 0) return false; 
    var elem = this[0], name = elem.tagName.toLowerCase(); 
    if (elem.outerHTML) return elem.outerHTML; 
    var attrs = $.map(elem.attributes, function(i) { return i.name+'="'+i.value+'"'; }); 
    return "<"+name+(attrs.length > 0 ? " "+attrs.join(" ") : "")+">"+elem.innerHTML+"</"+name+">"; 
    }; 
})(jQuery); 

https://gist.github.com/1102076

+1

Ваше решение забывает обнаружить функцию для 'el.outerHTML'. Конечно, это нестандартно, но, по крайней мере, это быстрее. – Raynos

+0

О, спасибо, поэтому мне просто нужно добавить: 'if (elem.outerHTML) return elem.outerHTML;'? – peterjwest

+0

и тщательное тестирование того, что ваша прокладка возвращает HTML в том же формате, что и 'externalHTML'. то есть внешнийHTML может возвращать теги в верхнем регистре и т. д. – Raynos

2

JQuery outerHTML плагин из https://github.com/darlesson/jquery-outerhtml использует родной outerHTML браузера когда существует, как второй вариант клона узлов во временном документе фрагмент и вернуть его innerHTML или использует jQuery-клон-решение, подобное плагину Брэндона Аарона.

Этот плагин может помочь вам избежать загрузки ссылочных файлов. В моих тестах в Chrome, Firefox и Internet Explorer проблема не возникала при вызове кода ниже на странице с внешними файлами JavaScript.

var outerHTML = $(document.documentElement).outerHTML(); 
+0

Это выглядит многообещающим, спасибо, я попробую! – peterjwest

Смежные вопросы