2011-10-20 14 views
35

मेरे पास HTML दो रूप हैं, जो PHP का उपयोग करके डेटाबेस में प्रवेश पर डेटा सबमिट करता है, दूसरा उपयोगकर्ता को पेपैल भुगतान पृष्ठ पर निर्देशित करता है, मेरी समस्या यह है कि उपयोगकर्ता को दोनों रूपों को जमा करना होगा निश्चित रूप से मैं नहीं चाहता कि उन्हें करना पड़े। क्या दो रूपों के लिए एक सबमिट बटन का उपयोग करने के लिए वैसे भी है? अपने रूपों आईडी है, तोएक बटन के साथ दो रूपों को सबमिट करें

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

:

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

अपने रूपों नहीं है, तो

उत्तर

24

आप जावास्क्रिप्ट के साथ ऐसा करने में सक्षम होना चाहिए (जावास्क्रिप्ट का स्वागत है) आईडी लेकिन नाम हैं:

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

क्या यह समय के साथ कुछ करना है? सबमिशन के बीच एक संक्षिप्त टाइमआउट सेट करना संभवतः इस मुद्दे को संबोधित करेगा? –

+0

मेरे संपादन को माफ़ कर दो, लेकिन मैं अपना डाउनवोट वापस लेना चाहता था। मुझे यकीन नहीं है कि अनुरोध के साथ क्या होता है। अनुरोध निश्चित रूप से ब्राउज़र द्वारा निरस्त किया गया है, लेकिन यह अभी भी सर्वर के माध्यम से सभी तरह से जा सकता है। मैंने अपनी तकनीक का उपयोग करके अपने स्थानीय सर्वर को डीबग करने का प्रयास किया और दोनों पेजों को वास्तव में बुलाया गया था, इसलिए शायद आपका तरीका ठीक काम करता है। – gilly3

+13

यह सादा गलत है (कम से कम क्रोम और आईई 9 के साथ)! नीचे मेरा जवाब देखें। –

-1

आप एक नियमित सबमिट बटन पर है, तो आप इसे करने के लिए एक ऑनक्लिक ईवेंट जोड़ सकता है कि अनुवर्ती करता है:

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

आप AJAX का उपयोग कर पहली फ़ॉर्म सबमिट कर सकते हैं, अन्यथा एक प्रस्तुत करने दर्ज किए जाने से अन्य पाएगा ।

30

एक फॉर्म सबमिशन पृष्ठ को action पर नेविगेट करने का कारण बनता है। तो, आप परंपरागत तरीके से दोनों रूपों को जमा नहीं कर सकते हैं। यदि आप उत्तराधिकार में प्रत्येक फॉर्म पर form.submit() पर कॉल करके जावास्क्रिप्ट के साथ ऐसा करने का प्रयास करते हैं, तो अंतिम अनुरोध को छोड़कर प्रत्येक अनुरोध निरस्त कर दिया जाएगा। तो, आप जावास्क्रिप्ट के माध्यम से एसिंक्रोनस पहले फ़ॉर्म जमा करना:

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

अच्छा जवाब लेकिन परिस्थितियों के आधार पर और फ़ॉर्म कैसे सबमिट किए जाते हैं, पहले जमा करने से दूसरे को जमा करने से रोका जा सकता है (उदाहरण के लिए सबमिट करने के लिए एक फॉर्म पर सबमिट ईवेंट का उपयोग करके दूसरे को सबमिट करें() ' फ़ायरफ़ॉक्स में)। – RobG

+1

दूसरा फॉर्म तब तक सबमिट नहीं किया जाना चाहिए जब तक कि xhr ऑब्जेक्ट नहीं किया जाता है। –

7

क्रोम और IE9 में केवल बाद एक सॉकेट कनेक्ट उत्पन्न होगा (और मैं भी सभी अन्य ब्राउज़र अनुमान लगा रहा हूँ), पहले एक को छोड़ दिया जाएगा । (ब्राउजर इसका पता लगाता है क्योंकि दोनों अनुरोध ऊपर दिए गए आपके कोड में एक जावास्क्रिप्ट "टाइम्सलाइस" के भीतर भेजे जाते हैं, और अंतिम अनुरोध के अलावा सभी को छोड़ देते हैं।)

यदि आपके पास इसके बजाय कुछ ईवेंट कॉलबैक दूसरा सबमिशन है (लेकिन उत्तर से पहले प्राप्त किया जाता है), पहले अनुरोध की सॉकेट रद्द कर दी जाएगी। यह निश्चित रूप से उस मामले में सर्वर के रूप में अनुशंसा करने के लिए कुछ भी नहीं है, जिसने आपके पहले अनुरोध को संभाला होगा, लेकिन आप कभी भी निश्चित रूप से नहीं जान पाएंगे।

मैं आपको एक अनुरोध का उपयोग/उत्पन्न करने की अनुशंसा करता हूं जिसे आप सर्वर-साइड से संसाधित कर सकते हैं।

+0

वादे या स्थगित वस्तुओं का उपयोग करना भी एक मूल्यवान विकल्प है। – Kamafeather

0

आपको ऐसा करने की जरूरत है अगर आप एक बटन के साथ दो रूपों प्रस्तुत करना चाहते हैं:

1- उपयोग setTimeout()

2- अनुमति देने के शो पॉप अप

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

जावास्क्रिप्ट एक ही समय में दो रूपों सबमिट नहीं करता है। हम एक ही समय के साथ दो फॉर्म सबमिट करते हैं, साथ ही पर नहीं बल्कि सेकेंड के बाद।

संपादित करें: जब हम इस कोड का उपयोग करते हैं, ब्राउज़र पॉप अप की अनुमति नहीं देता है।
यदि आप मेरे जैसे सॉफ़्टवेयर के लिए इस कोड का उपयोग करते हैं तो बस पॉप अप दिखाने के लिए ब्राउज़र सेट करें, लेकिन यदि आप इसे साइट पर डिज़ाइन करने में उपयोग करते हैं, तो ब्राउज़र एक बाधा है और कोड नहीं चलता है।

+0

प्रतीक्षा करना सूचित नहीं है कि पहला सबमिट सफल था या नहीं (वर्कफ़्लो के आधार पर दूसरे फॉर्म को सबमिट करने से रोकने की आवश्यकता हो सकती है), न ही दो अनुरोधों की अनुक्रमिक प्रसंस्करण की कोई गारंटी दे रही है (उदाहरण के लिए मैं लेनदेन को स्टोर करना चाहिए यदि पेपैल लेनदेन विफल हो गया है तो डेटाबेस?)। मैंने लिखा वैकल्पिक जवाब देखने के लिए; मैंने वर्कफ़्लो और परिणामों पर अधिक नियंत्रण देने की कोशिश की। – Kamafeather

3

वर्तमान में चुना गया सबसे अच्छा जवाब विश्वसनीय होने के लिए बहुत अस्पष्ट है।

यह एक काफी सुरक्षित तरीका की तरह मेरे लिए लगता है यह करने के लिए:

: बदलते पृष्ठ के बिना (जावास्क्रिप्ट jQuery का उपयोग कर इसे सरल लिखने के लिए)

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

पोस्ट पहला रूप, के लिए इंतजार पूरा करने की प्रक्रिया। फिर दूसरा फॉर्म पोस्ट करें। दूसरी पोस्ट पृष्ठ को बदल देगी, लेकिन आप दूसरे फॉर्म के लिए कुछ समान कोड भी प्राप्त कर सकते हैं, दूसरी स्थगित ऑब्जेक्ट (post_form2?) प्राप्त करना।

हालांकि मैंने कोड का परीक्षण नहीं किया था।

+0

क्यों एक डाउनवोट? अगर मैंने कुछ गलत लिखा तो एक टिप्पणी की सराहना की जाएगी। – Kamafeather

+0

आप 'e1.preventDefault();' और 'e1.stopPropagation();' दोनों का उपयोग क्यों कर रहे हैं। मुझे लगता है कि उनमें से कोई भी पर्याप्त होगा। एफवाईआई मैंने डाउनवोट नहीं किया। यह सिर्फ इतना है कि मैं इस पृष्ठ पर पहुंचा और कुछ संदेह है। –

+0

@dev_khan वे अलग-अलग कार्यक्षमता प्रदान करते हैं, इसलिए, उनमें से कोई भी पर्याप्त नहीं होगा। डिफ़ॉल्ट * सबमिट * को रोकने के लिए, और उस घटना के साथ क्या होगा इसके स्वामित्व को लेने के लिए '' रोकथाम डीफॉल्ट''' निश्चित रूप से आवश्यक है। '' रोकथाम ''' इसके बजाय उपयोग के मामले पर निर्भर करता है, यदि घटना को बाहरी तत्वों से नहीं पकड़ा जाना चाहिए (याद नहीं किया जा सकता है, लेकिन संभवत: पिछले साल मैंने इसे * फ्लाई पर कोडिंग के दौरान- * बस सुरक्षित रहना)। और चिंता न करें मैंने आपको नहीं सोचा था कि आप नीचे आ गए हैं (अभी भी एक भद्दा है कि मुझे यह क्यों मिला), लेकिन इसे निर्दिष्ट करने के लिए धन्यवाद – Kamafeather

संबंधित मुद्दे