2012-08-03 26 views
10

मैं घटनाओं हैंडलर क्लिक elment में जोड़नेप्रतीक्षा पूरा करने के लिए

$(".elem").click(function(){ 
     $.post("page.php".function(){ 
     //code1 
     }) 
}) 

और ट्रिगर क्लिक करें घटना

$(".elem").click(); 
//code2 

मैं कैसे यकीन है कि के बाद code1 कार्यान्वित

+0

कृपया परिभाषित करें कि "कोड 1 निष्पादन" से आपका क्या मतलब है। आपके कोड में AJAX विधि है। तो क्या आपका मतलब है जब AJAX कॉल निष्पादित करता है या AJAX निष्पादित करता है और पूरा करता है? – Rahatur

उत्तर

12

(उपेक्षा कर कि code2 कार्यान्वित करना वेबवर्कर्स) जावास्क्रिप्ट एक थ्रेड पर चलता है, इसलिए आप सुनिश्चित कर सकते हैं कि कोड 2 कोड 1 के बाद हमेशा निष्पादित होगा।

जब तक आपकी code1 एक अजाक्स कॉल या एक setTimeout(), जिस स्थिति में ट्रिगर क्लिक हैंडलर पूरा हो जाएगा की तरह कुछ अतुल्यकालिक करता है, तो code2 अजाक्स कॉल से निष्पादित करेंगे, तो (अंततः) कॉलबैक (या setTimeout(), या जो कुछ भी चलेंगे)

संपादित करें: अपने अपडेट किए गए सवाल, code2 हमेशा की तरह, code1 से पहले निष्पादित करेंगे क्योंकि जैसा कि मैंने एक async ऊपर कहा अजाक्स कॉलबैक बाद में क्या होगा के लिए (भले ही अजाक्स प्रतिक्रिया बहुत तेजी से है, यह कॉलबैक जब तक फोन नहीं होगा वर्तमान जेएस खत्म)।

का उपयोग .click() कोई पैरामीटर वाला .trigger("click") के लिए एक शॉर्टकट है "मैं कैसे यकीन है कि के बाद code1 निष्पादित करता है कि code2 कार्यान्वित करना", लेकिन अगर आप वास्तव में .trigger() फोन स्पष्ट रूप से आप अतिरिक्त पैरामीटर प्रदान कर सकते हैं कि हैंडलर को पास कर दिया जाएगा, जो आपको यह करने देता है:

$(".elem").click(function(e, callback) { 
    $.post("page.php".function(){ 
     //code1 

     if (typeof callback === "function") 
     callback(); 
    }); 
}); 

$(".elem").trigger("click", function() { 
    // code 2 here 
}); 

क्लिक करें हैंडलर परीक्षण के भीतर क्या callback पैरामीटर में कोई फ़ंक्शन पारित किया गया है और यदि ऐसा है तो इसे कॉल करें। इसका मतलब यह है कि जब घटना "स्वाभाविक रूप से" होती है तो कोई कॉलबैक नहीं होगा, लेकिन जब आप इसे प्रोग्रामेटिक रूप से ट्रिगर करते हैं और फ़ंक्शन पास करते हैं तो वह फ़ंक्शन निष्पादित किया जाएगा। (ध्यान दें कि .trigger() के साथ आपके द्वारा पारित पैरामीटर को कोई फ़ंक्शन नहीं होना चाहिए, यह किसी भी प्रकार का डेटा हो सकता है और आप एक से अधिक पैरामीटर पास कर सकते हैं, लेकिन इस उद्देश्य के लिए हम एक फ़ंक्शन चाहते हैं। अधिक जानकारी के लिए .trigger() doco देखें।)

डेमो: http://jsfiddle.net/nnnnnn/ZbRJ7/1/

+2

मुझे नहीं लगता कि यह सच है। वे एक ही समय में निष्पादित नहीं होंगे, लेकिन मुझे विश्वास नहीं है कि डीओएम एपीआई उस आदेश के बारे में कोई गारंटी देता है जिसमें ईवेंट हैंडलर लागू किए जाएंगे। यहां तक ​​कि यदि वे एक ब्राउज़र के एक संस्करण पर सही क्रम में आग लगते हैं, तो इस बात की कोई गारंटी नहीं है कि अन्य मामलों में क्या होगा। –

+0

हाँ मेरे पास AJAX कॉल है [प्रश्न संपादित] –

+0

लोग, ओपी के प्रश्न में केवल एक ईवेंट हैंडलर है। कोड 2 बस इसे ट्रिगर करता है। – JJJ

2

आप इस तरह से लिखने का प्रयास कर सकते हैं:

$(".elem").live("click", function(){ 
    //code1 
}) 

और, आपके ट्रिगर हमेशा की तरह निकाल दिया निष्पादित करेंगे।

2

लपेटें code2 विधि में और code1 तो वह हमेशा code1 के बाद कहा जाता हो जाएगा अंदर एक कॉलबैक के रूप में जोड़ने कार्यान्वित

code2 = function(){/*code2*/}; 
$(".elem").click(function(){ 
    //code1 
    code2(); 
}) 
+0

यह समाधान नहीं है; मैं कोड 2 –

+1

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

+0

आपने कभी इसके बारे में कुछ भी नहीं कहा तो मैंने माना। मुझे शायद स्पष्ट नहीं होने के लिए सवाल कम करना चाहिए, लेकिन मैं ऐसा करने वाला नहीं हूं क्योंकि आप नए हैं। @ जोनासजीरगाट: धन्यवाद। – Gautam

-1

Javascript क्रियान्वयन लाइन द्वारा रेखा है। तो जो कुछ भी आता है, उसे पहले निष्पादित किया जाएगा। तो दूसरी विधि काम करने से पहले क्लिक कोड जोड़ना।

प्लस यदि कोई एसिंक कॉल है, तो एक झंडा लें जो आपको प्रतिक्रिया मिलने पर ही सेट किया जाता है।

var क्लिक किया = झूठा; $ ('# elem')।क्लिक करें (फ़ंक्शन() { // कुछ एसिंक प्रक्रिया करें क्लिक किया गया = सत्य; });

जबकि (! क्लिक किया था) {// कुछ भी नहीं}

// अन्य समारोह

के नाम से जाना या दूसरा विकल्प हो जाएगा, के बाद विधि, संपत्ति में async = true सेट का उपयोग कर सकते हैं।

+2

जबकि (! क्लिक किया गया) {} ब्राउज़र को उत्तरदायी बना देगा .. –

+0

और मुझे लगता है कि दूसरा विकल्प तब तक ऐसा ही करता है जब तक कि पोस्ट अनुरोध पूरा नहीं हो जाता –

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