2010-09-07 21 views
5

मैं एक समारोह है कि मैं एक रूप के कई Postbacks को रोकने के लिए उपयोग कर रहा हूँ है:मैं jquery में फॉर्म सबमिट ईवेंट से क्लिक किए गए बटन को कैसे ढूंढ सकता हूं?

var submitted = false; 
$(function() { 
    $('form').bind('submit', function(e) { 
     if (!submitted && CanSubmit(e)) { 
      submitted = true; 
      return true; 
     } else { 
      return false; 
     } 
    }); 
}); 

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

ध्यान दें कि मैं विशिष्ट क्लिक घटनाओं के लिए बाध्य नहीं कर सकते हैं - अधिक जानकारी के लिए this previous question देखते हैं।

Firefox में, मैं e.originalEvent.explicitOriginalTarget उपयोग कर सकते हैं, लेकिन यह जाहिरा तौर पर IE में उपलब्ध नहीं है।

मैं एक क्रॉस-ब्राउज़र रास्ते में e पैरामीटर से यह मान कैसे मिल सकता है?

+0

CanSubmit एक सत्यापन समारोह में कार्य है? आपको परवाह क्यों है कि बटन दबाया गया था? क्या आपके पास किसी दिए गए फॉर्म पर एक से अधिक बटन हैं? – Scott

+0

नहीं, आखिरकार यह निर्धारित करने के लिए एक फ़ंक्शन है कि कौन सा बटन दबाया गया था। मुझे परवाह है क्योंकि कुछ बटन ठीक पदों (रद्द, घर इत्यादि) का कारण बनते हैं, जबकि अन्य ऐसे पदों का कारण बनते हैं जो सबमिट नहीं करते हैं (सबमिट, संपादित करें, आदि)। और हाँ, मेरे पास फॉर्म पर एक से अधिक बटन हैं। – Damovisa

उत्तर

2

वास्तव में आप सिर्फ $(':submit').bind('click' साथ $('form').bind('submit' की जगह कर सकते हैं और अपने कोड बस के रूप में अच्छी तरह से काम करेगा (और आप this इस्तेमाल कर सकते हैं देखने के लिए क्या क्लिक किया गया था)।

+0

सवाल कहता है: * "ध्यान दें कि मैं विशिष्ट क्लिक ईवेंट के लिए बाध्य नहीं कर सकता" * – user113716

+0

यह सही है - बटन के लिए बाध्य हो जाती है कि यह केवल बटन उस रूप के कारण कर रहे हैं प्रस्तुत – Damovisa

+0

@Damovisa, हाँ, और यह एक सही धारणा है । केवल सबमिट बटन सबमिट करने के लिए एक फॉर्म (या जावास्क्रिप्ट सबमिट() कॉल कर सकते हैं, लेकिन संभवतः आप उन लोगों के नियंत्रण में हैं)। उनके लिए सही चयनकर्ता 'सबमिट करें' है, नहीं 'बटन', हालांकि - मैंने इसे ठीक किया है। – Tgr

2

क्रॉस ब्राउज़र स्थिरता के लिए e.target - jQuery normalizes it का उपयोग करें।

explicitOriginalTarget के लिए सबसे नज़दीकी चीज़ जो मुझे मिल सकती है document.activeElement (आईई के लिए) - यह वह तत्व है जिसने घटना के दौरान ध्यान केंद्रित किया था। वेबकिट आधारित ब्राउज़र के लिए कोई समकक्ष नहीं है। तो नहीं, केवल ईवेंट ऑब्जेक्ट के साथ ऐसा करने के लिए कोई वास्तविक क्रॉस ब्राउज़र तरीका नहीं है।

+0

'सबमिट()' हैंडलर में, 'e.target''

' का संदर्भ देगा जब भी आप सबमिट बटन पर क्लिक करेंगे। यहां एक उदाहरण दिया गया है: http://jsfiddle.net/zHbrC/ – user113716

+0

@ पैट्रिक dw: धन्यवाद, मैं बस इसका परीक्षण कर रहा था।मुझे लगता है कि घटना वास्तव में सबमिट बटन से नहीं निकाल दी गई है। –

2

जब आप सबमिट करते हैं तो सबमिट फ़ंक्शन को अनइंड क्यों नहीं करते? यह होगा की गारंटी देता है केवल एक ही प्रस्तुत:

$(function() { 
    $('form').bind('submit', function(event) { 
      // regular submit form stuff here 
     ... 
      // and unbind it 
     $('this').unbind(event);  
    }); 
}); 

चेकआउट .unbind() के तहत,

या "घटना वस्तु का उपयोग करना", के रूप में मैट गेंद टिप्पणी में कहा, आप .one() उपयोग कर सकते हैं, जो उपरोक्त के बराबर।

$(function() { 
    $('form').one('submit', function(event) {   // <== Only executed once 
      // regular submit form stuff here 
     ... 
    }); 
}); 

आप प्रपत्र कई घटनाओं/तत्वों के लिए बाध्य की $.post() या $.get() प्रस्तुत है, तो आप बस संचालक कि समाप्त होता है event वस्तु का उपयोग कर के भीतर ही से इस्तेमाल किया जा रहा निकल करने के लिए सुनिश्चित करने के लिए है, और फिर अन्य सभी हैंडलरों को भी बाध्य करें, और इन अन्य हैंडलरों में से प्रत्येक के विपरीत। आप one of about four methods to unbind event handlers का उपयोग कर अन्य हैंडलर को अनबाइंड कर सकते हैं।

+0

एक ईवेंट हैंडलर निष्पादन की गारंटी देने का एक बेहतर तरीका: ['jQuery.one()'] (http://api.jquery.com/one)। –

+0

@ मैट - अच्छा सुझाव। यह सुनिश्चित नहीं है कि यह बेहतर कैसे है, वे '.one() 'दस्तावेज़ के अनुसार समकक्ष हैं। –

+0

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

0

.one समारोह का उपयोग क्यों नहीं, यह केवल एक बार आग की गारंटी देता है।

$(function() { 
    $('form').one('submit', function(event) { 
     // regular submit form stuff here  
    }); 
}); 
+0

हम्म, एक अच्छा विचार है, लेकिन मुझे लगता है कि यह मेरी आवश्यकता के विपरीत हो सकता है - फ़ॉर्म तब तक सबमिट नहीं करेगा जब तक कि मैं इसे रोकूं, इसलिए मुझे पहली बार * को छोड़कर * फ़ंक्शन चलाने की आवश्यकता होगी। – Damovisa

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