jQuery pobiera html kontenera, w tym sam kontener

156

Jak uzyskać kod HTML na „#container”, w tym „#container”, a nie tylko to, co jest w środku.

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

Mam to, które pobiera kod HTML wewnątrz #container. nie zawiera samego elementu #container. To jest to, czego szukam

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

Sprawdź http://jsfiddle.net/rzfPP/58/

Mały palec u ręki
źródło
można umieścić kontener w innym kontenerze i pobrać ten kontener w formacie html ... ale to wydaje się trochę hakerskie. może gdybyśmy wiedzieli trochę więcej o problemie, moglibyśmy znaleźć praktyczne rozwiązanie? co robisz z obszarem tekstowym pełnym html?
Patricia
możliwy duplikat zewnętrznego kodu HTML Pobierz wybrany element
Ian Mackinnon

Odpowiedzi:

160

Jeśli opakujesz kontener w fikcyjny Ptag, otrzymasz również kod HTML kontenera.

Wszystko, co musisz zrobić, to

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

Sprawdź działający przykład pod adresem http://jsfiddle.net/rzfPP/68/

Po unwrap()zakończeniu do <p>tagu możesz dodać

$('#container').unwrap();
Hussein
źródło
19
@ mc10 możemy po prostu użyć clone () i nie będziesz musiał martwić się o dodatkowe utworzone elementy. var x = $('#container').clone().wrap('<p/>').parent().html();. Pomysł na wrap jest świetny i mniej skomplikowany niż większość proponowanych rozwiązań.
Pinkie,
Problem z Firefoksem jest nieaktualny, więc sugeruję zagłosowanie na odpowiedź @MikeM, ponieważ jest w czystym JS.
Rob
6
Dlaczego <p>tag? Czy nie miałoby to <div>większego sensu?
Martin Burch,
6
Ma to znacznie prostsze rozwiązanie. Zobacz moją odpowiedź.
1,44 MB
132
var x = $('#container').get(0).outerHTML;

AKTUALIZACJA : to jest teraz obsługiwane przez Firefoksa od wersji FireFox 11 (marzec 2012)

Jak zauważyli inni, to nie zadziała w FireFox. Jeśli potrzebujesz go do działania w FireFox, możesz rzucić okiem na odpowiedź na to pytanie: Czy w jQuery jest jakaś funkcja podobna do html () lub text (), ale zwraca całą zawartość dopasowanego komponentu?

ShaneBlake
źródło
6
Działa to w przeglądarce Firefox i jest lepsze niż obecnie akceptowane rozwiązanie.
luqita,
to elegancki sposób na zrobienie tego, lepszy niż zaakceptowana odpowiedź, która była po prostu brudnym
hackiem
To jest doskonałe.
Gaurav Aggarwal
to doskonała odpowiedź, ponieważ umieszczenie w tagu nadrzędnym elementu div lub p jest złym pomysłem. może twój css się zepsuje. szczególnie gdy używasz bootstrap (np. form-row). stąd ta odpowiedź jest całkiem dobra.
Sudhir K Gupta
73

Lubię tego używać;

$('#container').prop('outerHTML');
1,44mb
źródło
7
Wydaje mi się, że jest to najlepsze rozwiązanie, nie wymaga manipulacji domem lub pseudo domem (metody zawijania). Obiekt jquery ma już tę właściwość.
Nieminen
1
uwielbiam to rozwiązanie
Sameera Kumarasingha,
69
var x = $('#container')[0].outerHTML;
MikeM
źródło
1
Problem z Firefoksem jest nieaktualny, więc proponuję zagłosować pod tą odpowiedzią.
Rob
1
Używanie .clone () działa, ale jest to znacznie czystsze, imo. Zaakceptowana odpowiedź tworzy nowe elementy w DOM = zły.
pete
13
$('#container').clone().wrapAll("<div/>").parent().html();

Aktualizacja: externalHTML działa teraz w przeglądarce Firefox, więc użyj innej odpowiedzi, chyba że potrzebujesz obsługi bardzo starych wersji Firefoksa

Robert Noack
źródło
Zewnętrzna właściwośćHTML nie działa w Firefoksie, więc musisz to zrobić z klonem
Robert Noack
2

Oldie but goldie ...

Ponieważ użytkownik pyta o jQuery, zamierzam to uprościć:

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

Tutaj skrzypce.

prinsen
źródło
2
Nie pomaga to w pobieraniu kodu HTML samego kontenera. Nie zwraca nawet kodu html. Widzę, że dostęp do węzła docelowego przez klon może być praktyczny, aby uniknąć modyfikowania domeny, ale wtedy dobrze byłoby wspomnieć, dlaczego używasz tej metody.
AeonOfTime,
0

Firefox nie obsługuje zewnętrznego HTML , więc musisz zdefiniować funkcję, aby ją obsługiwać:

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

Następnie możesz użyć externalHTML:

var x = outerHTML($('#container').get(0));
$('#save').val(x);
kevinji
źródło
0
var x = $($('div').html($('#container').clone())).html();
kei
źródło
6
Tworzysz 3 obiekty jquery w jednej instrukcji. Chociaż to działa, to przesada.
Pinkie
-2

Proste rozwiązanie z przykładem:

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

Przenieś ten DIV do innego DIV z id = "other_div_id"

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

koniec

hassane86
źródło
OP żąda surowego kodu HTML reprezentowanego przez obiekt jQuery, gdzie ta metoda przenosi obiekt jQuery z jednego miejsca do drugiego.
Simon Robb