2011-10-11 11 views
35

यह प्रश्न jQuery प्लगइन्स और अन्य स्वयं निहित जावास्क्रिप्ट स्निपेट विकसित करने के प्रयोजनों के लिए है, जिन्हें संगतता के लिए अन्य स्क्रिप्ट फ़ाइलों को संशोधित करने की आवश्यकता नहीं है।event.preventDefault() को कॉल करने के बाद एक डिफ़ॉल्ट कार्रवाई का आह्वान करने के लिए एक [सार्वभौमिक] तरीका है?

हम सभी जानते हैं कि event.preventDefault() डिफ़ॉल्ट ईवेंट को रोक देगा ताकि हम एक कस्टम फ़ंक्शन चला सकें। लेकिन क्या होगा यदि हम इसे देरी से पहले डिफ़ॉल्ट ईवेंट करना चाहते हैं तो क्या होगा? मैंने डिफ़ॉल्ट कार्रवाई को दोबारा शुरू करने के लिए विभिन्न, केस-विशिष्ट निंजा चाल और कामकाज देखा है, लेकिन जैसा कि मैंने कहा, मेरी रुचि डिफ़ॉल्ट रूप से फिर से ट्रिगर करने के लिए सार्वभौमिक तरीके से है, और किसी मामले पर डिफ़ॉल्ट ट्रिगर्स से निपटने के लिए नहीं है- मामले के आधार पर।

$(submitButton).click(function (e) { 

    e.preventDefault(); 

    // Do custom code here. 

    e.invokeDefault(); // Imaginary... :(
}); 

फॉर्म सबमिशन के रूप में सरल कुछ भी के लिए, कोई सार्वभौमिक उत्तर नहीं लगता है। $(selector).closest("form").submit() वर्कअराउंड मानता है कि डिफ़ॉल्ट क्रिया मानक फॉर्म सबमिशन है, और ASP.NET में __doPostBack() फ़ंक्शन की तरह कुछ बेकार नहीं है।

$(submitButton).click(function (e) { 

    e.preventDefault(); 

    // Do custom code here. 

    var javascriptCommand = e.currentTarget.attributes.href.nodeValue; 
    evalLinkJs(javascriptCommand); 
}); 


function evalLinkJs(link) { 
    // Eat it, Crockford. :) 
    eval(link.replace(/^javascript:/g, "")); 
} 

मुझे लगता है मैं संभाल करने के लिए विशेष मामलों लेखन शुरू कर सकता है लगता है: लागू ASP.NET कॉलबैक के अंत करने के लिए, यह सबसे करीब मैं एक सार्वभौमिक, सेट-यह और भूल जाते हैं, यह समाधान पर आए हैं है window.location के साथ सामान्य लिंक रीडायरेक्ट करते हैं, लेकिन फिर हम कीड़े का एक नया नया खोल खोल रहे हैं - डिफ़ॉल्ट घटना आमंत्रण के लिए अधिक से अधिक मामलों पर पिलिंग समाधान से अधिक समस्याएं पैदा करता है।

तो इसके बारे में कैसे? जादू बुलेट किसके लिए खोज रहा है?

+1

मैं वास्तव में आप क्या करने की कोशिश कर रहे हैं क्या नहीं मिल ... घटना नहीं है है हैंडलर कोड रन * से पहले * डिफ़ॉल्ट कार्रवाई होती है (उदाहरण के लिए 'सबमिट' ईवेंट हैंडलर का कोड वास्तव में सबमिट किए जाने से पहले चलाएगा ... क्या वह नहीं है जिसे आप प्राप्त करने का प्रयास कर रहे हैं?) –

+2

क्या आपका कस्टम कोड असीमित है? यह समझा सकता है कि आपको ऐसा क्यों लगता है कि आपको ऐसी विधि की आवश्यकता है, लेकिन यह काल्पनिक तरीका भी आपकी समस्या का समाधान नहीं करेगा। – agradl

+1

आपको निश्चित रूप से अपनी इच्छित चीज़ों के बारे में अधिक स्पष्ट होने की आवश्यकता है। यदि आप हैंडलर के भीतर कोड चलाने के लिए चाहते हैं, तो वह कोड "डिफ़ॉल्ट" व्यवहार से पहले चलता है। –

उत्तर

8

इस एक पर एक नज़र डालें: How to trigger event in JavaScript? और jQuery घटना संदर्भ: http://api.jquery.com/category/events/event-object/

टैग घटना वस्तु आप इसलिए यदि आप प्राप्त

आप इस उत्तर का उपयोग करना की कोशिश कर सकते

if(!event.mySecretVariableName) { 
    event.preventDefault(); 
} else { 
    return; // do nothing, let the event go 
} 

// your handling code goes here 
event.originalEvent.mySecretVariableName = "i handled it"; 

if (document.createEvent) { 
    this.dispatchEvent(event.originalEvent); 
} else { 
    this.fireEvent(event.originalEvent.eventType, event.originalEvent); 
} 

इसे फिर से प्राप्त करें आप लूप नहीं करते हैं।

1

यह संभव नहीं है कि जामवाफल्स पहले ही साबित हो चुका है। सरल स्पष्टीकरण यह असंभव क्यों है: यदि आप डिफ़ॉल्ट कार्रवाई को फिर से ट्रिगर करते हैं तो आपका ईवेंट श्रोता फिर से अवरुद्ध हो जाता है और आपके पास अनंत लूप होता है।

और यह

click(function (e) { 
    e.preventDefault(); 
    // Do custom code here. 
    e.invokeDefault(); // Imaginary... :(
}); 

इस तरह एक ही (अपने काल्पनिक समारोह के साथ) है।

click(function (e) { 
    // Do custom code here. 
}); 

ऐसा लगता है कि आप अपने क्लिक किए गए तत्व के यूआरएल में हेरफेर करना चाहते हैं। यदि आप ऐसा करते हैं तो यह ठीक काम करता है। Example

5

पहले स्थान पर preventDefault() पर कॉल न करें। फिर आपके ईवेंट हैंडलर के बाद डिफ़ॉल्ट कार्रवाई होगी।

+9

यह है जब तक आपको अपने कस्टम हैंडलिंग के बाद असीमित रूप से डिफ़ॉल्ट हैंडलिंग करने की आवश्यकता नहीं है तब तक सही उत्तर दें। – Jacob

4

यह काम करना चाहिए। मैंने केवल फ़ायरफ़ॉक्स में परीक्षण किया है।

<html> 
<head> 
<script> 
    window.addEventListener("click",handleClick,false); 
    function handleClick(e){ 
     if (e.useDefault != true){ 
      alert("we're preventing"); 
      e.preventDefault(); 
      alert(e.screenX); 
      //Firing the regular action 
      var evt = document.createEvent("HTMLEvents"); 
      evt.initEvent(e.type,e.bubbles,e.cancelable); 
      evt["useDefault"] = true; 
      //Add other "e" attributes like screenX, pageX, etc... 
      this.dispatchEvent(evt); 
     } 
     else{ 
      alert("we're not preventing"); 
     } 
    } 
</script> 
</head> 
<body> 

</body> 
</html> 

बेशक, आपको सभी पुराने ईवेंट वैरिएबल विशेषताओं पर भी प्रतिलिपि बनाना होगा। मैंने अभी उस भाग को कोड नहीं किया है, लेकिन यह काफी आसान होना चाहिए।

+2

+1 यह सही दृष्टिकोण है। आपको सही प्रकार की घटना बनाने का प्रयास करना चाहिए - https://developer.mozilla.org/en-US/docs/DOM/document.createEvent देखें – chowey

0

मैं क्लिक करने के बाद एक बटन को निष्क्रिय करने के लिए और फिर डिफ़ॉल्ट ईवेंट को सक्रिय की जरूरत है, यह मेरा समाधान है

$(document).on('click', '.disabled-after-submit', function(event) { 
    event.preventDefault(); 
    $(event.currentTarget).addClass('disabled'); 
    $(event.currentTarget).removeClass('disabled-after-submit'); 
    $(event.currentTarget).click(); 
    $(event.currentTarget).prop('disabled', true); 
}); 
संबंधित मुद्दे

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