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?
— Патриция

Ответы:


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 (), но возвращающая все содержимое соответствующего компонента?


6
Это работает в Firefox, и это лучше, чем принятое решение на данный момент.
— Лукита

это элегантный способ сделать это, лучше, чем принятый ответ, который был просто грязным хаком
— minhajul

Это потрясающе.
— Гаурав Аггарвал

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

73

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

$('#container').prop('outerHTML');

7
Мне кажется, это лучшее решение, не требующее манипуляций с dom или манипуляций с псевдодомами (методы wrap). И у объекта jquery уже есть свойство.
— Ниеминен,

1
люблю это решение
— Самера Кумарасингха

69
var x = $('#container')[0].outerHTML;

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);

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


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);

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') );

финиш


OP запрашивает необработанный HTML, представленный объектом jQuery, где этот метод перемещает объект jQuery из одного места в другое.
— Саймон Робб
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.