2011-10-20 36 views
35

Tôi có hai biểu mẫu HTML, một biểu mẫu gửi dữ liệu khi nhập vào cơ sở dữ liệu bằng cách sử dụng PHP, hướng khác hướng người dùng đến trang thanh toán paypal, vấn đề của tôi là người dùng phải gửi cả hai biểu mẫu mà tất nhiên tôi không muốn họ phải làm. Có anyway để sử dụng một nút gửi cho hai hình thức?Gửi hai biểu mẫu với một nút

(Javascript được hoan nghênh)

Trả lời

24

Bạn sẽ có thể làm điều này với JavaScript:

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

Nếu hình thức của bạn có ID:

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

Nếu hình thức của bạn không có ID nhưng có tên:

submitForms = function(){ 
    document.forms["form1"].submit(); 
    document.forms["form2"].submit(); 
} 
+1

Có liên quan gì đến thời gian không? Cài đặt thời gian chờ ngắn giữa các lần gửi có thể giải quyết được vấn đề không? –

+0

Hãy tha thứ cho bản chỉnh sửa của tôi, nhưng tôi muốn rút lại phần còn lại của tôi. Tôi không chắc điều gì xảy ra với yêu cầu. Yêu cầu bị trình duyệt hủy bỏ, nhưng nó vẫn có thể đi qua máy chủ. Tôi đã thử gỡ lỗi máy chủ địa phương của tôi bằng cách sử dụng kỹ thuật của bạn và cả hai trang đã thực sự được gọi, vì vậy có thể cách của bạn hoạt động tốt. – gilly3

+13

Điều này khá đơn giản (ít nhất là với Chrome và IE9)! Xem câu trả lời của tôi dưới đây. –

-1

Nếu bạn có một nút gửi thường xuyên, bạn có thể thêm một sự kiện onclick với nó mà không được công sau:

document.getElementById('otherForm').submit(); 
9

Bạn có thể gửi biểu mẫu đầu tiên sử dụng AJAX, nếu không nộp ai sẽ ngăn chặn sự khác khỏi bị nộp .

30

Gửi biểu mẫu khiến trang điều hướng đến action của biểu mẫu. Vì vậy, bạn không thể gửi cả hai hình thức theo cách truyền thống. Nếu bạn cố gắng làm như vậy với JavaScript bằng cách gọi form.submit() trên mỗi biểu mẫu liên tiếp, mỗi yêu cầu sẽ bị hủy bỏ trừ lần gửi cuối cùng. Vì vậy, bạn cần gửi biểu mẫu đầu tiên không đồng bộ qua 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(); 
+1

Câu trả lời hay nhưng tùy thuộc vào hoàn cảnh và cách gửi biểu mẫu, lần gửi đầu tiên có thể ngăn việc gửi lần thứ hai (ví dụ: sử dụng sự kiện gửi trên một biểu mẫu để gọi 'submit()' trong Firefox). – RobG

+1

Hình thức thứ hai không được gửi cho đến khi đối tượng xhr được thực hiện. –

7

Trong Chrome và IE9 (chỉ tôi đoán tất cả các trình duyệt khác) sẽ kết nối ổ cắm đầu tiên . (Trình duyệt phát hiện điều này vì cả hai yêu cầu được gửi trong một "timeslice" JavaScript trong mã của bạn ở trên và loại bỏ tất cả trừ yêu cầu cuối cùng.)

Nếu bạn thay vào đó gọi lại một số sự kiện làm lần gửi thứ hai (nhưng trước khi trả lời) được nhận), socket của yêu cầu đầu tiên sẽ bị hủy. Đây là chắc chắn không có gì để đề xuất vì máy chủ trong trường hợp đó có thể đã xử lý yêu cầu đầu tiên của bạn, nhưng bạn sẽ không bao giờ biết chắc chắn.

Tôi khuyên bạn nên sử dụng/tạo một yêu cầu duy nhất mà bạn có thể giao dịch phía máy chủ.

+0

Sử dụng các lời hứa hoặc các đối tượng trì hoãn cũng là một lựa chọn có giá trị. – Kamafeather

0

nếu bạn muốn gửi hai hình thức với một nút bạn cần phải làm điều này:

1- sử dụng setTimeout()

2- phép chương trình cửa sổ pop up

<script> 
function myFunction() { 
setTimeout(function(){ document.getElementById("form1").submit();}, 3000); 
setTimeout(function(){ document.getElementById("form2").submit();}, 6000); 
} 
</script> 
<form target="_blank" id="form1"> 
<input type="text"> 
<input type="submit"> 
</form> 
<form target="_blank" id="form2"> 
<input type="text"> 
<input type="submit"> 
</form> 

javascript không gửi hai biểu mẫu cùng một lúc., chúng tôi gửi hai biểu mẫu với một nút không cùng một lúc nhưng sau khi bảo vệ.

chỉnh sửa: khi chúng tôi sử dụng mã này, trình duyệt không cho phép bật lên.
nếu bạn sử dụng mã này cho phần mềm của bạn như tôi chỉ cần đặt trình duyệt cho hiển thị bật lên nhưng nếu bạn sử dụng nó trong thiết kế trang web, trình duyệt là một rào cản và mã không chạy.

+0

Chờ đợi không được thông báo nếu lần gửi đầu tiên thành công hay không (tùy thuộc vào quy trình làm việc mà biểu mẫu thứ hai có thể cần ngăn chặn gửi), cũng như không đảm bảo việc xử lý tuần tự của hai yêu cầu (ví dụ: tôi nên lưu trữ giao dịch cơ sở dữ liệu nếu giao dịch PayPal không thành công?). Hãy xem câu trả lời thay thế tôi đã viết; Tôi đã cố gắng kiểm soát luồng công việc và kết quả nhiều hơn. – Kamafeather

3

Câu trả lời hay nhất hiện được chọn là quá mờ để đáng tin cậy.

này cảm thấy đối với tôi giống như một cách khá an toàn để làm điều đó:

(javascript: sử dụng jQuery để viết nó đơn giản hơn)

$('#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(); 
     }); 
}; 

bài viết dưới hình thức đầu tiên mà không thay đổi trang, chờ đợi quá trình hoàn thành. Sau đó, đăng biểu mẫu thứ hai. Bài đăng thứ hai sẽ thay đổi trang, nhưng bạn có thể muốn có một số mã tương tự cũng cho biểu mẫu thứ hai, nhận đối tượng trì hoãn thứ hai (post_form2?).

Tôi chưa thử nghiệm mã.

+0

Tại sao một downvote? Một bình luận sẽ được đánh giá cao hơn, nếu tôi đã viết một cái gì đó sai. – Kamafeather

+0

Tại sao bạn sử dụng cả hai 'e1.preventDefault();' và 'e1.stopPropagation();'. tôi đoán một trong hai người họ sẽ có đủ. FYI tôi đã không downvote. Nó chỉ là tôi đã đạt đến trang này và có một số nghi ngờ. –

+0

@dev_khan, chúng cung cấp chức năng khác nhau, vì vậy, không phải một trong hai chức năng đó sẽ có đủ. '' 'preventDefault''' là chắc chắn cần thiết, để ngăn chặn mặc định * submit * và nắm quyền sở hữu những gì sẽ xảy ra với sự kiện đó. '' 'stopPropagation''' thay vào đó phụ thuộc vào trường hợp sử dụng, trong trường hợp sự kiện không nên bị bắt từ các phần tử bên ngoài (không thể nhớ lại, nhưng có lẽ năm ngoái tôi đặt nó * - trong khi mã hóa trên fly- * được an toàn). Và đừng lo lắng tôi đã không nghĩ rằng bạn downvoted (vẫn là một mistery lý do tại sao tôi đã nhận nó), nhưng cảm ơn bạn đã xác định nó – Kamafeather

Các vấn đề liên quan