JQuery получить HTML-контейнер, включая сам контейнер

156

Как мне получить html на «#container», включая «#container», а не только то, что внутри него.

<div id="container">
 <div id="one">test 1 </div>
 <div id="two">test 2 </div>
 <div id="three">test 3 </div>
 <div id="four">test 4 </div>
</div>

У меня есть это, которое получает HTML внутри #container. он не включает сам элемент #container. Вот что я хочу сделать

var x = $('#container').html();
$('#save').val(x);

Проверьте http://jsfiddle.net/rzfPP/58/

пинка
источник
Вы можете поместить контейнер в другой контейнер и получить HTML-контейнеры ... но это выглядит немного странно. возможно, если бы мы знали немного больше о проблеме, мы могли бы найти работоспособное решение? что вы делаете с текстовой областью, полной HTML?
Патриция
возможный дубликат получения внешнего HTML-элемента выбранного элемента
Ian Mackinnon

Ответы:

160

Если вы поместите контейнер в фиктивный Pтег, вы также получите контейнер HTML.

Все, что вам нужно сделать, это

var x = $('#container').wrap('<p/>').parent().html();

Проверьте рабочий пример на http://jsfiddle.net/rzfPP/68/

Чтобы unwrap()в <p>теге , когда сделано, вы можете добавить

$('#container').unwrap();
Хусейн
источник
19
@ mc10 мы можем просто использовать clone (), и вам не придется беспокоиться о дополнительных элементах. var x = $('#container').clone().wrap('<p/>').parent().html();, Идея обертки великолепна и менее сложна, чем большинство предлагаемых решений.
Пинки
Проблема Firefox устарела, поэтому я предлагаю проголосовать за @MikeM, потому что она написана на чистом JS.
Роб
6
Почему <p>тег? Не будет ли <div>больше смысла?
Мартин Бёрч,
6
Это имеет гораздо более простое решение. Смотри мой ответ.
1.44mb
132
var x = $('#container').get(0).outerHTML;

ОБНОВЛЕНИЕ : теперь это поддерживается Firefox начиная с FireFox 11 (март 2012)

Как уже отмечали другие, это не будет работать в FireFox. Если вам нужно, чтобы он работал в FireFox, то вы можете взглянуть на ответ на этот вопрос: есть ли в jQuery какая-либо функция, похожая на html () или text (), но возвращающая все содержимое соответствующего компонента?

ShaneBlake
источник
6
Это работает в Firefox, и это лучше, чем принятое решение на данный момент.
Лукита
это элегантный способ сделать это, лучше, чем принятый ответ, который был просто грязным хаком
minhajul
Это потрясающе.
Гаурав Аггарвал
это идеальный ответ, потому что перенос родительского тега с помощью div или p - плохая идея. может быть, ваш CSS сломается. особенно когда вы используете загрузчик (например, form-row). следовательно, этот ответ довольно хорош.
Судхир К Гупта
73

Мне нравится использовать это;

$('#container').prop('outerHTML');
1.44
источник
7
Мне кажется, это лучшее решение, не требующее манипуляций с dom или манипуляций с псевдодомами (методы wrap). И у объекта jquery уже есть свойство.
Ниеминен,
1
люблю это решение
Самера Кумарасингха
69
var x = $('#container')[0].outerHTML;
MikeM
источник
1
Проблема Firefox устарела, поэтому я предлагаю проголосовать за этот ответ.
Роб
1
Использование .clone () работает, но это намного чище, IMO. Принятый ответ создает новые элементы в DOM = bad.
Пит
13
$('#container').clone().wrapAll("<div/>").parent().html();

Обновление: outerHTML теперь работает в Firefox, поэтому используйте другой ответ, если вам не требуется поддержка очень старых версий Firefox.

Роберт Ноак
источник
Свойство outerHTML не работает в Firefox, поэтому вам нужно сделать это с клоном
Роберт Ноак,
2

Олди но голди ...

Так как пользователь запрашивает JQuery, я буду упрощать это:

var html = $('#container').clone();
console.log(html);

Скрипка здесь

Prinsen
источник
2
Это не помогает в получении html самого контейнера. Он даже не возвращает HTML-код. Я вижу, что может быть практичным получить доступ к целевому узлу через клон, чтобы избежать модификации dom, но тогда было бы хорошо упомянуть, почему вы используете этот метод.
AeonOfTime
0

Firefox не поддерживает externalHTML , поэтому вам нужно определить функцию, которая поможет его поддерживать:

function outerHTML(node) {
    return node.outerHTML || (
        function(n) {
            var div = document.createElement('div');
            div.appendChild( n.cloneNode(true) );
            var h = div.innerHTML;
            div = null;
            return h;
        }
    )(node);
}

Затем вы можете использовать externalHTML:

var x = outerHTML($('#container').get(0));
$('#save').val(x);
kevinji
источник
0
var x = $($('div').html($('#container').clone())).html();
кей
источник
6
Вы создаете 3 объекта jquery в одном выражении. Хотя это работает, это излишество.
Пинки
-2

Простое решение с примером:

<div id="id_div">
  <p>content<p>
</div>

Переместите этот DIV в другой DIV с id = "other_div_id"

$('#other_div_id').prepend( $('#id_div') );

финиш

hassane86
источник
OP запрашивает необработанный HTML, представленный объектом jQuery, где этот метод перемещает объект jQuery из одного места в другое.
Саймон Робб