815 votes

Obtenir le HTML externe de l'élément sélectionné

J'essaie d'obtenir le code HTML d'un objet sélectionné avec jQuery. Je suis conscient de la .html() Le problème est que j'ai besoin du HTML incluant l'objet sélectionné (une ligne de tableau dans ce cas, où .html() ne renvoie que les cellules à l'intérieur de la ligne).

J'ai cherché et trouvé quelques méthodes de type "hackish" pour cloner un objet, l'ajouter à un div nouvellement créé, etc, etc, mais cela semble vraiment sale. Existe-t-il une meilleure méthode, ou la nouvelle version de jQuery (1.4.2) offre-t-elle un moyen plus efficace de cloner un objet ? outerHtml la fonctionnalité ?

91 votes

Il est scandaleux que jQuery n'ait pas les moyens de faire une telle chose. J'en ai aussi besoin.

9 votes

J'ai posté une demande de fonctionnalité, avec une référence à ce fil de discussion, et la réponse initiale a été positive. bugs.jquery.com/ticket/8142

0 votes

Oh wow. Donc quelque chose que j'ai remarqué et qui n'était pas dans jQuery, pourrait en fait se retrouver dans un futur jQuery par ce post StackOverflow. Je l'espère. Ce serait cool, et la fonction .outerHTML (ou quelque chose comme ça) est tout simplement pratique.

700voto

Eric Hu Points 7388

Je crois qu'actuellement (5/1/2012), tous les principaux navigateurs prennent en charge la fonction outerHTML. Il me semble que cet extrait est suffisant. Personnellement, je choisirais de le mémoriser :

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

EDITAR : Statistiques de base du support pour element.outerHTML

14 votes

@SalmanPK FireFox n'a pas supporté cette propriété jusqu'au 2011-11-11. bugzilla.mozilla.org/show_bug.cgi?id=92264 Il y a encore beaucoup d'utilisateurs bloqués sur la version 3.6. Je pense que c'est en fait un parfait exemple de la raison pour laquelle on choisirait d'utiliser jQuery plutôt que la fonctionnalité native.

8 votes

@LuciferSam Firefox 3.6 a ~6% de part de marché mondiale selon gs.statcounter.com Cependant, filtrer les résultats au cours des 6 derniers mois (décembre 11-mai 12) et les États-Unis l'écartent de leur liste des 12 premiers pays (moins de 3 %). J'ai choisi cette fenêtre car cet article suggère que l'utilisation de FF 3.6 a chuté de manière significative après janvier 2012. Compte tenu de ces données, je maintiens ma solution pour un code plus simple plutôt que la rétrocompatibilité.

4 votes

Je ne pourrais pas être plus d'accord. C'est la bonne réponse ici, pas les autres trucs que les gens suggèrent. L'élément sur lequel je sélectionne a des attributs que je veux conserver et qui sont perdus par les autres réponses. Bon sang, cela fonctionne même dans IE !

346voto

Volomike Points 7083

Il n'est pas nécessaire de générer une fonction pour cela. Faites-le simplement comme ceci :

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

(La console de votre navigateur montrera ce qui est enregistré, d'ailleurs. La plupart des derniers navigateurs depuis environ 2009 ont cette fonctionnalité).

La magie, c'est ça, au bout :

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

Le clone signifie que vous ne perturbez pas réellement le DOM. Exécutez-le sans lui et vous verrez p insérées avant/après tous les hyperliens (dans cet exemple), ce qui n'est pas souhaitable. Donc, oui, utilisez .clone() .

La façon dont il fonctionne est qu'il prend chaque a en fait un clone dans la RAM, l'enveloppe avec p obtient le parent de celle-ci (c'est-à-dire la balise p ), puis obtient la balise innerHTML propriété de celui-ci.

EDITAR : J'ai suivi le conseil et j'ai changé div balises pour p parce qu'il y a moins de frappe et que cela fonctionne de la même manière.

82 votes

Je me demande pourquoi l'équipe de jQuery n'ajoute pas une méthode outerHtml() ?

0 votes

Et si l'élément n'est pas <div> ?

1 votes

@Derek, cela n'a pas d'importance. J'utilise le DIV comme un emballage afin d'obtenir quelque chose à l'intérieur.

191voto

David V. Points 3065

2014 Edit : La question et cette réponse datent de 2010. À l'époque, aucune meilleure solution n'était largement disponible. Maintenant, beaucoup d'autres réponses sont meilleures : celle d'Eric Hu, ou celle de Re Capcha par exemple.

Ce site semble avoir une solution pour vous : jQuery : outerHTML | Yelotofu

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

4 votes

Je l'ai vu, mais j'essayais de l'éviter parce que ça semblait trop bricolé et qu'il aurait dû y avoir un meilleur moyen, mais ça fonctionne bien. Merci.

362 votes

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

25 votes

@drogon : Sachez que outerHTML n'est prise en charge dans Firefox que depuis la version 11 (mars 2012).

156voto

Re Captcha Points 1439

Qu'en est-il : prop('outerHTML') ?

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

Et à mettre en place :

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

Ça a marché pour moi.

PS : Ceci est ajouté dans jQuery 1.6 .

4 votes

Code très soigné et petit par rapport aux autres réponses. Q : Est-ce qu'il y a les mêmes restrictions outerHTML que dans les autres réponses ? Est-ce que cela fonctionne dans FF < 11 ?

3 votes

Cela fonctionne bien, c'est peut-être la meilleure solution ici. En ce qui concerne les navigateurs, cela devrait être aussi compatible que outerHTLM. La méthode prop() ne fait que récupérer la propriété outerHTML.

2 votes

Cette solution est meilleure, mais Jquery 1.6.1 a été publié en 2011. La question (et ma réponse) datent de 2010.

91voto

jessica Points 1338

Étendre jQuery :

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

Et utilise-le comme ça : $("#myTableRow").outerHTML();

8 votes

Petit problème avec cette solution : vous devez cloner() avant de wrap(), sinon vous laissez le <div>d'emballage supplémentaire dans le document.

1 votes

Merci, mindplay.dk -- J'ai modifié le code pour incorporer votre suggestion bonne prise :)

2 votes

Et si on inversait ça pour que ce soit : return $('<div>').append(this.clone()).html(); C'est juste un peu plus direct.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X