2010-06-29 22 views
11

देता है क्या उपयोगकर्ता परिभाषित फ़ंक्शन (ex: save()) निष्पादित करने के लिए jQuery के .bind() और .trigger() कॉल का उपयोग करने का कोई तरीका है और वापसी पर कार्य करता है विधि से?एक कस्टम फ़ंक्शन को कॉल करने के लिए jQuery .trigger का उपयोग करें जो एक मान

$("#aForm").bind ('save', function() { 
    return true; 
}); 

और उसके बाद: उदाहरण के लिए:

if ($("#aForm").trigger ('save') == true) { 
    doSomething(); 
} 

उत्तर

3

आप कॉलबैक अपने आप में वापसी मान पर क्यों कार्रवाई नहीं करते? यह अतिरिक्त चेक लेता है (जो काम नहीं करेगा जैसा आप उम्मीद करेंगे)।

$("#aForm").bind ('save', function() { 
    if(some stuff happens that is true) { 
     doSomething(); 
    } 

    else { 
     doSomethingElse(); 
    } 
}); 

कॉलबैक तुल्यकालिक काम नहीं करते। वे उन चीजों को संभालने के लिए उपयोग किए जाते हैं जो असीमित रूप से होते हैं (घटनाओं की तरह)। कॉलबैक के संदर्भ में, वे कोड के टुकड़े होते हैं जो कुछ होता है जब चलते हैं। उनसे लौटने वाले मूल्य वास्तव में समझ में नहीं आता है। आपके उदाहरण में, चूंकि आप कॉलबैक के रिटर्न वैल्यू को देखना चाहते हैं, इसलिए आप सुनिश्चित कर सकते हैं कि केवल कॉलबैक चलाते समय वापसी मूल्य प्राप्त करें (क्योंकि आप उन्हें नियमित फ़ंक्शन की तरह उपयोग करने का प्रयास कर रहे हैं)। उस स्थिति में, उस तर्क को कॉलबैक के अंदर ही रखें (जैसे मैंने ऊपर दिखाया है)।

+0

मैं से बचने के लिए कोशिश कर रहा हूँ ऐसा करने के लिए सरल कारण के लिए कि मेरे पास एक संवाद में कई रूप हैं (प्रत्येक एक अलग टैब में)। मैं संवाद को खुद को "गंदे" ध्वज के आधार पर व्यक्तिगत रूप से प्रत्येक फ़ॉर्म की "सेव" विधि को कॉल करने के लिए संभालना चाहता हूं। यही कारण है कि मैं रूपों से "doSomething()" और "doSomethingElse()" फ़ंक्शंस को संक्षिप्त करने की कोशिश कर रहा हूं - यानी मुख्य संवाद समग्र प्रवाह को संभालता है। मैं बस अपने फॉर्म को सहेजने के लिए प्रत्येक फॉर्म को संभालना चाहता हूं - या अगर डेटा को सहेजते समय कोई त्रुटि उत्पन्न होती है तो झूठी वापसी होती है। क्या .extend() का उपयोग करके प्रत्येक प्रपत्र में कस्टम "सेव" फ़ंक्शन जोड़ना संभव है? – Dave

+0

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

+0

वही नस के साथ, मेरे लिए 'सेव' या 'सेवडाटा' नामक एक नया फ़ंक्शन जोड़ने के लिए संभव नहीं है जैसे कि सत्यापन प्लगइन फॉर्म में एक नई क्षमता जोड़ने के लिए, और फिर उस विधि का उपयोग करने के लिए उस विधि का उपयोग करें डेटा? मैंने प्लगइन नहीं बनाया है, लेकिन यह हासिल करने का और अधिक शानदार तरीका है जो मैं करने की कोशिश कर रहा था, नहीं? – Dave

8

मुझे पता है कि यह प्रश्न पुराना है, लेकिन शायद यह किसी की मदद कर सकता है।

जैसा कि पालीथ ने इंगित किया है, आप एक मूल्य वापस नहीं कर सकते क्योंकि ट्रिगर घटना असीमित है। आप क्या कर सकते हैं, किसी ऑब्जेक्ट को ईवेंट के पैरामीटर के रूप में पास कर दिया गया है। डिफ़ॉल्ट रूप से, जावास्क्रिप्ट ऑब्जेक्ट्स मूल के संदर्भ में हमेशा संदर्भित होते हैं।

उदा .:

बाँध:

$(...).bind('example',function (evt,ret) { 
    ret.val = false; 
}); 

ट्रिगर:

var ret = {ret:true}; 
$(...).trigger('example',[ret]); 
if (!ret.ret) 
    //event return false 
else 
    //event returned true 
+0

क्या यह अजाक्स के साथ काम करेगा? –

+0

संभावितता, हाँ। अगर सही तरीके से उपयोग किया जाता है :) – dmmd

+0

यह नहीं है। आप ईवेंट ट्रिगर को ऑब्जेक्ट (सत्य) का संदर्भ पास करते हैं और इसे ट्रिगर करते हैं। इवेंट हैंडलर एज़ैक्स के साथ वैल्यू एसिंक को झूठी में बदल देता है। मान लें कि AJAX 10secs में पूरा हो जाता है। तो 10 सेकंड में मूल्य गलत हो जाएगा। लेकिन आप इसे ट्रिगर के तुरंत बाद जांचते हैं और आपको सही का गलत मान मिलता है। मुझे उम्मीद है कि मैं स्पष्ट था। –

5

बाहर चेक triggerHandler() है, जो कई अन्य तरीकों से trigger() तरह काम करता है, लेकिन आप एक मूल्य के वापस जाने के लिए अनुमति देगा।

डॉक्स से

:

.triggerHandler() विधि, इसी तरह बर्ताव करता है निम्नलिखित अपवादों के साथ .trigger करने के लिए():

  • .triggerHandler() विधि का कारण नहीं है होने वाली घटना का डिफ़ॉल्ट व्यवहार (जैसे फ़ॉर्म सबमिशन)।
  • जबकि .trigger() jQuery ऑब्जेक्ट से मेल खाने वाले सभी तत्वों पर काम करेगा, .triggerHandler() केवल पहले मिलान किए गए तत्व को प्रभावित करता है।
  • .triggerHandler() के साथ बनाई गई घटनाएं डोम पदानुक्रम को बुलबुला नहीं करती हैं; यदि वे लक्ष्य तत्व द्वारा सीधे नियंत्रित नहीं होते हैं, वे कुछ भी नहीं करते हैं।
  • jQuery ऑब्जेक्ट (चेनिंग की अनुमति देने के लिए) को वापस करने के बजाय, .triggerHandler() देता है जो पिछले हैंडलर द्वारा जो भी मान वापस किया गया था, उसे निष्पादित किया जाता है।कोई संचालकों शुरू हो रहे हैं, तो यह रिटर्न अपरिभाषित
4

तुम भी उपयोग कर सकते हैं jQuery builtin event.preventDefault() और event.isDefaultPrevented():

$("#aForm").bind ('save', function (event) { 
    return true; 
    // "return false" or "event.preventDefault()" have the same effect 
    } 
}); 

और उसके बाद:

var event = $.Event('save') 
$("#aForm").trigger (event) 
if (event.isDefaultPrevented() == false) { 
    doSomething(); 
} 
संबंधित मुद्दे

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