2011-02-28 17 views
14

मेरे पास एक इनपुट फ़ील्ड है, जिसमें दो इवेंट हैंडलर हैं।जावास्क्रिप्ट इवेंट हैंडलर ऑर्डर

मान्य & स्वत: सहेजना

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

यह काफी अच्छी तरह से काम करता है, लेकिन क्या सभी मामलों में ऑटोसव से पहले वैलीडेट रन की गारंटी देने का कोई तरीका है?

उत्तर

12

यदि आप अपनी घटनाओं को बाध्य करने के लिए JQuery का उपयोग करते हैं, तो यह गारंटी देता है कि हैंडलर को उसी क्रम में निकाल दिया गया है, जो वे बाध्य थे। अन्यथा आदेश आधिकारिक रूप से अपरिभाषित है।

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

2

क्यों न केवल एक हैंडलर संलग्न करें - Validate - और इसके अंदर से AutoSave पर कॉल करें?

आपके प्रश्न के उत्तर के लिए यह भी एक प्रश्न नहीं है, this post या this one या this one देखें।

+4

क्योंकि वे अलग-अलग मॉड्यूल का प्रतिनिधित्व करते हैं, जो एक साथ हो सकते हैं या नहीं भी हो सकते हैं। उन्हें एक एकल फ़ंक्शन (जो स्पष्ट है) के रूप में लिखना कोड को युग्मित करने का प्रभाव है। –

+2

मैं असहमत हूं। वे * युग्मित हैं, जैसा कि इस तथ्य से प्रमाणित है कि आप चाहते हैं कि कोई अन्य रनों के बाद ही हो। उन्हें एक फ़ंक्शन में एक साथ रखना * उस युग्मन को * बनाना * नहीं बनाता है। यह इसे स्वीकार करता है। (दूसरा, सिर्फ इसलिए कि आप उन्हें कुछ फ़ंक्शन के अंदर बुलाते हैं, इसका मतलब यह नहीं है कि उन्हें हमेशा * इस तरह से बुलाया जाना चाहिए। वे प्रत्येक को अभी भी ऐसे तरीके से लिखे जा सकते हैं जो उनकी आजादी को बरकरार रखे।) –

+0

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

8

आम तौर पर आपके पास सहेजें ईवेंट हैंडलर कॉल मान्य() है जो सब ठीक है और सहेजा जाने के लिए तैयार होने पर सत्य वापस आ जाएगा।

function onSaved() { 
    if (!validate()) { 
    // set class 
    return; 
    } 

    // do the save 
} 
0

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

ध्यान दें कि स्थिति एक समान है जब एक डॉम ऑब्जेक्ट के लिए इवेंट हैंडलर होता है और दूसरा बच्चा या माता-पिता के लिए एक ही घटना के लिए होता है - उनमें से कौन सा निष्पादित होता है, हमेशा पहले भी स्पष्ट नहीं होता है। http://www.quirksmode.org/js/events_order.html

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