815 Stimmen

Holt das äußere HTML des ausgewählten Elements

Ich versuche, die HTML eines ausgewählten Objekts mit jQuery zu erhalten. Ich bin mir bewusst, dass die .html() Funktion; das Problem ist, dass ich das HTML einschließlich des ausgewählten Objekts benötige (in diesem Fall eine Tabellenzeile, in der .html() gibt nur die Zellen innerhalb der Zeile zurück).

Ich habe herum gesucht und fand ein paar sehr "hackish" Art Methoden der Klonen eines Objekts, fügen Sie es zu einem neu erstellten div, etc, etc, aber dies scheint wirklich schmutzig. Gibt es einen besseren Weg, oder bietet die neue Version von jQuery (1.4.2) irgendeine Art von outerHtml Funktionalität?

91 Stimmen

Es ist ungeheuerlich, dass jQuery nicht über Mittel verfügt, um so etwas zu tun. Ich brauche das auch.

9 Stimmen

Ich habe eine Funktionsanfrage mit einem Verweis auf diesen Thread gestellt, und die erste Reaktion war positiv. bugs.jquery.com/ticket/8142

0 Stimmen

Oh, wow. Also etwas, das ich bemerkt, dass nicht in jQuery war, könnte tatsächlich machen es in eine zukünftige jQuery von diesem StackOverflow Post. Ich hoffe es. Das wäre cool, und die .outerHTML (oder so ähnlich) Funktion ist einfach nur praktisch.

700voto

Eric Hu Punkte 17730

Ich glaube, dass derzeit (5/1/2012) alle wichtigen Browser die Funktion outerHTML unterstützen. Mir scheint, dass dieser Ausschnitt ausreichend ist. Ich persönlich würde mich dafür entscheiden, dies auswendig zu lernen:

// Gives you the DOM element without the outside wrapper you want
$('.classSelector').html()

// Gives you the outside wrapper as well only for the first element
$('.classSelector')[0].outerHTML

// Gives you the outer HTML for all the selected elements
var html = '';
$('.classSelector').each(function () {
    html += this.outerHTML;
});

//Or if you need a one liner for the previous code
$('.classSelector').get().map(function(v){return v.outerHTML}).join('');

EDIT : Grundlegende Statistiken über die Unterstützung für element.outerHTML

14 Stimmen

@SalmanPK FireFox unterstützte diese Eigenschaft bis 2011-11-11 nicht. bugzilla.mozilla.org/show_bug.cgi?id=92264 Es gibt immer noch eine Menge Benutzer, die auf 3.6. Ich denke, dies ist eigentlich ein perfektes Beispiel dafür, warum man jQuery über native Funktionalität verwenden würde.

8 Stimmen

@LuciferSam Firefox 3.6 hat laut gs.statcounter.com jedoch ~6% weltweiten Marktanteil, Filtern der Ergebnisse auf die letzten 6 Monate (Dez '11-Mai '12) und in die USA verdrängt sie von ihrer Top-12-Liste (unter 3 %). Ich habe dieses Fenster gewählt, da dieser Artikel legt nahe, dass die Nutzung von FF 3.6 nach Januar 2012 deutlich zurückgegangen ist. Angesichts dieser Daten bleibe ich bei meiner Lösung für einfacheren Code über Abwärtskompatibilität.

4 Stimmen

Ich könnte nicht mehr zustimmen. Das ist hier die richtige Antwort, nicht das, was die Leute vorschlagen. Das Element, das ich auswähle, hat Attribute, die ich behalten möchte und die bei den anderen Antworten verloren gehen. Verdammt, das funktioniert sogar im IE!

346voto

Volomike Punkte 22333

Es ist nicht nötig, eine Funktion dafür zu erstellen. Machen Sie es einfach so:

$('a').each(function(){
    var s = $(this).clone().wrap('<p>').parent().html();
    console.log(s);
});

(In der Konsole Ihres Browsers wird übrigens angezeigt, was protokolliert wird. Die meisten aktuellen Browser seit etwa 2009 haben diese Funktion).

Das ist der Zauber am Ende:

.clone().wrap('<p>').parent().html();

Der Klon bedeutet, dass Sie das DOM nicht wirklich stören. Führen Sie es ohne ihn aus und Sie werden sehen p Tags vor/nach allen Hyperlinks (in diesem Beispiel) eingefügt, was unerwünscht ist. Also, ja, verwenden Sie .clone() .

Die Funktionsweise besteht darin, dass sie jede a Tag, erstellt einen Klon davon im RAM, umhüllt ihn mit p Tags, erhält das übergeordnete Element (d. h. die p Tag), und erhält dann die innerHTML Eigenschaft von ihr.

EDIT : Rat befolgt und gewechselt div Tags zu p Tags, weil es weniger Tipparbeit bedeutet und genauso funktioniert.

82 Stimmen

Ich frage mich, warum das jQuery-Team nicht eine outerHtml()-Methode hinzufügen?

0 Stimmen

Was ist, wenn das Element nicht <div> ?

1 Stimmen

@Derek, das wäre nicht schlimm. Ich bin mit DIV als Wrapper, um etwas in ihm zu bekommen.

191voto

David V. Punkte 5615

2014 Edit : Die Frage und diese Antwort sind von 2010. Damals war keine bessere Lösung weithin verfügbar. Heute sind viele der anderen Antworten besser: die von Eric Hu oder die von Re Capcha zum Beispiel.

Diese Website scheint eine Lösung für Sie zu haben: jQuery: outerHTML | Yelotofu

jQuery.fn.outerHTML = function(s) {
    return s
        ? this.before(s).remove()
        : jQuery("<p>").append(this.eq(0).clone()).html();
};

4 Stimmen

Ich habe das gesehen, wollte es aber vermeiden, weil es mir zu hakelig vorkam und es eine bessere Lösung hätte geben müssen, aber es funktioniert gut. Danke.

362 Stimmen

$('[Selektor]')[0].outerHTML

25 Stimmen

@drogon: Sei dir bewusst, dass outerHTML wird in Firefox erst seit Version 11 (März 2012) unterstützt.

156voto

Re Captcha Punkte 3120

Worüber? prop('outerHTML') ?

var outerHTML_text = $('#item-to-be-selected').prop('outerHTML');

Und zum Einstellen:

$('#item-to-be-selected').prop('outerHTML', outerHTML_text);

Bei mir hat es funktioniert.

PS : Dies wird hinzugefügt in jQuery 1.6 .

4 Stimmen

Sehr sauberer und kleiner Code im Vergleich zu den anderen Antworten. F: Hat dies die gleichen outerHTML Einschränkungen wie in anderen Antworten erwähnt? Funktioniert es in FF < 11?

3 Stimmen

Funktioniert gut, das könnte die beste Lösung sein. Was die Browser angeht, sollte dies so kompatibel sein wie outerHTLM. Die prop()-Methode ist im Grunde nur immer die outerHTML Eigenschaft.

2 Stimmen

Diese Lösung ist besser, allerdings wurde Jquery 1.6.1 im Jahr 2011 veröffentlicht. Die Frage (und meine Antwort) sind von 2010.

91voto

jessica Punkte 2954

Erweitern Sie jQuery:

(function($) {
  $.fn.outerHTML = function() {
    return $(this).clone().wrap('<div></div>').parent().html();
  };
})(jQuery);

Und verwenden Sie es so: $("#myTableRow").outerHTML();

8 Stimmen

Kleines Problem bei dieser Lösung: Sie müssen clone() vor wrap() einsetzen, sonst bleibt das zusätzliche umschließende <div> im Dokument.

1 Stimmen

Danke, mindplay.dk - ich habe den Code bearbeitet, um deine Anregung zu berücksichtigen :)

2 Stimmen

Wie wäre es, wenn Sie das umkehren würden? return $('<div>').append(this.clone()).html(); Es ist nur ein bisschen mehr auf den Punkt gebracht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X