Estou tentando direcionar um navegador para uma página diferente. Se eu quisesse uma solicitação GET, eu poderia dizer
document.location.href = 'http://example.com/q=a';
Mas o recurso que estou tentando acessar não responderá corretamente, a menos que eu use uma solicitação POST. Se isso não fosse gerado dinamicamente, eu poderia usar o HTML
<form action="http://example.com/" method="POST">
<input type="hidden" name="q" value="a">
</form>
Depois, basta enviar o formulário do DOM.
Mas realmente gostaria de código JavaScript que me permita dizer
post_to_url('http://example.com/', {'q':'a'});
Qual é a melhor implementação entre navegadores?
Editar
Me desculpe, eu não estava claro. Preciso de uma solução que mude a localização do navegador, assim como o envio de um formulário. Se isso for possível com XMLHttpRequest , não é óbvio. E isso não deve ser assíncrono, nem usar XML; portanto, o Ajax não é a resposta.
Respostas:
Crie dinamicamente
<input>
s em um formulário e envie-oExemplo:
EDIT : Como isso foi muito votado, acho que as pessoas vão copiar muito isso. Por isso, adicionei a
hasOwnProperty
verificação para corrigir erros inadvertidos.fonte
Esta seria uma versão da resposta selecionada usando o jQuery .
fonte
$("<form method='POST' action='https://example.com'><input type='hidden' name='q' value='a'/></form>").appendTo("body").submit();
Uma implementação simples e rápida da resposta do @Aaron:
Obviamente, você deve usar uma estrutura JavaScript como Prototype ou jQuery ...
fonte
Usando a
createElement
função fornecida nesta resposta , necessária devido à quebra do IE com o atributo name nos elementos criados normalmente comdocument.createElement
:fonte
A resposta de Rakesh Pai é incrível, mas há um problema que ocorre comigo (no Safari ) quando tento postar um formulário com um campo chamado
submit
. Por exemplopost_to_url("http://google.com/",{ submit: "submit" } );
,. Corrigi um pouco a função para contornar essa colisão de espaço variável.fonte
Não. Você não pode ter a solicitação de postagem em JavaScript como um formulário.
O que você pode ter é um formulário em HTML e envie-o com o JavaScript. (como explicado várias vezes nesta página).
Você mesmo pode criar o HTML, não precisa de JavaScript para escrever o HTML. Seria bobagem se as pessoas sugerissem isso.
Sua função configuraria apenas o formulário da maneira que você deseja.
Então, use-o como.
Mas eu deixaria de fora a função e apenas o faria.
Por fim, a decisão de estilo entra no arquivo ccs.
Pessoalmente, acho que os formulários devem ser abordados pelo nome, mas isso não é importante no momento.
fonte
Se você tiver o Prototype instalado, poderá reforçar o código para gerar e enviar o formulário oculto da seguinte maneira:
fonte
esta é a resposta do rakesh, mas com suporte para matrizes (o que é bastante comum em formulários):
javascript simples:
ah, e aqui está a versão do jquery: (código ligeiramente diferente, mas tudo se resume à mesma coisa)
fonte
Uma solução é gerar o formulário e enviá-lo. Uma implementação é
Para que eu possa implementar um bookmarklet de encurtamento de URL com um simples
fonte
Bem, gostaria de ter lido todos os outros posts para não perder tempo criando isso a partir da resposta de Rakesh Pai. Aqui está uma solução recursiva que funciona com matrizes e objetos. Nenhuma dependência no jQuery.
Adicionado um segmento para lidar com casos em que todo o formulário deve ser enviado como uma matriz. (ou seja, onde não há objeto wrapper em torno de uma lista de itens)
fonte
Três opções aqui.
Resposta padrão do JavaScript: Use uma estrutura! A maioria das estruturas do Ajax terá uma maneira fácil de criar um POST XMLHTTPRequest .
Faça o XMLHTTPRequest solicitar você mesmo, passando a postagem para o método open em vez de get. (Mais informações em Usando o método POST em XMLHTTPRequest (Ajax) .)
Via JavaScript, crie dinamicamente um formulário, adicione uma ação, adicione suas entradas e envie-o.
fonte
Eu seguiria a rota do Ajax, como outros sugeriram, com algo como:
fonte
A maneira mais fácil é usar o Ajax Post Request:
Onde:
Em seguida, no manipulador de sucesso, redirecione o navegador com algo como window.location.
fonte
Aqui está como eu escrevi usando jQuery. Testado no Firefox e Internet Explorer.
fonte
A biblioteca Prototype inclui um objeto Hashtable, com um método ".toQueryString ()", que permite transformar facilmente um objeto / estrutura JavaScript em uma string de estilo de cadeia de consulta. Como a postagem exige que o "corpo" da solicitação seja uma sequência formatada em sequência de consultas, isso permite que sua solicitação do Ajax funcione corretamente como uma postagem. Aqui está um exemplo usando Prototype:
fonte
Isso funciona perfeitamente no meu caso:
Você pode usá-lo em funções como:
Usando isso, você pode postar todos os valores das entradas.
fonte
Mais uma solução recursiva , já que algumas parecem estar quebradas (não testei todas). Este depende do lodash 3.xe ES6 (o jQuery não é necessário):
fonte
Minha solução codificará objetos profundamente aninhados, diferente da solução atualmente aceita pelo @RakeshPai.
Ele usa a biblioteca npm 'qs' e sua função stringify para converter objetos aninhados em parâmetros.
Esse código funciona bem com um back-end do Rails, embora você possa modificá-lo para funcionar com qualquer back-end necessário, modificando as opções passadas para o stringify. O Rails exige que arrayFormat seja definido como "colchetes".
Exemplo:
Produz estes parâmetros do Rails:
fonte
FormObject é uma opção. Mas o FormObject não é suportado pela maioria dos navegadores agora.
fonte
É como a opção 2 de Alan (acima). Como instanciar o httpobj é deixado como um exercício.
fonte
Isso é baseado no código do beauSD usando jQuery. Ele foi aprimorado para funcionar recursivamente em objetos.
fonte
Você pode adicionar dinamicamente o formulário usando DHTML e enviá-lo.
fonte
Você pode usar uma biblioteca como jQuery e seu método $ .post .
fonte
Eu uso o document.forms java e faço um loop para obter todos os elementos no formulário e, em seguida, envio via xhttp. Portanto, esta é minha solução para envio de javascript / ajax (com todo o html incluído como exemplo):
fonte
Você pode usar o método de disparo do jQuery para enviar o formulário, assim como pressiona um botão,
ele será enviado no navegador.
fonte
O método que eu uso para postar e direcionar um usuário automaticamente para outra página é apenas escrever um formulário oculto e enviá-lo automaticamente. Tenha certeza de que o formulário oculto não ocupa absolutamente nenhum espaço na página da web. O código seria algo como isto:
Aplicação de envio automático
Um aplicativo de envio automático estaria direcionando valores de formulário que o usuário inseriu automaticamente na outra página de volta para essa página. Esse aplicativo seria assim:
fonte
Aqui está como eu faço isso.
fonte
Nenhuma das soluções acima lidou com parâmetros reais aninhados com apenas jQuery, então aqui está minha solução de dois centavos.
Se você estiver usando jQuery e precisar manipular parâmetros aninhados profundos, poderá usar esta função abaixo:
Aqui está um exemplo de como usá-lo. O código html:
E se você clicar no botão de teste, ele publicará o formulário e você obterá os seguintes valores no POST:
Nota: se você quiser postar o formulário em outro URL que não seja a página atual, poderá especificar o URL como o segundo argumento da função postForm.
Então, por exemplo (para reutilizar seu exemplo):
Espero que isto ajude.
Nota 2: o código foi retirado do plug-in de redirecionamento . Eu basicamente simplifiquei para as minhas necessidades.
fonte
Plugin jQuery para redirecionar com POST ou GET:
https://github.com/mgalante/jquery.redirect/blob/master/jquery.redirect.js
Para testar, inclua o arquivo .js acima ou copie / cole a classe no seu código e use o código aqui, substituindo "args" pelos nomes das variáveis e "values" pelos valores dessas respectivas variáveis:
fonte
Você pode fazer uma chamada AJAX (provavelmente usando uma biblioteca como Prototype.js ou JQuery). O AJAX pode lidar com as opções GET e POST.
fonte