jQuery pour sérialiser uniquement les éléments d'un div

111

Je voudrais obtenir le même effet que jQuery.serialize()mais je voudrais ne renvoyer que les éléments enfants d'un donné div.

Exemple de résultat:

single=Single2&multiple=Multiple&radio=radio1
BrokeMyLegBiking
la source

Réponses:

277

Aucun problème. Utilisez simplement ce qui suit. Cela se comportera exactement comme la sérialisation d'un formulaire mais en utilisant le contenu d'un div à la place.

$('#divId :input').serialize();

Vérifiez https://jsbin.com/xabureladi/1 pour une démonstration ( https://jsbin.com/xabureladi/1/edit pour le code)

trembler
la source
58
N'auriez-vous pas de $("#divId").find("select, textarea, input").serialize();meilleures performances? J'imagine que ce qui précède pourrait devenir lent si le div avait beaucoup d'éléments, comme un tableau avec plusieurs lignes / colonnes.
David Murdoch le
3
Comme indiqué dans d'autres réponses, $ ('# divId: input'). Serialize () serait plus efficace.
jfountain
2
@EaterOfCorpses ce n'est pas une façon très précise de tester. Si vous changez l'ordre des instructions, vous remarquerez qu'il n'y a pas vraiment de différence: jsfiddle.net/QAKjN/10 . Il y a plus en jeu que les sélecteurs
Rondel
2
De toute évidence, cela ne sérialise que les entrées, donc le commentaire de David Murdoch serait la bonne façon de le faire.
superphonique
2
jQuery: "Étant donné que: input est une extension jQuery et ne fait pas partie de la spécification CSS, les requêtes utilisant: input ne peuvent pas profiter de l'amélioration des performances fournie par la méthode native DOM querySelectorAll ()." utiliser $ ('[nom]') sera mieux: document.querySelectorAll ('[nom]');
Abdullah Aydın
22

Vous pouvez améliorer la vitesse de votre code si vous limitez les éléments que jQuery examinera.

Utilisez le sélecteur : input au lieu de * pour y parvenir.

$('#divId :input').serialize()

Cela rendra votre code plus rapide car la liste des éléments est plus courte.

ThiagoPXP
la source
15

serializetous les éléments de formulaire dans un fichier div.

Vous pouvez le faire en ciblant le div à l' #target-div-idintérieur de votre formutilisation:

$('#target-div-id').find('select, textarea, input').serialize();
Zakaria Acharki
la source
5

La fonction que j'utilise actuellement:

/**
 * Serializes form or any other element with jQuery.serialize
 * @param el
 */
serialize: function(el) {
    var serialized = $(el).serialize();
    if (!serialized) // not a form
        serialized = $(el).
          find('input[name],select[name],textarea[name]').serialize();
    return serialized;
}
Lukasz Frankowski
la source
2
Aussi .find ('[nom]'). Serialize (); peut être utilisé pour filtrer les éléments «sérialisables».
Abdullah Aydın
3

Essayez aussi ceci:

$ ('# divId'). find ('entrée'). serialize ()

Alberto Buschettu
la source
6
Cela ne sérialisera pas certains éléments et zones de texte dans la div
Jeff Walker Code Ranger
Cela corrige le problème de select et textarea: <code> $ ("# divId"). Find ("select, textarea, input"). Serialize (); <// code>
TroySteven
3

Et ma solution:

function serializeDiv( $div, serialize_method )
{
    // Accepts 'serialize', 'serializeArray'; Implicit 'serialize'
    serialize_method = serialize_method || 'serialize';

    // Unique selector for wrapper forms
    var inner_wrapper_class = 'any_unique_class_for_wrapped_content';

    // Wrap content with a form
    $div.wrapInner( "<form class='"+inner_wrapper_class+"'></form>" );

    // Serialize inputs
    var result = $('.'+inner_wrapper_class, $div)[serialize_method]();

    // Eliminate newly created form
    $('.script_wrap_inner_div_form', $div).contents().unwrap();

    // Return result
    return result;
}

/* USE: */

// For: $('#div').serialize()
serializeDiv($('#div')); /* or */ serializeDiv($('#div'), 'serialize');

// For: $('#div').serializeArray()
serializeDiv($('#div'), 'serializeArray');

Briganti
la source
0

Si ces éléments ont un nom de classe commun, on peut également utiliser ceci:

$('#your_div .your_classname').serialize()

De cette façon, vous pouvez éviter la sélection de boutons, qui seront sélectionnés à l'aide du sélecteur jQuery :input. Bien que cela puisse également être évité en utilisant$('#your_div :input:not(:button)').serialize();

Yogesh Mistry
la source
0
$('#divId > input, #divId > select, #divId > textarea').serialize();
jefissu
la source
1
Si une virgule est utilisée, vous devez spécifier le IDdans chaque sélecteur, comme $('#divId > input, #divId > select, #divId > textarea'):; Aussi, le >symbole il fait référence à des éléments enfants directs ... Très inhabituel dans ce scénario ou du moins, très restrictif.
gmo