jQuery - adicione parâmetros adicionais ao enviar (NÃO ajax)

206

Usando o 'envio' do jQuery - existe uma maneira de passar parâmetros adicionais para um formulário? NÃO pretendo fazer isso com o Ajax - este é um envio normal e típico de atualização.

$('#submit').click(function () {
    $('#event').submit(function () {
        data: { 
        form['attendees'] = $('#attendance').sortable('toArray').toString();
    });
});
Ciel
fonte
Qual tecnologia do lado do servidor você está usando?
Enrique
Veja minha resposta [aqui] [1], que é anexada a um formulário serializado antes de enviar. [1]: stackoverflow.com/questions/17809056/…
Jeff Lowery

Respostas:

371

Este fez isso por mim:

var input = $("<input>")
               .attr("type", "hidden")
               .attr("name", "mydata").val("bla");
$('#form1').append(input);

baseia-se na resposta do Daff, mas adicionou o atributo NAME para deixá-lo aparecer na coleção de formulários e alterou VALUE para VAL Também verificou o ID do FORM (formulário1 no meu caso)

usou o firebug do Firefox para verificar se o elemento foi inserido.

Os elementos ocultos são postados de volta na coleção de formulários, apenas os campos somente leitura são descartados.

Michel

Michel
fonte
46
Como eu canto 'você é meu raio de sol' em binário? Muito obrigado. Isso resolve muitas coisas.
Ciel
38
Você pode melhorar um pouco a legibilidade: var input = $ ("<input>", {type: "hidden", name: "mydata", value: "bla"}); $ ('# form1'). append ($ (entrada));
Konstantine Kalbazov
2
$ ("<input>") .attr ("tipo", "oculto"). attr ("nome", "meus dados"). val ("bla"). appendTo ('# form1'); é outra maneira
kiev
6
Gostei de uma combinação de: $ ("<input>", {type: "hidden", nome: "mydata", valor: "bla"}). AppendTo ("# form1");
gabeio
Não há um limite para o tamanho dos dados? Enviei algum objeto grande usando JSON.stringify (obj) e esse método e ele parecia estar truncado.
Omikron
26

No seu caso, basta adicionar outro campo oculto ao seu formulário dinamicamente.

var input = $("<input>").attr("type", "hidden").val("Bla");
$('#form').append($(input));
Daff
fonte
Os dados que preciso enviar não são compatíveis com o formulário. Ele deve ser capturado e manipulado no lado do servidor.
Ciel
O que você quer dizer com "não capaz de forma"?
Vincent Ramdhanie 27/03
Desculpe - isso não funcionou. Mesmo com apenas dados forçados, ele não os injeta no formulário.
Ciel
Não pode ser colocado em um campo de formulário.
Ciel
2
Se for uma string, ela pode ser colocada em um campo de formulário #
PetersenDidIt
19

Você pode até usar este. funcionou bem para mim

$("#registerform").attr("action", "register.php?btnsubmit=Save") 
$('#registerform').submit();

isso enviará btnsubmit = Salvar como valor GET no formulário register.php.

Parag
fonte
Esta parece ser uma solução mais elegante. Lembre-se de usar encodeURIComponent()o valor do parâmetro, dependendo do tipo de dados.
Andres SK
1
Este é realmente melhor quando permite ao usuário enviar o formulário várias vezes. O formulário não receberá mais de um campo oculto com valores diferentes.
Mellon
11

Você poderia escrever uma função jQuery que permitisse adicionar campos ocultos a um formulário:

// This must be applied to a form (or an object inside a form).
jQuery.fn.addHidden = function (name, value) {
    return this.each(function () {
        var input = $("<input>").attr("type", "hidden").attr("name", name).val(value);
        $(this).append($(input));
    });
};

E adicione o campo oculto antes de enviar:

var frm = $("#form").addHidden('SaveAndReturn', 'Save and Return')
                    .submit();
Jonathan
fonte
1
Veja stackoverflow.com/questions/2601223/... para versão mais avançada do addHidden
Jonathan
1
Eu gosto da simplicidade desta solução. Ele não lida com muitos casos, mas lida bem com o caso.
27413 Phil
11

Você não precisa vincular o evento de envio ao clicar no botão enviar, basta vincular o evento de envio e ele capturará o evento de envio, não importa como ele é acionado.

Pense no que você quer é enviar o classificável como faria via ajax. Tente fazer algo assim:

var form = $('#event').submit(function () {
    $.each($('#attendance').sortable('toArray'),function(i, value){
        $("<input>").attr({
            'type':'hidden',
            'name':'attendace['+i+']'
        }).val(value).appendTo(form);
    });
});
PetersenDidIt
fonte
ainda não está sendo exibido na coleção de formulários do lado do servidor ... há algo especial que preciso fazer para que um campo oculto apareça em um servidor? Ele está passando pelo C # / ASP.NET MVC usando um objeto FormCollection.
Ciel
Atualizei minha resposta, acho que entendi o que você está tentando fazer.
PetersenDidIt
Você está adicionando um nameatributo à entrada do formulário oculto gerado? Conforme stackoverflow.com/questions/504681/… , parece que os objetos FormCollection exigem que todos os <input>elementos tenham nomes.
Npdoty 27/03
Sim, estou tentando enviar uma classificável para a coleção de formulários como uma sequência de valores separados por vírgula. Eu tentei sua atualização e ela ainda não foi postada. Não tenho certeza do que estou fazendo de errado ... Agradeço a ajuda.
Ciel
Parece que o problema não está no lado do cliente, mas no lado do servidor.
PetersenDidIt
2

Resposta semelhante, mas eu só queria disponibilizá-lo para um teste fácil / rápido.

var input = $("<input>")
               .attr("name", "mydata").val("go Rafa!");

$('#easy_test').append(input);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>



<form id="easy_test">
  
</form>

Cacho Santa
fonte