Dojo

2010-10-02 4 views
6

के साथ फॉर्म सबमिशन को रोकना मेरे पास jsId = "saveParamButtonWidget" के साथ एक Dojo सबमिट बटन है। मैं डालकर अपनी onClick विधि overrided:Dojo

saveParamButtonWidget.onClick = editParam 

मैं परिभाषित इस तरह editParam() फ़ंक्शन:

function editParam(eventObj) { 
    dojo.stopEvent(eventObj); 
    // ... 
} 

dojo.stopEvent() घटना बुदबुदाती और डिफ़ॉल्ट प्रसंस्करण को रोकने के लिए माना जाता है। हालांकि, ब्राउज़र वैसे भी फॉर्म जमा करेगा। मैंने निम्नलिखित के साथ भी प्रयास किया:

function editParam(eventObj) { 
    eventObj.stopPropagation(); 
    eventObj.preventDefault(); 
    // ... 
} 

वही बात। एक ही रास्ता मैं प्रपत्र प्रस्तुत करने को रोकने के लिए प्रबंधित किया है ईवेंट हैंडलर से "गलत" वापस लौट कर रहा है:

function editParam(eventObj) { 
    // ... 
    return false; 
} 

कोई मुझे बता सकते हैं क्यों पहले दो तरीके से काम नहीं किया? धन्यवाद।

+0

कृपया अधिक देना सूचना: आप किस प्रकार के विजेट का उपयोग करते हैं (पूर्ण नाम), डोजो को "सबमिटबटन" नहीं पता है, मुझे लगता है कि यह एक dijit.form.Button है, "सबमिट" प्रकार के साथ। एक कोड स्निपेट बहुत मदद करेगा –

+0

मुझे खेद है, मैं ज़ेंड फ्रेमवर्क के दोजो सबमिट तत्व का उपयोग कर रहा था, जिसे सबमिटबटन कहा जाता है। लेकिन आप सही हैं, यह एक dijit.form है। बटन "सबमिट" प्रकार के साथ। – Dario

उत्तर

23

ठीक है, स्रोत के माध्यम से कुछ खोदने के बाद, मेरा मानना ​​है कि मैं निश्चित रूप से आपके प्रश्न का उत्तर दे सकता हूं।

कारण dojo.stopEvent() काम नहीं करता है, लेकिन return false करता है, पूरी तरह से dijit.form.Button को कोड किया गया है। यदि आप रुचि रखते हैं, तो यह थोड़ा सा क्षेत्र यात्रा के लिए समय है। अपने हार्ड टोपी रखें।

जब एक dijit.form.Button क्लिक किया जाता है ...

  1. बटन के _onButtonClick विधि शुरू हो जाती है। (यह, टेम्पलेट में झुका है विशेष ondijitclick घटना है जो केवल माउस क्लिक बल्कि कुछ keypresses, a11y उद्देश्यों के लिए नहीं लिया गया है।)
  2. _onButtonClick विधि पहले _onClick विधि है, जो, बटन मानते हुए विकलांग नहीं है का आह्वान (जो इस मामले में नहीं है), का आह्वान करता है औरonClick विधि का परिणाम देता है। यह विशेष रुचि है क्योंकि यह तरीका है कि आप ओवरराइड कर रहे हैं!
  3. _onButtonClick करने के लिए वापस आ रहा है, अगर _onClick लौटे ठीकfalse (जैसे अगर आपके onClick हैंडलर false लौटे), _onButtonClickतुरंत बाहर bails। यही कारण है कि झूठी वापसी आपके कोड को वांछित के रूप में काम करती है। लेकिन क्या होता है यदि यह वहां जमानत नहीं है? के निशान आगे का पालन करते हैं ...
  4. इसके बाद, इस बटन नहीं एक वास्तविक HTML प्रपत्र का वंशज है कि क्या _onButtonClick चेक, लेकिन एक _onSubmit विधि (बतख टाइपिंग) के साथ एक विजेट का वंशज है। मुझे लगता है कि आपके मामले में यह वास्तविक फ़ॉर्म (dijit.form.Form गणना) के अंदर है, इसलिए हम इसे छोड़ देंगे। (मैं इस धारणा के तहत हूं कि यह कोड पथ वास्तव में सबमिट नहीं करेगा, जबकि आपका स्पष्ट रूप से करता है।)
  5. एक अंतिम स्थिति की जांच की जाती है: यदि बटन में valueNode परिभाषित किया गया है (यह करता है), click इस विधि नोड लगाया जाता है। दुर्भाग्यवश, यह आपके फॉर्म के नीचे एक अदृश्य input type="submit" नोड पर पूरी तरह से नई घटना ऑब्जेक्ट उत्पन्न करता है, और इस प्रकार आप मूल घटना को बताने की कोशिश करने वाले किसी भी चीज को असीमित प्रदान करते हैं, और फॉर्म सबमिट करने के लिए चला जाता है! यही कारण है कि dojo.stopEvent काम नहीं किया - dijit.form.Button में यह कोड बिल्कुल ध्यान नहीं देता है।

मैंने इसे अवधारणा के कुछ हद तक सीमित प्रमाण के रूप में पकाया (फ़ायरबग/आदि खोलना सुनिश्चित करें।लॉग प्राप्त करने के लिए): http://jsfiddle.net/Bf5H8/

शायद यह कुछ ऐसा है जो एक बग के रूप में लॉग किया जाना चाहिए, लेकिन मुझे लगता है कि शुरुआती विचार हो सकता है कि प्रसिद्ध return false तंत्र का समर्थन पर्याप्त होगा।

यह सब कहा जा रहा है कि यह संभव है कि फ़ॉर्म पर सबमिट करना बटन के ओवरराइड को ओवरराइड करने के बजाय आपकी रुचियों के साथ अधिक ऑनलाइन है (जैसा कि एसजेन्स ने सुझाव दिया है), लेकिन कम से कम इस रहस्य को हल करना चाहिए।

+0

धन्यवाद आपके प्रयास के लिए, केन। – Dario

+0

मैंने इस पर डौग के साथ जांच की, यह डिजाइन द्वारा है। जैसा कि आपके विश्लेषण से पता चला है, स्टॉपइवेंट() का समर्थन करना परेशानी होगी क्योंकि दो ईवेंट ऑब्जेक्ट्स हैं। एक और उदाहरण है कि आपको झूठी वापसी की आवश्यकता है, एक फॉर्म में सबमिट विधि से है। उस स्थिति में stopEvent() को कॉल करने के लिए एक ईवेंट ऑब्जेक्ट भी नहीं है। –

2

दिलचस्प सवाल। +1

मेरा मानना ​​है कि आपको किसी ईवेंट ऑब्जेक्ट के साथ उन विधियों तक पहुंच प्राप्त करने के लिए अपने कार्य को किसी DOM ईवेंट से कनेक्ट करने के लिए dojo.connect का उपयोग करना होगा।

देखें: The Event Object (DojoTollkit.org Reference Guide)

घटना वस्तु

जब आप dojo.connect के साथ एक डोम घटना के लिए एक समारोह कनेक्ट, डोजो अपने कार्य एक सामान्यीकृत घटना वस्तु से गुजरता है। इसका मतलब है कि, क्लाइंट के ब्राउज़र के बावजूद, आप ईवेंट के बारे में मानक विशेषताओं के सेट पर सेट कर सकते हैं और ईवेंट को हेरफेर करने के तरीकों के सेट पर सेट कर सकते हैं।

मान लें कि आपके समारोह dojo.connect से बुलाया किया गया है और इस तरह एक तर्क नामित घटना लेता है,:

dojo.connect(dojo.byId("node"), "onclick", function(event){ 
    // the var 'event' is available, and is the normalized object 
}); 

...

डोजो को सामान्य एक घटना के साथ निम्न विधियों ऑब्जेक्ट:

  • event.preventDefault — पूर्व संध्या को रोकें NT का डिफ़ॉल्ट व्यवहार (जैसे, एक नया पृष्ठ लोड करने से एक लिंक)
  • event.stopPropagation —

साथ ही एक माता पिता के नोड के कार्यक्रम पर आरंभ होने से एक घटना को रोकने, dojo.stopEvent (घटना) दोनों डिफ़ॉल्ट व्यवहार नहीं कर पाएगा ईवेंट का कोई प्रचार (बबलिंग)।


जिसके अनुसार, अपने रूप में नीचे से एक की तरह एक समारोह रखने सबमिट करने से पहले कुछ तर्क प्रदर्शन करने के लिए, एक काफी साफ है, आसानी से & पोषणीय दृष्टिकोण समझ में आ रहा है।

<script type="dojo/method" event="onSubmit"> 
    if (!this.validate()) { // or whatever else you'd like to evaluate 
     // insert calls here... 
     return false; 
    } 
    return true; 
<script> 

चीयर्स।

+0

तकनीकी रूप से ऑनक्लिक विधि को सीधे सेट करने से कुछ भी बुरा नहीं होगा, क्योंकि यह 'dijit._Widget' में बस एक स्टब है जिसे वैसे भी लगाया जाना है। वास्तव में, dojo.connect (या शायद बेहतर, yourwidget.connect) का उपयोग करके वास्तव में * बदतर * होगा क्योंकि तब 'झूठी वापसी' या तो काम नहीं करेगा। –

2

मैं dojo.stopEvent

का उपयोग कर यह समस्या इस तरह फ़ॉर्म जमा समस्या हल हो जाती है के लिए एक ही मुद्दा था - यहाँ यह एक साधारण डोजो के माध्यम से कनेक्ट करने के लिए इस्तेमाल किया रूप है:

this.formId = dojo.byId("formId"); 
dojo.connect(this.formId, 'onsubmit', function(evt) { 
    var val_main = validate_this_form(0); 
     if(val_main == false) 
      dojo.stopEvent(evt); 
}); 
+0

नोट dojo.connect को dojo.aspect और dojo.on द्वारा बहिष्कृत किया गया है –

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