Créer un objet jQuery à partir d'une grosse chaîne HTML

140

J'ai une grosse chaîne HTML contenant plusieurs nœuds enfants.

Est-il possible de construire un objet DOM jQuery en utilisant cette chaîne?

J'ai essayé $(string)mais cela ne renvoie qu'un tableau contenant tous les nœuds individuels.

Je cherche à obtenir un élément sur lequel je peux utiliser la fonction .find ().

utilisateur1033619
la source
Où est le HTML, que voulez-vous construire avec? Vous voudrez peut-être regarder la fonction .find (): api.jquery.com/find
Control Freak
3
Un objet jQuery est un objet de type tableau contenant tous les nœuds. Pouvez-vous expliquer ce que vous essayez d'accomplir?
Frédéric Hamidi
Où est «cette chaîne»? quelle chaîne?
Viezevingertjes
Jetez un oeil ici, je pense que c'est ce que vous voulez stackoverflow.com/q/759887/474535
bart s
Je dois passer l'élément d'un WebView à un autre via une chaîne, la chaîne ne serait que la source HTML de cet élément. Je pense que j'ai peut-être mal compris ce qu'est un objet jQuery.
user1033619

Réponses:

200

Mettre à jour:

Depuis jQuery 1.8, nous pouvons utiliser $ .parseHTML , qui analysera la chaîne HTML en un tableau de nœuds DOM. par exemple:

var dom_nodes = $($.parseHTML('<div><input type="text" value="val" /></div>'));

alert( dom_nodes.find('input').val() );

DEMO


var string = '<div><input type="text" value="val" /></div>';

$('<div/>').html(string).contents();

DEMO

Que se passe-t-il dans ce code:

  • $('<div/>')est un faux <div>qui n'existe pas dans le DOM
  • $('<div/>').html(string)ajoute stringdans ce faux en <div>tant qu'enfants
  • .contents()récupère les enfants de ce faux en <div>tant qu'objet jQuery

Si vous voulez .find()travailler, essayez ceci:

var string = '<div><input type="text" value="val" /></div>',
    object = $('<div/>').html(string).contents();

alert( object.find('input').val() );

DEMO

thecodeparadox
la source
1
@ user1033619 vous pouvez .find()également effectuer l' opération, vérifiez la démo
thecodeparadox
Mais comment sistring = '<input type="text" value="val" />'
fdrv
1
Si vous pouvez faire $("<div/>"), pourquoi ne pouvez-vous pas faire $(string)?
xr280xr
2
Avec un HTML plus complexe, j'avais besoin de supprimer .contents pour que cela fonctionne. jsfiddle.net/h45y2L7v
Simon Hutchison
Vous ne voulez pas faire $ (string) car vous avez besoin d'un div wrapping pour obtenir le contenu de. Vous obtiendrez le contenu du div, qui sera votre entrée.
Michael Khalili
120

Depuis jQuery 1.8, vous pouvez simplement utiliser parseHtml pour créer votre objet jQuery:

var myString = "<div>Some stuff<div>Some more stuff<span id='theAnswer'>The stuff I am looking for</span></div></div>";
var $jQueryObject = $($.parseHTML(myString));

J'ai créé un JSFidle qui démontre ceci: http://jsfiddle.net/MCSyr/2/

Il analyse la chaîne HTML arbitraire dans un objet jQuery et utilise find pour afficher le résultat dans un div.

kiprainey
la source
10
Je trouve cette réponse bien meilleure, car cela n'a pas besoin d'utiliser un élément div fantôme. $ .parseHtml ftw.
ZeeCoder
2
Cette réponse n'a pas fonctionné pour moi quand je voulais alors vers $ jQueryObject.find (), je présume parce qu'elle n'a pas été ajoutée au dom à ce moment-là.
dougajmcdonald
@dougajmcdonald - find devrait fonctionner sans que le contenu ne soit ajouté au dom. Si vous regardez mon violon ( jsfiddle.net/MCSyr/2 ), j'appelle find sur l'objet jQuery, et il renvoie un résultat comme prévu: $ jQueryObject.find ("# theAnswer"). Html ()
kiprainey
1
@kiprainey intéressant, je vais chercher l'exemple sur lequel il ne m'a pas été utile et voir s'il y avait autre chose en cours. Il a été écrit dans un module TypeScript dans une charge d'une autre logique, cela aurait bien pu être un problème différent! Mes excuses.
dougajmcdonald
8
Il convient de mentionner que parseHTML a été ajouté dans jQuery 1.8
Jean-Michel Garcia
12
var jQueryObject = $('<div></div>').html( string ).children();

Cela crée un objet jQuery factice dans lequel vous pouvez placer la chaîne au format HTML. Ensuite, vous n'avez que les enfants.

Florian Margaine
la source
2
ive a essayé cela, mais cela ne fonctionne pas avec la fonction .find () que je dois utiliser plus tard.
user1033619
3
@ user1033619 vous devez utiliser à la .filter()place de .find().
Kulbir Saini
2

Il existe également une excellente bibliothèque appelée cheerio conçue spécialement pour cela.

Implémentation rapide, flexible et allégée du noyau jQuery conçu spécifiquement pour le serveur.

var cheerio = require('cheerio'),
    $ = cheerio.load('<h2 class="title">Hello world</h2>');

$('h2.title').text('Hello there!');
$('h2').addClass('welcome');

$.html();
//=> <h2 class="title welcome">Hello there!</h2>
Loourr
la source
1

J'utilise ce qui suit pour mes modèles HTML:

$(".main").empty();

var _template = '<p id="myelement">Your HTML Code</p>';
var template = $.parseHTML(_template);
var final = $(template).find("#myelement");

$(".main").append(final.html());

Remarque: en supposant que vous utilisez jQuery

Anthony
la source
1

la raison pour laquelle $ (string) ne fonctionne pas est que jquery ne trouve pas de contenu html entre $ (). Par conséquent, vous devez d'abord l'analyser en html. une fois que vous avez une variable dans laquelle vous avez analysé le html. vous pouvez alors utiliser $ (string) et utiliser toutes les fonctions disponibles sur l'objet

Chetan
la source