it-swarm-id.com

Kirim dua formulir dengan satu tombol

Saya memiliki dua bentuk HTML, satu yang mengirimkan data saat masuk ke database menggunakan PHP, yang lain mengarahkan pengguna ke halaman pembayaran Paypal, masalah saya adalah bahwa pengguna harus menyerahkan kedua formulir yang tentu saja saya tidak ingin mereka harus dilakukan. Apakah ada cara menggunakan satu tombol kirim untuk dua formulir?

(Javascript dipersilahkan)

46
Alex Saidani

Anda harus dapat melakukan ini dengan JavaScript:

<input type="button" value="Click Me!" onclick="submitForms()" />

Jika formulir Anda memiliki ID:

submitForms = function(){
    document.getElementById("form1").submit();
    document.getElementById("form2").submit();
}

Jika formulir Anda tidak memiliki ID tetapi memiliki nama:

submitForms = function(){
    document.forms["form1"].submit();
    document.forms["form2"].submit();
}
38
James Johnson

Pengiriman formulir menyebabkan halaman bernavigasi ke action formulir. Jadi, Anda tidak dapat mengirimkan kedua formulir dengan cara tradisional. Jika Anda mencoba melakukannya dengan JavaScript dengan memanggil form.submit() pada setiap formulir secara berturut-turut, setiap permintaan akan dibatalkan kecuali untuk pengiriman terakhir. Jadi, Anda perlu mengirimkan formulir pertama secara tidak sinkron melalui JavaScript:

var f = document.forms.updateDB;
var postData = [];
for (var i = 0; i < f.elements.length; i++) {
    postData.Push(f.elements[i].name + "=" + f.elements[i].value);
}
var xhr = new XMLHttpRequest();
xhr.open("POST", "mypage.php", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(postData.join("&"));

document.forms.Paypal.submit();
34
gilly3

Anda dapat mengirimkan formulir pertama menggunakan AJAX, jika tidak, pengiriman yang satu akan mencegah yang lain untuk dikirimkan.

10
RobG

Di Chrome dan IE9 (dan saya menduga semua browser lain juga) hanya yang terakhir akan menghasilkan koneksi soket, yang pertama akan dibuang. (Browser mendeteksi ini ketika kedua permintaan dikirim dalam satu JavaScript "timeslice" dalam kode Anda di atas, dan buang semua kecuali permintaan terakhir.)

Jika Anda memiliki panggilan balik acara, lakukan pengiriman kedua (tetapi sebelum balasan diterima), soket permintaan pertama akan dibatalkan. Ini pasti tidak ada yang direkomendasikan karena server dalam hal ini mungkin telah menangani permintaan pertama Anda, tetapi Anda tidak akan pernah tahu pasti.

Saya sarankan Anda menggunakan/menghasilkan satu permintaan yang dapat Anda transaksikan di sisi server.

9
Jonas Byström

Jawaban terbaik yang dipilih saat ini terlalu kabur untuk dapat diandalkan.

Bagi saya ini terasa seperti cara yang cukup aman untuk melakukannya:

(Javascript: menggunakan jQuery untuk membuatnya lebih sederhana)

$('#form1').submit(doubleSubmit);

function doubleSubmit(e1) {
    e1.preventDefault();
    e1.stopPropagation();
    var post_form1 = $.post($(this).action, $(this).serialize());

    post_form1.done(function(result) {
            // would be Nice to show some feedback about the first result here
            $('#form2').submit();
        });
};

Posting formulir pertama tanpa mengubah halaman, tunggu prosesnya selesai. Kemudian poskan formulir kedua. Posting kedua akan mengubah halaman, tetapi Anda mungkin ingin memiliki beberapa kode serupa juga untuk bentuk kedua, mendapatkan objek tangguhan kedua ( post_form2 ?) .

Tapi saya tidak menguji kodenya.

6
Kamafeather