2009-07-20 9 views
71

जब मैं पृष्ठ के कुछ तत्वों को घुमाता है तो सहायता युक्तियाँ दिखाने के लिए मैं एक jQuery टिप प्लगइन का उपयोग कर रहा हूं।अद्यतन पैनल पोस्टबैक के बाद जावास्क्रिप्ट कॉलबैक निष्पादित कैसे किया जाए?

मुझे सीएसएस चयनकर्ताओं का उपयोग करके पृष्ठ लोड होने के बाद प्लगइन ईवेंट पंजीकृत करने की आवश्यकता है।

समस्या यह है कि मैं एक एएसपी.NET अद्यतन पैनल का उपयोग कर रहा हूं और पहली पोस्टबैक के बाद, टिप्स काम करना बंद कर देते हैं क्योंकि अद्यतन पैनल पृष्ठ सामग्री को प्रतिस्थापित करता है लेकिन जावास्क्रिप्ट ईवेंट को पुनर्निर्मित नहीं करता है।

अद्यतन पैनल को अपनी सामग्री को रीफ्रेश करने के बाद मुझे जावास्क्रिप्ट कॉलबैक निष्पादित करने का एक तरीका चाहिए, इसलिए मैं जावास्क्रिप्ट ईवेंट को फिर से काम करने के लिए युक्तियों को पुनर्निर्मित कर सकता हूं।

क्या ऐसा करने का कोई तरीका है?

उत्तर

163

के बजाय $(document).ready() के अंदर अपने jQuery कोड डालने को देखा है, यह अंदर

function pageLoad(sender, args) { 
    ... 
} 

pageLoad हर पोस्टबैक, तुल्यकालिक या अतुल्यकालिक के बाद मार डाला जाता है डाल दिया। pageLoad एएसपी.NET AJAX में एक आरक्षित फ़ंक्शन नाम है जो इस उद्देश्य के लिए है। दूसरी तरफ $(document).ready(), केवल एक बार निष्पादित किया जाता है, जब डोम प्रारंभ में तैयार/लोड होता है।

देखें इस Overview of ASP.NET AJAX client lifecycle events

+4

आपके उत्तर के लिए धन्यवाद। मुझे नहीं पता था कि क्लाइंट-साइड पेज लोड ईवेंट था और यह वही है जो मुझे चाहिए। समस्या सुलझ गयी। :) – tsbnunes

+0

मुझे नहीं पता था कि, या तो उपयोगी! ध्यान रखें मुझे संदेह है कि यह एक पृष्ठ पर सभी यूपी के लिए होगा, आपको मेरे क्लाइंट फ़िल्टर को विशिष्ट –

+0

+1 एफटीडब्लू होने की आवश्यकता होगी! मुझे यह भी पता नहीं था कि यह अस्तित्व में था और यह वही था जो मैं अपनी समस्या को हल करने की तलाश में था! बिग अप @ रस कैम! – longda

12

यह शायद अब तक का सबसे सुरुचिपूर्ण समाधान से है, लेकिन इसके एक फिर भी समाधान:

public class UpdatePanel : System.Web.UI.UpdatePanel 
{ 
    /// <summary> 
    /// Javascript to be run when the updatepanel has completed updating 
    /// </summary> 
    [Description("Javascript to be run when the updatepanel has completed updating"), 
     Category("Values"), 
     DefaultValue(null), 
     Browsable(true)] 
    public string OnUpdateCompleteClientScript 
    { 
     get 
     { 
      return (string)ViewState["OnUpdateCompleteClientScript"]; 
     } 
     set 
     { 
      ViewState["OnUpdateCompleteClientScript"] = value; 
     } 
    } 

    protected override void OnPreRender(System.EventArgs e) 
    { 
     base.OnPreRender(e); 
     if(!string.IsNullOrEmpty(this.OnUpdateCompleteClientScript)) 
      Page.ClientScript.RegisterStartupScript(this.GetType(), this.ClientID, string.Concat("Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, args){for(var panelId in sender._updatePanelClientIDs){if(sender._updatePanelClientIDs[panelId] == '", this.ClientID, "'){", this.OnUpdateCompleteClientScript, "}}});"), true); 
    } 
} 

इस तरह यह प्रयोग करें:

<uc:UpdatePanel OnUpdateCompleteClientScript="alert('update complete');"> 
    <!-- stuff in here --> 
</uc:UpdatePanel> 

बेशक आप कस्टम नियंत्रण रजिस्टर करने की आवश्यकता होगी आप webconfig या पेज इस तरह इसका उपयोग करने के लिए।

संपादित करें: भी, आप jquery.live?

+1

कस्टम अद्यतन पैनल उपयोगकर्ता नियंत्रण मेरी समस्या के लिए overkill है, लेकिन मैं jquery.live विधि के बारे में पता नहीं था और यह शायद काम करेगा और मेरी समस्या हल करो! लेकिन इस मामले में मुझे लगता है कि रसेल कैम द्वारा प्रस्तुत समाधान बेहतर है और मैंने पहले से ही कोशिश की है और अच्छा काम करता है। आपकी मदद के लिए धन्यवाद। :) – tsbnunes

+0

एक आसान तरीका होना चाहिए ..? –

19

Pageload काम नहीं किया। मैं बजाय इस प्रयोग किया है:

var prm = Sys.WebForms.PageRequestManager.getInstance(); 
prm.add_pageLoaded(pageLoaded); 

function pageLoaded() { 
} 
+2

uncaught संदर्भ त्रुटि, Sys परिभाषित नहीं है। –

+1

यहां बहुत अच्छा काम करता है। – Brent

+2

यदि आपको Sys आईडी परिभाषित नहीं किया गया है, क्योंकि यह है कि आप स्क्रिप्ट को कॉल कर रहे हैं, इससे पहले स्क्रिप्ट प्रबंधक स्क्रिप्ट लोड हो गया है। में आमतौर पर, जबकि scriptmanger सामान में भरी हुई है - सही हां मुझे पता है, ?! बस अपनी स्क्रिप्ट को पृष्ठ के नीचे या अपने नियंत्रण में ले जाएं और यह स्वीकृत उत्तर ठीक से काम करेगा। – ppumkin

0

आप विशिष्ट कार्यों ऐसा करने के लिए पहले और बाद में UpdatePanel लोड हो जाए, आप BeginPostbackRequest ओवरराइड कर सकते हैं चाहते हैं और EndPostbackRequest तो जैसे:

var postbackControl = null; 
var updatePanels = null; 
var prm = Sys.WebForms.PageRequestManager.getInstance(); 
prm.add_beginRequest(BeginPostbackRequest); 
prm.add_endRequest(EndPostbackRequest); 

function BeginPostbackRequest(sender, args) { 
    prm._scrollPosition = null; 
    postbackControl = args.get_postBackElement(); 
    postbackControl.disabled = true; 
    updatePanels = args._updatePanelsToUpdate; 
    // do your stuff 
} 

function EndPostbackRequest(sender, args) { 
    // do your stuff 
    postbackControl.disabled = false; 
    postbackControl = null; 
    updatePanels = null; 
} 

यह बहुत आसान है अगर आप चाहते हैं अद्यतन पैनल द्वारा वितरित केवल HTML को संसाधित करने के लिए। कुछ संचालन के लिए अधिक संसाधनों की आवश्यकता होती है और पूरे डीओएम पेड़ को pageLoad पर संसाधित करने के लिए यह अधिक होगा।

0

उपयोग pageLoaded घटना और जाँच करें कि क्या कॉलबैक या पोस्टबैक:

var prm = Sys.WebForms.PageRequestManager.getInstance(); 
prm.add_pageLoaded(function (sender, args) { 
    if (args._panelsUpdated && args._panelsUpdated.length > 0) { 
     //callback; 
    } 
    else { 
     //postback; 
    } 
});