2010-05-07 13 views
11

पृष्ठभूमि: हम पंजीकरण/भुगतान पृष्ठ लिखने की प्रक्रिया में हैं, और हमारा दर्शन पहले सर्वर की तरफ सभी सत्यापन और त्रुटि जांच को कोड करना था, और फिर ग्राहक जोड़ें दूसरी चरण (अन-अवरोधक jQuery) के रूप में साइड सत्यापन।क्या आधुनिक ब्राउज़र में फॉर्म पोस्ट व्यवहार बदल गया है? (या ब्राउजर द्वारा डबल क्लिक कैसे किए जाते हैं)

हम डबल क्लिक सर्वर पक्ष को अक्षम करना चाहते थे, इसलिए हमने एक साथ पोस्ट/रेस स्थितियों को संभालने के लिए कुछ लॉकिंग, थ्रेड-सुरक्षित कोड लिखा था। जब हमने इसका परीक्षण करने की कोशिश की, तो हमें एहसास हुआ कि हम एक साथ पोस्ट या दौड़ की स्थिति उत्पन्न नहीं कर पाएंगे।

मैंने सोचा था कि (पुराने ब्राउज़र में वैसे भी) डबल क्लिक करके एक सबमिट बटन पर इस प्रकार के रूप में काम:

  • उपयोगकर्ता पर दो बार क्लिक बटन सबमिट करें।
  • ब्राउज़र पहली पर एक पोस्ट क्लिक
  • दूसरे पर क्लिक करने पर भेजता है, ब्राउज़र को रद्द करता/आरंभिक पोस्ट पर ध्यान नहीं देता, और एक दूसरे के बाद शुरू की (पहले पहली पोस्ट एक प्रतिक्रिया के साथ वापस आ गया है)।
  • ब्राउज़र प्रारंभिक पोस्ट प्रतिक्रिया को अनदेखा करते हुए, लौटने के लिए दूसरी पोस्ट के लिए प्रतीक्षा करता है।

मैंने सोचा था कि सर्वर साइड से इसे इस तरह देखा: सर्वर, दो एक साथ पोस्ट अनुरोध हो जाता है निष्पादित करता है और उन दोनों का जवाब (अनजान है कि कोई भी पहली प्रतिक्रिया सुन रहा है)।

हमारे परीक्षण (फ़ायरफ़ॉक्स 3.0, IE 8.0) से यह है कि क्या वास्तव में होता है:

  • उपयोगकर्ता पर दो बार क्लिक सबमिट बटन
  • ब्राउज़र पहली क्लिक
  • ब्राउज़र के लिए एक पोस्ट भेजता है दूसरे क्लिक पर कतार, लेकिन पहले क्लिक से प्रतिक्रिया के लिए इंतजार कर रहा है।
  • प्रतिक्रिया पहले क्लिक से लौटती है (प्रतिक्रिया को अनदेखा किया जाता है?)।
  • ब्राउज़र दूसरे क्लिक के लिए एक पोस्ट भेजता है।

तो एक सर्वर साइड से: सर्वर एक भी पद जो इसे कार्यान्वित और का जवाब प्राप्त करता है। फिर, सर्वर को दूसरा अनुरोध प्राप्त होता है जिसमें यह निष्पादित होता है और प्रतिक्रिया देता है।

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

ऐसा लगता है कि सर्वर की ओर से डबल क्लिक रोकथाम के लिए, हमें एक साथ पोस्ट या दौड़ की स्थिति के बारे में चिंता करने की ज़रूरत नहीं है। केवल कतारबद्ध पदों के बारे में चिंता करने की आवश्यकता है।

किसी भी प्रतिक्रिया/टिप्पणियों के लिए अग्रिम धन्यवाद।

एलेक्स

+1

+1 शानदार स्पष्ट प्रश्न, और उपयोगकर्ता कार्रवाई आरेख देखना दिलचस्प है। मुझे जवाब का यकीन नहीं है, लेकिन आम तौर पर चीजें * दो से अधिक क्लिक को सम्मानित करने के बजाय जा रही हैं - पुराने, डेस्कटॉप-केंद्रित प्रतिमान होने पर डबल-क्लिक करना। –

+0

अद्यतन: व्यवहार IE8 के लिए अलग दिखता है (एकाधिक एक साथ पोस्ट सर्वर पर) और एफएफ/क्रोम (एकाधिक क्लिक कतार)। हम अधिक निष्कर्ष पोस्ट करेंगे क्योंकि हम अधिक परीक्षण करते हैं। –

उत्तर

0

जब तक अनुरोध, अपने को जोड़ने या चरण भेजने, पहले जमा करते समय प्रस्तुत पर क्लिक में है अनुरोध को रद्द करता है, सर्वर 'जानने' के बिना एक नया एक शुरू।

+0

यह IE8 के साथ मामला प्रतीत होता है, लेकिन क्रोम या फ़ायरफ़ॉक्स के साथ नहीं। –

1

यह एक बेवकूफ प्रतिक्रिया हो सकती है, लेकिन आप क्लिक पर जावास्क्रिप्ट के साथ सबमिट बटन को अक्षम क्यों नहीं करते हैं, इसलिए आपको एकाधिक क्लिक के बारे में चिंता करने की ज़रूरत नहीं है। मैं आमतौर पर इसे बनाने वाले अधिकांश रूपों पर करता हूं और यह समस्या को हल करने लगता है।

आपने पहले ही कहा है कि आप जावास्क्रिप्ट का उपयोग कर रहे हैं ताकि समस्या सही न हो?

+0

रणनीति पहले सर्वर की ओर सभी सत्यापन/चेक करने के लिए है। एक बार यह काम कर रहा है, तो हम क्लाइंट साइड चेक लागू करेंगे। यह सुनिश्चित करता है कि अगर कोई अपनी जावास्क्रिप्ट को अक्षम करता है, या क्लाइंट साइड त्रुटि उत्पन्न होती है, तो भी एप्लिकेशन ठीक से काम करेगा। मैं मानता हूं, क्लाइंट साइड सॉल्यूशन लगभग मामूली है, लेकिन हम यह सुनिश्चित करना चाहते हैं कि हमारा ऐप भी सर्वर की तरफ रॉक ठोस हो। –

3

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

जब ट्रेन सुरंग से बाहर आती है, तो उपयोगकर्ता नहीं जानता कि उनका लेनदेन सफल हुआ या नहीं - उन्होंने बटन दबाया, लेकिन पृष्ठ पर कुछ भी नहीं बदला (या शायद उन्हें "पुनः प्रयास करें" पृष्ठ मिला)। उनके लिए प्राकृतिक चीज फिर से सबमिट करें (या "पुनः प्रयास करें" बटन पर क्लिक करें)।

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

फिर जब आप कोई पोस्ट प्राप्त करते हैं, तो जांचें कि क्या यह लेनदेन पहले ही देखा जा चुका है - और यदि यह है, तो सीधे स्थिति पृष्ठ पर जाएं। मोटे तौर पर: (! बशर्ते आप एक डेटाबेस है जो ठीक से लेन-देन का समर्थन करता है है - और के बाद से आप भुगतान संसाधित कर रहे हैं मुझे आशा है कि आप करते हैं)

BEGIN TRANSACTION 

SELECT * 
FROM completedTransactions 
WHERE userId = ... AND transactionId = ... 

<if we got a result - display results of previous transaction> 

<otherwise - process the request as normal> 

INSERT INTO completedTransactions (userId, transactionId) 
VALUES (....) 

END TRANSACTION 

यह लाभ यह है कि है आप सूत्रण किसी भी प्रकार का क्या करने की जरूरत नहीं है या लॉकिंग - चीज़ें "बस काम करें"।

(हालांकि सावधान रहना होगा - कुछ डाटाबेस सिस्टम मनमाने ढंग से अपने लेनदेन को निरस्त कर सकते हैं, अगर वहाँ एक संगामिति समस्या है - लेकिन इस (दुर्लभ) स्थिति को आसानी से एक पुनः प्रयास पाश का उपयोग कर के साथ निपटा है ...)

डबल परीक्षण करने के लिए के रूप में ब्राउज़र से क्लिक: यदि आप दो "सबमिट" क्लिक के बीच "स्टॉप" बटन दबाते हैं तो इससे कोई फर्क पड़ता है?

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