34 votes

GET/POST non-ajax avec jQuery (plugin ?)

C'est l'une de ces situations où j'ai l'impression qu'il me manque un mot-clé crucial pour trouver la réponse sur Google...

J'ai un ensemble de paramètres et je veux que le navigateur navigue vers une URL GET avec les paramètres. En tant qu'utilisateur de jQuery, je sais que si je voulais faire une requête ajax, je ferais simplement :

$.getJSON(url, params, fn_handle_result);

Mais parfois, je ne veux pas utiliser ajax. Je veux juste soumettre les paramètres et obtenir une page en retour.

Maintenant, je sais que je peux boucler les paramètres et construire manuellement une URL GET. Pour POST, je peux créer dynamiquement un formulaire, le remplir avec des champs et le soumettre. Mais je suis sûr que quelqu'un a déjà écrit un plugin qui fait cela. Ou peut-être que j'ai raté quelque chose et que vous pouvez le faire avec le noyau de jQuery.

Quelqu'un connaît-il un tel plugin ?

EDIT : En fait, ce que je veux, c'est écrire :

$.goTo(url, params);

Et éventuellement

$.goTo(url, params, "POST");

50voto

Dustin Points 466

Le plugin jQuery semblait fonctionner parfaitement jusqu'à ce que je l'essaie sur IE8. J'ai dû faire cette légère modification pour qu'il fonctionne sur IE :

(function($) {
    $.extend({
        getGo: function(url, params) {
            document.location = url + '?' + $.param(params);
        },
        postGo: function(url, params) {
            var $form = $("<form>")
                .attr("method", "post")
                .attr("action", url);
            $.each(params, function(name, value) {
                $("<input type='hidden'>")
                    .attr("name", name)
                    .attr("value", value)
                    .appendTo($form);
            });
            $form.appendTo("body");
            $form.submit();
        }
    });
})(jQuery);

20voto

itsadok Points 12971

Voici ce que j'ai fini par faire, en utilisant l'astuce de redsquare :

(function($) {
    $.extend({
        doGet: function(url, params) {
            document.location = url + '?' + $.param(params);
        },
        doPost: function(url, params) {
            var $form = $("<form method='POST'>").attr("action", url);
            $.each(params, function(name, value) {
                $("<input type='hidden'>")
                    .attr("name", name)
                    .attr("value", value)
                    .appendTo($form);
            });
            $form.appendTo("body");
            $form.submit();
        }
    });
})(jQuery);

Utilisation :

$.doPost("/mail/send.php", {
    subject: "test email",
    body: "This is a test email sent with $.doPost"
});

Tout retour d'information est le bienvenu.

Mise à jour : voir la réponse de dustin pour une version qui fonctionne dans IE8

12voto

redsquare Points 47518

La question n'indique pas clairement si vous souhaitez transmettre un ensemble aléatoire de valeurs dans la chaîne de requête ou s'il s'agit de valeurs de formulaire.

Pour les valeurs de formulaire, il suffit d'utiliser l'option .serialize pour construire la chaîne de requête.

Par exemple

var qString = $('#formid').serialize();
document.location = 'someUrl' + '?' + serializedForm

Si vous disposez d'un ensemble aléatoire de valeurs, vous pouvez construire un objet et utiliser la fonction .param méthode d'utilité.

Par exemple

 var params = { width:1680, height:1050 };
 var str = jQuery.param( params );
 console.log( str )
 // prints width=1680&height=1050
 // document.location = 'someUrl' + '?' + str

3voto

Jim Morris Points 1512

FYI pour tous ceux qui font le doPost pour rails 3, vous devez ajouter le jeton CSRF, en ajoutant ce qui suit à la réponse devrait le faire...

var token = $('meta[name="csrf-token"]').attr('content');
$("<input name='authenticity_token' type='hidden' value='" + token + "'/>").appendTo($form);

1voto

Oui. Excellent itsadok ! C'est exactement ce que je cherchais. Je pense que cette fonctionnalité get et post non-ajax devrait être officiellement incluse dans jquery. Merci beaucoup.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X