J'essaie d'obtenir le HTML d'un objet sélectionné avec jQuery. Je connais la .html()
fonction; le problème est que j'ai besoin du code 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 très «hackish» pour cloner un objet, l'ajouter à un div nouvellement créé, etc., etc., mais cela semble vraiment sale. Existe-t-il un meilleur moyen ou la nouvelle version de jQuery (1.4.2) offre-t-elle des outerHtml
fonctionnalités?
$('div')[0].outerHTML
.Réponses:
Édition 2014: 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: celles d'Eric Hu ou de Re Capcha par exemple.
Ce site semble avoir une solution pour vous: jQuery: externalHTML | Yelotofu
la source
outerHTML
n'est prise en charge par Firefox que depuis la version 11 (mars 2012).outerHTML
est un attribut propriétaire inventé par Microsoft, pas une norme W3C. (Fait amusant:innerHTML
est standardisé uniquement depuis HTML5 )el.outerHTML || document.createElement('div').appendChild( el.cloneNode( true ) ).parentNode.innerHTML
Je pense qu'actuellement (5/1/2012), tous les principaux navigateurs prennent en charge la fonction externeHTML. Il me semble que cet extrait est suffisant. Personnellement, je choisirais de mémoriser ceci:
EDIT : statistiques de support de base pour
element.outerHTML
la source
Pas besoin de générer une fonction pour cela. Faites comme ça:
(La console de votre navigateur affichera ce qui est connecté, soit dit en passant. La plupart des derniers navigateurs depuis environ 2009 ont cette fonctionnalité.)
La magie est la fin:
Le clone signifie que vous ne dérangez pas réellement le DOM. Exécutez-le sans et vous verrez des
p
balises insérées avant / après tous les hyperliens (dans cet exemple), ce qui n'est pas souhaitable. Alors, oui, utilisez.clone()
.La façon dont cela fonctionne est qu'il prend chaque
a
balise, en fait un clone dans la RAM, encapsule avec desp
balises, en obtient le parent (c'est-à-dire lap
balise), puis en obtient lainnerHTML
propriété.EDIT : a pris des conseils et a changé les
div
balises enp
balises parce que c'est moins de frappe et fonctionne de la même manière.la source
Et pour
prop('outerHTML')
:?Et pour régler:
Ça a marché pour moi.
PS : Ceci est ajouté dans jQuery 1.6 .
la source
Étendez jQuery:
Et utilisez-le comme ceci:
$("#myTableRow").outerHTML();
la source
return $('<div>').append(this.clone()).html();
c'est juste un peu plus pertinent.Je suis d'accord avec Arpan (13 décembre 10 5:59).
Sa façon de le faire est en fait une bien meilleure façon de le faire, car vous n'utilisez pas de clone. La méthode de clonage prend beaucoup de temps, si vous avez des éléments enfants, et personne d'autre ne semble se soucier qu'IE ait réellement
outerHTML
attribut (oui IE a en fait QUELQUES astuces utiles dans sa manche).Mais je créerais probablement son script un peu différent:
la source
clone()
ettextarea
, j'avais besoin d'une solution non clone, et c'était parfait.outerHTML
lorsque disponible, car il est pris en charge par Chrome en plus d'Internet Explorer.Pour être vraiment jQuery-esque, vous voudrez peut-
outerHTML()
être être un getter et un setter et avoir un comportement aussi similairehtml()
que possible:Cela nous permet de passer un argument à
outerHTML
, qui peut êtrefunction (index, oldOuterHTML) { }
- où la valeur de retour deviendra le nouveau code HTML de l'élément (sauf s'ilfalse
est renvoyé).Pour plus d'informations, consultez les documents jQuery pour
html()
.la source
Vous pouvez également utiliser get (récupérer les éléments DOM correspondant à l'objet jQuery.).
par exemple:
Comme méthode d'extension:
Ou
Choix multiple et retournez le html externe de tous les éléments correspondants.
revenir:
la source
Pour créer un plugin jQuery COMPLET en tant que
.outerHTML
, ajoutez le script suivant à n'importe quel fichier js et incluez-le après jQuery dans votre en-tête:Cela vous permettra non seulement d'obtenir le HTML externe d'un élément, mais également d'obtenir un retour de plusieurs éléments à la fois dans un tableau! et peut être utilisé dans les deux styles standard jQuery en tant que tels:
Pour plusieurs éléments
Exemples d'extraits:
Afficher l'extrait de code
la source
vous pouvez aussi le faire de cette façon
où id est l'id de l'élément que vous recherchez
la source
$("#" + id).attr("id")
est incroyablement redondant. Si vous avez déjà l'id dans une variable, pourquoi utilisez-vous un sélecteur jquery pour extraire l'élément du dom, puis interrogez-vous son attribut ID?J'ai utilisé la solution de Jessica (qui a été éditée par Josh) pour faire fonctionner externalHTML sur Firefox. Le problème est cependant que mon code cassait parce que sa solution enveloppait l'élément dans un DIV. L'ajout d'une ligne de code supplémentaire a résolu ce problème.
Le code suivant vous donne le externalHTML en laissant l'arborescence DOM inchangée.
Et utilisez-le comme ceci: $ ("# myDiv") .uterHTML ();
J'espère que quelqu'un le trouvera utile!
la source
Violon ici: http://jsfiddle.net/ezmilhouse/Mv76a/
la source
Si le scénario ajoute dynamiquement une nouvelle ligne, vous pouvez utiliser ceci:
.myrow
est le nom de classe du<tr>
. Il fait une copie de la dernière ligne et l'insère en tant que nouvelle dernière ligne. Cela fonctionne également dans IE7 , tandis que la[0].outerHTML
méthode ne permet pas les affectations dans ie7la source
node.cloneNode () ne ressemble guère à un hack. Vous pouvez cloner le nœud et l'ajouter à n'importe quel élément parent souhaité, et également le manipuler en manipulant des propriétés individuelles, plutôt que d'avoir à, par exemple, exécuter des expressions régulières dessus, ou l'ajouter au DOM, puis le manipuler par la suite.
Cela dit, vous pouvez également parcourir les attributs de l'élément pour en construire une représentation sous forme de chaîne HTML. Il semble probable que c'est ainsi que n'importe quelle fonction externalHTML serait implémentée si jQuery en ajoutait une.
la source
J'ai utilisé la solution de Volomike mise à jour par Jessica. Il suffit d'ajouter une vérification pour voir si l'élément existe et de le rendre vide au cas où il ne le ferait pas.
Bien sûr, utilisez-le comme:
la source
Vous pouvez trouver une bonne option .outerHTML () ici https://github.com/darlesson/jquery-outerhtml .
Contrairement à .html () qui ne renvoie que le contenu HTML de l'élément, cette version de .outerHTML () renvoie l'élément sélectionné et son contenu HTML ou le remplace par la méthode .replaceWith () mais avec la différence qui permet au HTML de remplacement d'être hérité par l'enchaînement.
Des exemples peuvent également être vus dans l'URL ci-dessus.
la source
Notez que la solution de Josh ne fonctionne que pour un seul élément.
On peut dire que le HTML "externe" n'a vraiment de sens que si vous avez un seul élément, mais il y a des situations où il est logique de prendre une liste d'éléments HTML et de les transformer en balisage.
Étendant la solution de Josh, celle-ci gérera plusieurs éléments:
Edit: un autre problème avec la solution de Josh a été corrigé, voir le commentaire ci-dessus.
la source
Une autre solution similaire avec ajout
remove()
de l'objet DOM temporaire.la source
J'ai fait ce test simple avec externalHTML étant une solution de tokimon (sans clone), et externalHTML2 étant une solution de jessica (clone)
et le résultat dans mon navigateur Chrome (Version 20.0.1132.57 (0)) était
externeHTML
: 81 ms externeHTML2: 439 ms
mais si nous utilisons la solution tokimon sans la fonction native externalHTML (qui est maintenant prise en charge dans presque tous les navigateurs)
on a
ExternalHTML
: 594ms ExternalHTML2: 332ms
et il y aura plus de boucles et d'éléments dans des exemples du monde réel, donc la combinaison parfaite serait
la méthode de clonage est donc plus rapide que la méthode wrap / unwrap
(jquery 1.7.2)
la source
Voici un plugin externalHTML très optimisé pour jquery: ( http://jsperf.com/outerhtml-vs-jquery-clone-hack/5 => les 2 autres extraits de code rapide ne sont pas compatibles avec certains navigateurs comme FF <11)
@Andy E => Je ne suis pas d'accord avec toi. uterHMTL n'a pas besoin d'un getter ET d'un setter: jQuery nous donne déjà 'replaceWith' ...
@mindplay => Pourquoi rejoignez-vous tous les externalHTML? jquery.html renvoie uniquement le contenu HTML du premier élément.
(Désolé, je n'ai pas assez de réputation pour écrire des commentaires)
la source
Court et doux.
ou un événement plus doux avec l'aide des fonctions fléchées
ou sans jQuery du tout
ou si vous n'aimez pas cette approche, vérifiez que
la source
C'est assez simple avec JavaScript vanille ...
la source
Ceci est idéal pour changer des éléments sur le dom mais ne fonctionne PAS pour, par exemple, lors du passage d'une chaîne html en jquery comme ceci:
Après quelques manipulations, j'ai créé une fonction qui permet à ce qui précède de fonctionner, par exemple pour les chaînes html:
la source
$.html = el => $("<div>"+el+"</div>").html().trim();
la source
Je suis tombé sur ce problème en cherchant une réponse à mon problème, à savoir que j'essayais de supprimer une ligne du tableau, puis de l'ajouter à nouveau au bas du tableau (car je créais dynamiquement des lignes de données mais je voulais afficher un `` Ajouter nouveau ''). Enregistrer la ligne de type en bas).
J'ai eu le même problème, car il renvoyait le innerHtml, donc il manquait les balises TR, qui contenaient l'ID de cette ligne et signifiait qu'il était impossible de répéter la procédure.
La réponse que j'ai trouvée est que la
remove()
fonction jquery retourne en fait l'élément, qu'il supprime, en tant qu'objet. Donc, pour supprimer et rajouter une ligne, c'était aussi simple que cela ...Si vous ne supprimez pas l'objet mais souhaitez le copier ailleurs, utilisez
clone()
plutôt la fonction.la source
Plugin jQuery comme raccourci pour obtenir directement l'élément HTML complet:
Et utilisez-le comme ceci:
$(".element").outerHTML();
la source
Où 'x' est le numéro de nœud, commençant par 0 comme premier, devrait obtenir le bon nœud que vous voulez, si vous essayez d'en obtenir un spécifique. Si vous avez des nœuds enfants, vous devriez vraiment mettre un identifiant sur celui que vous voulez, cependant, pour se concentrer uniquement sur celui-ci. L'utilisation de cette méthodologie et aucun «x» n'a bien fonctionné pour moi.
la source
.html()
sur l'élément donné. CELA FONCTIONNE et j'aimerais une explication de pourquoi il ne fonctionne pas.Solution simple.
la source
Je ne comprends peut-être pas votre question correctement, mais cela obtiendra le code HTML de l'élément parent de l'élément sélectionné.
C'est ça que tu cherches?
la source