कभी-कभी जब प्रतिक्रिया धीमी होती है, तो व्यक्ति कई बार सबमिट बटन पर क्लिक कर सकता है।
इसे कैसे रोका जाए?
कभी-कभी जब प्रतिक्रिया धीमी होती है, तो व्यक्ति कई बार सबमिट बटन पर क्लिक कर सकता है।
इसे कैसे रोका जाए?
जवाबों:
फॉर्म जमा होने के बाद पहले से ही जमा करने के लिए विनीत जावास्क्रिप्ट का उपयोग करें। यहाँ jQuery का उपयोग करके एक उदाहरण दिया गया है।
संपादित करें: सबमिट बटन पर क्लिक किए बिना फॉर्म सबमिट करने के साथ फिक्स्ड समस्या। धन्यवाद, ichiban।
$("body").on("submit", "form", function() {
$(this).submit(function() {
return false;
});
return true;
});
return true
? मुझे लगता है कि आरंभिक जमा को इसके बिना काम करना चाहिए।
return true
है कि छोड़ दिया गया है तो निहित है।
$(this).find("input[type='submit']").attr('disabled', 'disabled').val('submiting'); return true; });
मैंने एस्पेस्ट पीवीसी 3 विनीत सत्यापन के साथ वैनस्टी के समाधान की कोशिश की , और यदि क्लाइंट सत्यापन विफल रहता है, तो कोड अभी भी चलाया जाता है, और फॉर्म सबमिट अच्छे के लिए अक्षम है। मैं खेतों को सही करने के बाद फिर से जमा करने में सक्षम नहीं हूं। (देखें भजन की टिप्पणी)
इसलिए मैंने इस तरह से वैनस्टी की स्क्रिप्ट को संशोधित किया:
$("form").submit(function () {
if ($(this).valid()) {
$(this).submit(function () {
return false;
});
return true;
}
else {
return false;
}
});
क्लाइंट साइड फॉर्म सबमिशन कंट्रोल को बहुत ही शिष्टता से प्राप्त किया जा सकता है, ताकि ऑनसुमिट हैंडलर सबमिट बटन को छिपा सके और उसे लोडिंग एनीमेशन से बदल सके। इस तरह से उपयोगकर्ता को उसी स्थान पर तत्काल दृश्य प्रतिक्रिया मिलती है जहां उसका एक्शन (क्लिक) हुआ था। उसी समय आप फ़ॉर्म को दूसरी बार सबमिट करने से रोकते हैं।
यदि आप XHR के माध्यम से फॉर्म जमा करते हैं, तो ध्यान रखें कि आपको जमा करने की त्रुटियों को भी संभालना होगा, उदाहरण के लिए टाइमआउट। आपको फिर से सबमिट बटन प्रदर्शित करना होगा क्योंकि उपयोगकर्ता को फॉर्म को फिर से सबमिट करना होगा।
एक अन्य नोट पर, लिलिम्बिब एक बहुत ही मान्य बिंदु लाता है। सभी फॉर्म सत्यापन सर्वर साइड होने चाहिए। इसमें कई सबमिशन चेक शामिल हैं। ग्राहक पर कभी भरोसा न करें! यह केवल एक मामला नहीं है यदि जावास्क्रिप्ट अक्षम है। आपको यह ध्यान रखना होगा कि सभी क्लाइंट साइड कोड को संशोधित किया जा सकता है। यह कल्पना करना थोड़ा मुश्किल है लेकिन आपके सर्वर से बात कर रहा html / जावास्क्रिप्ट आपके द्वारा लिखे गए HTML / जावास्क्रिप्ट जरूरी नहीं है।
जैसा कि लिलिम्लिब सुझाव देता है, एक पहचानकर्ता के साथ फ़ॉर्म उत्पन्न करें जो उस फॉर्म के लिए अद्वितीय है और इसे एक छिपे हुए इनपुट फ़ील्ड में डाल दिया गया है। उस पहचानकर्ता को स्टोर करें। फॉर्म डेटा प्राप्त करते समय पहचानकर्ता से मेल खाने पर ही इसे संसाधित करें। (पहचानकर्ता को उपयोगकर्ताओं के सत्र से जोड़ना और अतिरिक्त सुरक्षा के लिए, साथ ही साथ मिलान करना।) डेटा प्रोसेसिंग के बाद पहचानकर्ता को हटा दें।
बेशक, एक बार में, आपको पहचानकर्ताओं को साफ करना होगा जिसके लिए कभी भी कोई फॉर्म डेटा जमा नहीं किया गया था। लेकिन सबसे शायद आपकी वेबसाइट पहले से ही "कचरा संग्रह" तंत्र के कुछ प्रकारों को नियुक्त करती है।
<form onsubmit="if(submitted) return false; submitted = true; return true">
<form onsubmit="return (typeof submitted == 'undefined') ? (submitted = true) : !submitted">
, या लिखें :। var submitted = false;
Uncaught ReferenceError: submitted is not defined
यहाँ यह करने का सरल तरीका है:
<form onsubmit="return checkBeforeSubmit()">
some input:<input type="text">
<input type="submit" value="submit" />
</form>
<script type="text/javascript">
var wasSubmitted = false;
function checkBeforeSubmit(){
if(!wasSubmitted) {
wasSubmitted = true;
return wasSubmitted;
}
return false;
}
</script>
क्लिक के तुरंत बाद सबमिट बटन को अक्षम करें। सुनिश्चित करें कि आप मान्यताओं को ठीक से संभालते हैं। सभी प्रसंस्करण या डीबी संचालन के लिए एक मध्यवर्ती पृष्ठ भी रखें और फिर अगले पृष्ठ पर पुनर्निर्देशित करें। यह सुनिश्चित करता है कि दूसरे पेज को रिफ्रेश करने से कोई और प्रोसेसिंग नहीं होती है।
form page ---submits to---> form_submission_script.php ---after saving, redirects to---> form_thankyou.html
वर्तमान समय को हैश करें, इसे प्रपत्र पर एक छिपा हुआ इनपुट बनाएं। सर्वर की तरफ, प्रत्येक फॉर्म सबमिशन के हैश की जांच करें; यदि आप पहले से ही उस हैश को प्राप्त कर चुके हैं तो आपको एक रिपीट सबमिशन मिल गया है।
संपादित करें: जावास्क्रिप्ट पर भरोसा करना एक अच्छा विचार नहीं है, इसलिए आप सभी उन विचारों को बनाए रख सकते हैं, लेकिन कुछ उपयोगकर्ताओं ने आपको सक्षम नहीं किया है। सही उत्तर सर्वर साइड पर उपयोगकर्ता इनपुट पर भरोसा नहीं करना है।
आप यह इंगित करने के लिए कि प्रगति संसाधन है, आप एक प्रगति पट्टी या एक स्पिनर भी प्रदर्शित कर सकते हैं।
JQuery का उपयोग करके आप कर सकते हैं:
$('input:submit').click( function() { this.disabled = true } );
और
$('input:submit').keypress( function(e) {
if (e.which == 13) {
this.disabled = true
}
}
);
मुझे पता है कि आपने 'जावास्क्रिप्ट' के साथ अपने प्रश्न को टैग किया था, लेकिन यहां एक समाधान है जो जावास्क्रिप्ट पर बिल्कुल भी निर्भर नहीं करता है:
यह PRG नाम का एक वेबप पैटर्न है , और यहाँ एक अच्छा लेख है जो इसका वर्णन करता है
आप बस इसके साथ कई जमा रोक सकते हैं:
var Workin = false;
$('form').submit(function()
{
if(Workin) return false;
Workin =true;
// codes here.
// Once you finish turn the Workin variable into false
// to enable the submit event again
Workin = false;
});
Workin =true;
। डबल सबमिट अभी भी संभव हैं, लेकिन कम होने की संभावना है।
इस प्रश्न का सबसे सरल उत्तर जैसा कि पूछा गया है: "कभी-कभी जब प्रतिक्रिया धीमी होती है, तो व्यक्ति कई बार सबमिट बटन पर क्लिक कर सकता है। इसे होने से कैसे रोकें?"
बस नीचे दिए गए कोड की तरह फ़ॉर्म सबमिट बटन को अक्षम करें।
<form ... onsubmit="buttonName.disabled=true; return true;">
<input type="submit" name="buttonName" value="Submit">
</form>
यह सबमिट बटन को अक्षम करेगा, सबमिट करने के लिए पहले क्लिक करें। इसके अलावा यदि आपके पास कुछ सत्यापन नियम हैं, तो यह ठीक काम करेगा। आशा है कि यह मदद करेगा।
क्लाइंट साइड पर , आपको सबमिट बटन को एक बार निष्क्रिय कर देना चाहिए क्योंकि फॉर्म को जावास्क्रिप्ट कोड के साथ सबमिट किया जाता है जैसे @vanstee और @chaos द्वारा प्रदान की गई विधि।
लेकिन नेटवर्क लैग या जावास्क्रिप्ट-अक्षम स्थिति के लिए एक समस्या है जहां आपको ऐसा करने से रोकने के लिए JS पर भरोसा नहीं करना चाहिए।
तो, सर्वर-साइड पर , आपको एक ही क्लाइंट से बार-बार सबमिशन की जांच करनी चाहिए और उस दोहराया को छोड़ देना चाहिए जो उपयोगकर्ता की झूठी कोशिश लगती है।
आप सुरक्षित jquery प्लगइन की कोशिश कर सकते हैं ।
$('#example').safeform({
timeout: 5000, // disable form on 5 sec. after submit
submit: function(event) {
// put here validation and ajax stuff...
// no need to wait for timeout, re-enable the form ASAP
$(this).safeform('complete');
return false;
}
})
मेरे लिए सबसे सरल और सुरुचिपूर्ण समाधान:
function checkForm(form) // Submit button clicked
{
form.myButton.disabled = true;
form.myButton.value = "Please wait...";
return true;
}
<form method="POST" action="..." onsubmit="return checkForm(this);">
...
<input type="submit" name="myButton" value="Submit">
</form>
यह हर 2 सेकंड सबमिट करने की अनुमति देता है। सामने सत्यापन के मामले में।
$(document).ready(function() {
$('form[debounce]').submit(function(e) {
const submiting = !!$(this).data('submiting');
if(!submiting) {
$(this).data('submiting', true);
setTimeout(() => {
$(this).data('submiting', false);
}, 2000);
return true;
}
e.preventDefault();
return false;
});
})
कई को प्रस्तुत करने से रोकने का सबसे अच्छा तरीका यह है कि विधि में बटन आईडी पास करें।
function DisableButton() {
document.getElementById("btnPostJob").disabled = true;
}
window.onbeforeunload = DisableButton;
जावास्क्रिप्ट का उपयोग करना थोड़ा आसान है। निम्नलिखित कोड है जो वांछित कार्यक्षमता देगा:
$('#disable').on('click', function(){
$('#disable').attr("disabled", true);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="disable">Disable Me!</button>
सबसे सरल समाधान यह है कि क्लिक पर बटन को अक्षम करें, ऑपरेशन पूरा होने के बाद इसे सक्षम करें। Jsfiddle पर समान समाधान की जांच करने के लिए:
[click here][1]
और आप इस जवाब पर कुछ अन्य समाधान पा सकते हैं ।
यह मेरे लिए बहुत अच्छा काम करता है। यह खेत को सबमिट करता है और बटन को निष्क्रिय करता है और 2 सेकंड के बाद बटन को सक्रिय करता है।
<button id="submit" type="submit" onclick="submitLimit()">Yes</button>
function submitLimit() {
var btn = document.getElementById('submit')
setTimeout(function() {
btn.setAttribute('disabled', 'disabled');
}, 1);
setTimeout(function() {
btn.removeAttribute('disabled');
}, 2000);}
ECMA6 सिंटेक्स में
function submitLimit() {
submitBtn = document.getElementById('submit');
setTimeout(() => { submitBtn.setAttribute('disabled', 'disabled') }, 1);
setTimeout(() => { submitBtn.removeAttribute('disabled') }, 4000);}
इससे पहले जो प्रस्तावित किया गया था, उसका एक विकल्प:
jQuery('form').submit(function(){
$(this).find(':submit').attr( 'disabled','disabled' );
//the rest of your code
});