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

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


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

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.


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

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

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>

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.