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

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)


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.


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

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;
}

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 ()


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


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


0
$('#divId > input, #divId > select, #divId > textarea').serialize();

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.