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.