2008-11-19 5 views
76

के बाद jQuery में घटनाओं को रिबाइंड करना मेरे पृष्ठ पर मेरे पास कई इनपुट और विकल्प तत्व हैं, प्रत्येक (अच्छी तरह से) एक बार बदलते समय पृष्ठ पर कुछ पाठ अपडेट करने के लिए एक ईवेंट संलग्न होता है। मैं jQuery का उपयोग करता हूं जो वास्तव में वास्तव में अच्छा है :)अजाक्स अपडेट (अपडेट पैनेल)

मैं अद्यतन पैनेल का उपयोग करते हुए माइक्रोस्कोफ्ट Ajax ढांचे का भी उपयोग करता हूं। कारण मैं ऐसा करता हूं कि कुछ सर्वर-साइड तर्क के आधार पर पृष्ठ पर कुछ तत्व बनाए जाते हैं। मैं वास्तव में यह नहीं समझाना चाहता हूं कि मैं अपडेटपेनल का उपयोग क्यों करता हूं - भले ही यह (0 काफी प्रयास के साथ) केवल jQuery का उपयोग करने के लिए पुनः लिखा जा सके, फिर भी मैं अपडेटपैनल चाहता हूं।

आपने शायद अनुमान लगाया - एक बार जब मैं अपडेटपेनल पर पोस्टबैक करता हूं तो jQuery ईवेंट काम करना बंद कर देता है। मैं वास्तव में इसकी उम्मीद कर रहा था, क्योंकि "पोस्टबैक" वास्तव में एक नया पोस्टबैक नहीं है, इसलिए दस्तावेज़ में मेरा कोड। पहले से ही घटनाओं को बांधने से फिर से नहीं निकाल दिया जाएगा। मैंने jQuery सहायता पुस्तकालयों में इसे पढ़ने के द्वारा भी अपने संदेह की पुष्टि की।

वैसे भी मुझे अपडेट नियंत्रण को DOM अद्यतन करने के बाद मेरे नियंत्रण को पुन: स्थापित करने की समस्या के साथ छोड़ दिया गया है। मुझे अधिमानतः ऐसे समाधान की आवश्यकता है जिसके लिए पृष्ठ पर अधिक .js फ़ाइलें (jQuery प्लग-इन) जोड़ने की आवश्यकता नहीं है, लेकिन अपडेटपेनल के 'आफ्टरअपडेटिंग' को पकड़ने में सक्षम होने के समान कुछ आसान है, जहां मैं केवल सभी फॉर्म तत्वों को पुन: स्थापित करने के लिए अपनी विधि को कॉल कर सकता हूं ।

+0

यह इस प्रश्न के समान है: http://stackoverflow.com/questions/256195/jquery-document-ready-and-updatepanels –

उत्तर

83

आप ASP.NET AJAX का उपयोग कर रहे हैं, इसलिए आपको एक pageLoad ईवेंट हैंडलर, कि हर बार पृष्ठ पोस्ट वापस बुलाया जाता है का लाभ उठा सकेंगे यह पूर्ण या एक UpdatePanel से आंशिक हो। आपको बस फ़ंक्शन को अपने पृष्ठ पर रखना होगा, कोई हुकिंग अप की आवश्यकता नहीं है।

function pageLoad(sender, args) 
{ 
    if (args.get_isPartialLoad()) 
    { 
     //Specific code for partial postbacks can go in here. 
    } 
} 
+0

ठीक है आप हैं! धन्यवाद :) –

+1

कोई समस्या नहीं - यह बीटीडब्ल्यू करने का सिर्फ एक ही तरीका है। यदि आपको अधिक लचीलापन की आवश्यकता है, तो PageRequestManager क्लास पर endRequest ईवेंट देखें। –

+0

बहुत बढ़िया! मैंने अपने jquery $ (दस्तावेज़) को बदल दिया है। पहले से ही आपके पेज लोड (अगर ब्लॉक के बिना) और यह मेरी समस्या हल हो गया है! – Chris

8

आप jQuery और ईवेंट प्रतिनिधिमंडल का उपयोग कर सकते हैं। मूल रूप से प्रत्येक तत्व के बजाय कंटेनरों को घटनाओं को हुक करें और उस पर आधारित event.target और रन स्क्रिप्ट पूछें।

इसमें कई फायदे हैं कि आप कोड शोर को कम करते हैं (पुनर्निर्मित करने की कोई आवश्यकता नहीं है)। यह ब्राउज़र मेमोरी (डीओएम में बाध्य कम घटनाओं) पर भी आसान है

त्वरित उदाहरण here। आसान घटना प्रतिनिधिमंडल के लिए

jQuery plugin

पीएस मैं 99% निश्चित प्रतिनिधिमंडल अगली रिलीज पर jQuery कोर में होगा।

22
Sys.Application.add_load(initSomething); 
function initSomething() 
{ 
    // will execute on load plus on every UpdatePanel postback 
} 
+0

यह एक अपडेट पैनल के अंदर एक jQuery एएसपी.Net नियंत्रण कार्य करने के लिए मेरे लिए वास्तव में अच्छा काम करता है – Earlz

+0

पृष्ठ पर केवल एक समारोह पृष्ठ लोड (प्रेषक, तर्क) के लिए वर्कअराउंड प्रदान करने के लिए धन्यवाद – SQueek

+0

सर्वोत्तम समाधान, और जैसे ही @ SQueek ने कहा, एक पृष्ठ पर केवल एक 'पृष्ठ लोड (प्रेषक, तर्क)' के कारण। – Pegues

23

या आप on() विधि के माध्यम से नवीनतम jQuery की लाइव कार्यक्षमता देख सकते हैं। कोड

Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(pageLoaded); 

function pageLoaded(sender, args) { 
    var updatedPanels = args.get_panelsUpdated(); 
    // check if Main Panel was updated 
    for (idx = 0; idx < updatedPanels.length; idx++) { 
     if (updatedPanels[idx].id == "<%=upMain.ID %>") { 
      rebindEventsForMainPanel(); 
      break; 
     } 
    } 
} 
+0

यह मेरे लिए सबसे अच्छा समाधान था, क्योंकि मेरे अधिकांश jQuery मार्कअप पृष्ठ पर कई उपयोगकर्ता नियंत्रणों के अंदर encapsulated है। –

+1

क्या आप डेटपिकर के साथ उदाहरण पोस्ट कर सकते हैं? –

+0

वाह, पोस्टबैक पर रीबंडिंग से बेहतर तरीका। पारितोषिक के लिए धन्यवाद! – Matt

9

उपयोग आप कोड है कि आप हर बार है कि UpdatePanel AsyncPostBack करता है पर अमल की जरूरत है डाल सकते हैं "अगर"।

4

  <script type="text/javascript"> 
      function pageLoad() { 

       if (Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack()) { 


     } 

      </script> 

     </ContentTemplate> 
    </asp:UpdatePanel> 

की बातों का

+0

धन्यवाद @ सीआईएम, यह समाधान मेरे लिए ठीक काम करता है ... –

2

jQuery की नई 'लाइव' विधि का उपयोग करके अपनी घटनाओं को बाध्य करें। यह आपके सभी मौजूदा तत्वों और भविष्य के सभी लोगों के लिए घटनाओं को बाध्य करेगा। चा चिंग!:)

5

निम्नलिखित कोड का उपयोग, आप नियंत्रण को मान्य करने की जरूरत है datapicker का उपयोग करेगा:

<script type="text/javascript" language="javascript"> 

     Sys.WebForms.PageRequestManager.getInstance().add_endRequest(addDataPicker); 
     function addDataPicker(sender, args) 
     { 
      var fchFacturacion = document.getElementById('<%= txtFechaFacturacion.ClientID %>'); 
      if (fchFacturacion != null) { 
       $(fchFacturacion).datepicker({ onSelect: function() { }, changeMonth: true, changeYear: true, showOn: 'button', buttonImage: '../Imagenes/calendar.gif', buttonImageOnly: true});} 
     } 

    </script> 

    <asp:UpdatePanel ID="upEjem" runat="server" UpdateMode="Conditional"> 
     <ContentTemplate> 
       <div id="div1" runat="server" visible="false"> 
        <input type="text" id="txtFechaFacturacion" 
         name="txtFechaFacturacion" visible="true" 
         readonly="readonly" runat="server" /> 
       </div> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
14

jQuery 1.7 के रूप में, यह करने के लिए सुझाया गया तरीका jQuery's .on() सिंटैक्स का उपयोग करने के लिए है।

सुनिश्चित करें कि आपने दस्तावेज़ ऑब्जेक्ट पर डीओएम ऑब्जेक्ट स्वयं नहीं किया है, तो सुनिश्चित करें। ...

$(':input').on('change', function() {...}); 

है क्योंकि: उदाहरण के लिए, इस UpdatePanel पोस्टबैक के बाद टूट जाएगा ': आदानों' फिर से लिखा गया है। बजाय यह करें:

$(document).on('change', ':input', function() {...}); 

जब तक दस्तावेज़ के आसपास है के रूप में, किसी भी आदानों (UpdatePanel ताज़ा करता है के लोग भी शामिल) परिवर्तन हैंडलर ट्रिगर किया जाएगा।

+0

बहुत बढ़िया! (दस्तावेज) ने निम्नलिखित का उपयोग करके सुंदर काम किया .... $ (दस्तावेज़) .on ('क्लिक करें', '# टैग जोड़ें', फ़ंक्शन() कोई फर्क नहीं पड़ता कि पेज के सामग्री को कितना अद्यतन पैनल मैंने तोड़ दिया है :) Thx –