jQuery para serializar apenas elementos dentro de um div

111

Eu gostaria de obter o mesmo efeito que, jQuery.serialize()mas gostaria de devolver apenas os elementos filhos de um dado div.

Resultado da amostra:

single=Single2&multiple=Multiple&radio=radio1
BrokeMyLegBiking
fonte

Respostas:

277

Sem problemas. Basta usar o seguinte. Isso se comportará exatamente como serializar um formulário, mas usando o conteúdo de um div.

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

Verifique https://jsbin.com/xabureladi/1 para uma demonstração ( https://jsbin.com/xabureladi/1/edit para o código)

tremor
fonte
58
Não teria $("#divId").find("select, textarea, input").serialize();melhor desempenho? Eu imagino que o acima poderia ficar lento se o div tivesse muitos elementos, como uma tabela com várias linhas / colunas.
David Murdoch,
3
Conforme listado em outras respostas, $ ('# divId: input'). Serialize () seria mais eficiente.
jfountain
2
@EaterOfCorpses não é uma maneira muito precisa de testar. Se você mudar a ordem das declarações, notará que realmente não há nenhuma diferença: jsfiddle.net/QAKjN/10 . Há mais em jogo do que os seletores
Rondel
2
É claro que isso também serializa apenas as entradas, então o comentário de David Murdoch seria a maneira certa de fazer isso.
superfônico de
2
jQuery: "Porque: input é uma extensão jQuery e não faz parte da especificação CSS, as consultas usando: input não podem tirar vantagem do aumento de desempenho fornecido pelo método nativo DOM querySelectorAll ()." usando $ ('[nome]') será melhor: document.querySelectorAll ('[nome]');
Abdullah Aydın
22

Você pode melhorar a velocidade do seu código se restringir os itens que o jQuery examinará.

Use o seletor : input em vez de * para alcançá-lo.

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

Isso tornará seu código mais rápido porque a lista de itens é menor.

ThiagoPXP
fonte
15

serializetodos os elementos do formulário dentro de um div.

Você pode fazer isso direcionando o div #target-div-iddentro de você formusando:

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

A função que uso atualmente:

/**
 * 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
fonte
2
Também .find ('[nome]'). Serialize (); pode ser usado para filtrar elementos 'serializáveis'.
Abdullah Aydın
3

Experimente também este:

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

Alberto Buschettu
fonte
6
Isso não serializará elementos selecionados e áreas de texto na div
Jeff Walker Code Ranger
Isso corrige o problema de select e textarea: <code> $ ("# divId"). Find ("select, textarea, input"). Serialize (); <// code>
TroySteven
3

E a minha solução:

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
fonte
0

Se esses elementos tiverem um nome de classe comum, também será possível usar:

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

Desta forma, você pode evitar a seleção de botões, que serão selecionados usando o seletor jQuery :input. Embora isso também possa ser evitado usando$('#your_div :input:not(:button)').serialize();

Yogesh Mistry
fonte
0
$('#divId > input, #divId > select, #divId > textarea').serialize();
Jefissu
fonte
1
Se a vírgula for usada, você precisará especificar IDem cada seletor, como $('#divId > input, #divId > select, #divId > textarea'):; Além disso, o >símbolo se refere a elementos filhos diretos ... Muito incomum neste cenário ou, pelo menos, muito restritivo.
gmo