Jquery - Impossible de façon dynamique l'action de changement d'un formulaire et le soumettre dans l'événement de succès de ajaxForm ()

StackOverflow https://stackoverflow.com/questions/3685417

Question

Ceci est une forme de paiement pour être affiché à la passerelle de paiement WorldPay. Il a tous les paramètres selon la documentation de WorldPay et il fonctionne très bien si elle est directement affiché.

Mais, maintenant, je suis en train de

  • AJAX afficher la forme d'abord sur mon site (en utilisant jquery.form, et cette partie fonctionne très bien), puis faire quelques opérations de base de données
  • et puis modifiez l'attribut d'action en utilisant javascript et l'envoyer à Worldpay. Mais le poste de WorldPay ne fonctionne pas et quoi que ce soit alertée après la ligne de $("form#wpftuf").submit(); dans le code suivant est pas non plus alertait aussi.

Le formulaire de paiement

<form name="wpftuf" id="wpftuf" method="post" action="http://url/of/ajax/file/add_credit"> 
       <input type="hidden" name="operation" value="add_credit" id="operation" /> <?php // for ajax validation ?>
 <input type="hidden" name="worldpayUrl" value="<?php echo WPurl?>" id="worldpayUrl" />
...
..
...other necessary fields
</form>

Ici, je passe l'URL de WorldPay comme paramètre

La liaison AJAX

$(document).ready(function() 
 {

  var options = {
            dataType:  'json',
            beforeSubmit: function()
            {
       //alert("submitting");
      },
            success: function(data)
            {
                if(data)
                {
                 if(data.success)
                 {
                  var worldpayUrl = $("input[id=worldpayUrl]").val();
                            $("form#wpftuf").attr("action",worldpayUrl);

     alert("this works");
                            $("form#wpftuf").submit();

                                        //This alert does not work
                    alert("this alert does not work "+$("form#wpftuf").attr("action"));
                 }
                }
            }
            ,
            error:function()
            {
             alert("validation failed");
            }
        };

  $("form#wpftuf").ajaxForm(options);


 });

Je suppose que l'erreur se produit parce que je suis en train de modifier l'action et la soumission à l'intérieur de l'événement succès de formulaire ajax et la forme est toujours binded. Alors, j'ai essayé en mettant aveuglément $("form#wpftuf").unbind(options);, $("form#wpftuf").unbind(); $("form#wpftuf").unbind(ajaxForm); après la ligne de $("form#wpftuf").attr("action",worldpayUrl); (un par un), mais dans tous les cas, je reçois cette erreur uncaught exception: Permission denied to call method XMLHttpRequest.open

Comment puis-je soumettre le formulaire dynamiquement à WorldPay après la forme ajax traitement succès. Le besoin de formulaire pour être unbinded en premier? aide s'il vous plaît. Cela peut avoir une solution facile, mais je ne suis pas en mesure de l'obtenir. Je cherchai beaucoup.

S'il vous plaît Remarque La passerelle de paiement WorldPay l'utilisateur a besoin pour remplir des formulaires là après l'affichage, donc une soumission AJAX à nouveau en utilisant ajaxSubmit() ne fonctionnera pas. J'ai besoin d'une soumission de forme normale là.

Merci,
Sandeepan

Était-ce utile?

La solution

Je ne suis pas avec le plugin malsup, mais si je ne me trompe pas, votre problème est le .submit(); lorsque vous utilisez une demande ajax avec la forme, généralement, il sera mis à ne prendre aucune return false; d'action lorsque vous soumettez, il est encore bloqué

votre code devrait être quelque chose comme ceci:

MISE À JOUR

$("#wpftuf").submit(function(e) {
    e.preventDefault(); // prevent normal form submission, same as return false;
    $form = $(this);
    var worldpayUrl = $("#worldpayUrl").val(); //get the World Pay php url
    var mySiteFirstUrl = $("#mySiteFirstUrl").val(); //get Your Site First php url
    // if ( valid ) { // make a validation here...
    var posts = $(this).serialize(); // get all form fields in form like: name=value
    //start the first ajax request...
    $.ajax({
        type: "POST",
        url: mySiteFirstUrl,
        data: posts,
        success: function(data) { // send back a json formatted response ?
            var result = $.parseJSON(data); //prepare json
            // if ( result ) { //make another validation here...
            // start making the changes to the form here
            // fill all the form fields with the returned json data...
            $form.attr('action' , worldpayUrl ); //give it the action url ); 
            $form.unbind('submit').submit(); //submit it...
            //}
        }
    });
    //}
});

dans l'utilisation de la substance cette $("#wpftuf").unbind('submit').submit(); //submit it...

Autres conseils

Que faire si vous essayez de modifier l'action du formulaire et le soumettre à nouveau pas dans le succès de AJAX? Par exemple. vous pouvez utiliser setTimeout dans le rappel de success et faire le code après son disons de 1 seconde?

Juste pour référence: http://www.w3schools.com/js/js_timing.asp

Je ne suis pas sûr que je reçois pourquoi vous voulez faire la façon dont vous le faites, mais il me semble que le XMLHttpRequest est un échec car les scripts ne peuvent faire des demandes à leur serveur d'origine.

L'objet XMLHTTPRequest ne peut pas faire de plusieurs domaines, en coupe protocole, ou des demandes inter-ports. Il existe des moyens que vous pouvez contourner cette restriction, mais je ne suis pas sûr que je recommande que.

Ce que je voudrais faire est d'utiliser votre serveur comme proxy pour l'affichage à WorldPay. c'est à dire. les messages de l'utilisateur du formulaire à votre serveur via ajax. Votre serveur fait toutes les manipulations neccessary et soumet à nouveau la forme de WorldPay, parse le résultat et renvoie le résultat au client via ajax.

  • Pourquoi avez-vous besoin de le soumettre par ajax à partir du client?
  • Pourquoi avez-vous besoin de le soumettre à votre serveur d'abord?

vous avez toutes sortes de domaines et les problèmes spécifiques de bac à sable qui vont sur le chemin que vous essayez de. Je ne pense pas qu'il soit possible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top