jQuery - غير قادر على تغيير الإجراء ديناميكيًا للنموذج وإرساله داخل حدث نجاح Ajaxform ()

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

سؤال

هذا نموذج دفع ليتم نشره على بوابة الدفع العالمية. يحتوي على جميع المعلمات وفقًا لوثائق WorldPay وتعمل بشكل جيد إذا تم نشرها مباشرة.

لكنني الآن أحاول ذلك

  • Ajax Poss النموذج أولاً إلى موقعي (باستخدام jQuery.form ، وهذا الجزء يعمل بشكل جيد) ثم قم ببعض عمليات قاعدة البيانات
  • ثم قم بتغيير سمة الإجراء باستخدام JavaScript ونشره إلى WorldPay. لكن موقع WorldPay لا يعمل وأي شيء ينبه بعد $("form#wpftuf").submit(); السطر في الكود التالي لا ينبه أيضًا.

نموذج الدفع

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

أنا هنا أعبر عنوان URL العالمي كمعلمة

ملزمة 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);


 });

أعتقد أن الخطأ يحدث لأنني أحاول تغيير الإجراء والتقديم داخل حدث نجاح نموذج AJAX وأن النموذج لا يزال binded. لذلك ، حاولت وضع عمياء $("form#wpftuf").unbind(options); , $("form#wpftuf").unbind(); $("form#wpftuf").unbind(ajaxForm); بعد $("form#wpftuf").attr("action",worldpayUrl); السطر (واحد تلو الآخر) ولكن في جميع الحالات أحصل على هذا الخطأ uncaught exception: Permission denied to call method XMLHttpRequest.open

كيف يمكنني تقديم النموذج ديناميكيًا إلى WorldPay بعد نجاح معالجة نموذج Ajax. هل يجب أن يكون النموذج unbinded أول؟ الرجاء المساعدة. قد يكون لهذا حل سهل ولكني غير قادر على الحصول عليه. لقد بحثت كثيرا.

يرجى الملاحظة
تحتاج بوابة الدفع WorldPay للمستخدم لملء بعض النماذج هناك بعد النشر ، وبالتالي فإن تقديم Ajax مرة أخرى باستخدام ajaxSubmit() لن تعمل. أحتاج إلى تقديم نموذج عادي هناك.

شكرًا،
سانديبان

هل كانت مفيدة؟

المحلول

أنا لا أستخدم المكون الإضافي Malsup ، ولكن إذا كنت على حق ، فإن مشكلتك هي .submit(); عند استخدام طلب AJAX باستخدام النموذج ، عادة ما يتم ضبطه على عدم اتخاذ أي إجراء return false; لذلك عند إرساله ، لا يزال الأمر كذلك محظور!

يجب أن يكون رمزك شيئًا كهذا:

محدث

$("#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...
            //}
        }
    });
    //}
});

في استخدام الجوهر هذا $("#wpftuf").unbind('submit').submit(); //submit it...

نصائح أخرى

ماذا لو حاولت تغيير عمل النموذج وإعادة تقديمه ليس بنجاح Ajax؟ على سبيل المثال ، يمكنك استخدامه setTimeout في success رد الاتصال والكود بعد أن نقول ثانية واحدة؟

فقط للرجوع اليها: http://www.w3schools.com/js/js_timing.asp

لست متأكدًا من أنني حصلت على سبب رغبتك في القيام بذلك بالطريقة التي تفعلها ، لكنها تبدو لي مثل فشل XMLHTTPrequest لأن البرامج النصية لا يمكنها إلا إعادة الطلبات إلى الخادم الأصلي.

لا يُسمح لكائن XMLHTTPrequest بإنشاء طلبات متقاطعة أو عبر بروتوكول أو منحدرات. هناك طرق يمكنك من خلالها التحايل على هذا التقييد ، لكنني لست متأكدًا من أنني أوصي بذلك.

ما أود فعله هو استخدام الخادم الخاص بك كبديل لنشره إلى WorldPay. بمعنى آخر. ينشر المستخدم النموذج إلى الخادم الخاص بك من خلال AJAX. يقوم الخادم الخاص بك بجميع التلاعب الضروري ويعيد إعادة النموذج إلى WorldPay ، ويقوم بتخفيض النتيجة ويعيد النتيجة إلى العميل من خلال Ajax.

  • لماذا تحتاج إلى إرساله عبر أياكس من العميل؟
  • لماذا تحتاج إلى إرساله إلى الخادم الخاص بك أولاً؟

لديك كل أنواع المشكلات المحددة للمجال وصندوق الرمل في طريقك. لا أعتقد أن هذا ممكن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top