jQuery per serializzare solo gli elementi all'interno di un div


111

Vorrei ottenere lo stesso effetto di, jQuery.serialize()ma vorrei restituire solo gli elementi figlio di un dato div.

Risultato del campione:

single=Single2&multiple=Multiple&radio=radio1

Risposte:


277

Nessun problema. Basta usare quanto segue. Questo si comporterà esattamente come serializzare un modulo ma utilizzando invece il contenuto di un div.

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

Controlla https://jsbin.com/xabureladi/1 per una dimostrazione ( https://jsbin.com/xabureladi/1/edit per il codice)


58
Non $("#divId").find("select, textarea, input").serialize();otterresti prestazioni migliori? Immagino che quanto sopra potrebbe rallentare se il div avesse molti elementi, come una tabella con diverse righe / colonne.
David Murdoch

3
Come elencato in altre risposte, $ ('# divId: input'). Serialize () sarebbe più efficiente.
jfountain

2
@EaterOfCorpses non è un modo molto preciso per testare. Se cambi l'ordine delle istruzioni noterai che non c'è davvero alcuna differenza: jsfiddle.net/QAKjN/10 . C'è di più in gioco rispetto ai selezionatori
Rondel

2
Chiaramente questo serializza solo gli input, quindi il commento di David Murdoch sarebbe il modo giusto per farlo.
superphonic

2
jQuery: "Poiché: input è un'estensione jQuery e non fa parte della specifica CSS, le query che utilizzano: input non possono trarre vantaggio dall'aumento delle prestazioni fornito dal metodo querySelectorAll () DOM nativo." sarà meglio usare $ ('[nome]'): document.querySelectorAll ('[nome]');
Abdullah Aydın,

22

Puoi migliorare la velocità del tuo codice se limiti gli elementi che jQuery esaminerà.

Usa il selettore : input invece di * per ottenerlo.

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

Questo renderà il tuo codice più veloce perché l'elenco degli elementi è più breve.


15

serializetutti gli elementi del modulo all'interno di un file div.

Puoi farlo prendendo di mira il div #target-div-idall'interno del tuo formutilizzo:

$('#target-div-id').find('select, textarea, input').serialize();

5

La funzione che utilizzo attualmente:

/**
 * 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
Anche .find ('[nome]'). Serialize (); può essere utilizzato per filtrare elementi "serializzabili".
Abdullah Aydın,

3

Prova anche questo:

$ ( '# DivId'). Find ( 'input'). Serialize ()


6
Questo non serializzerà gli elementi selezionati e le aree di testo nel div
Jeff Walker Code Ranger,

Questo risolve il problema di selezione e textarea: <code> $ ("# divId"). Find ("select, textarea, input"). Serialize (); <// code>
TroySteven

3

E la mia soluzione:

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

Se questi elementi hanno un nome di classe comune, si può anche usare questo:

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

In questo modo è possibile evitare la selezione dei pulsanti, che verranno selezionati utilizzando il selettore jQuery :input. Anche se questo può essere evitato anche usando$('#your_div :input:not(:button)').serialize();


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

1
Se viene utilizzata la virgola, è necessario specificare IDin ogni selettore, come $('#divId > input, #divId > select, #divId > textarea'):; Inoltre, il >simbolo si riferisce a elementi figli diretti ... Molto insolito in questo scenario o, almeno, molto restrittivo.
OGM
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.