दिलचस्प पोस्ट
फोन-गैप-जावास्क्रिप्ट क्रॉस-डोमेन अजाक्स अनुरोध भेज रहा है यह कोड NSString को समान मानकर क्यों नहीं मानता है? डेटाफ्रेम के विभाजन को परिभाषित करने के लिए कैसे? फ़ाइल में एक विशिष्ट पंक्ति को हटाना (अजगर) क्या होगा अगर मैं क्रिकोज़ल के क्वालिटी में कई बार अस्वीकार / हल करता हूं? "एमवीएन तैनात" के बीच स्थानीय रेपो और "एमवीएन इंस्टॉल" में क्या अंतर है? iPhone ऐप्स: क्या मैं किसी वेबसाइट में एक लिंक से ऐप खोल सकता हूं? एक खिड़की सेवा शुरू करें और सीएमडी लॉन्च करें क्लिक पर सीएसएस गुण बदलें स्क्रीन रोटेशन के दौरान एक एसिंक टास्क कैसे प्रबंधित करें? मैं php.ini के लिए php.ini कहां मिल सकता हूं समारोह एफ () (यदि (! (इस उदाहरण के एफ)) {वापसी नई एफ ()}; …} com.jcraft.jsch.JSchException: अज्ञातहॉस्टकी रन टाइम में व्यवस्थापक विशेषाधिकारों का अनुरोध करना पायथन में एक सूची की गहरी कॉपी करें

RegisterStartupScript और RegisterClientScriptBlock के बीच अंतर?

RegisterStartupScript और RegisterStartupScript बीच एकमात्र अंतर क्या यह है कि RegisterStartupScript पृष्ठ के समापन </form> टैग से पहले जावास्क्रिप्ट डालता है और RegisterClientScriptBlock पृष्ठ के प्रारंभ <form> टैग के बाद इसे सही रखता है?

इसके अलावा, आप दूसरे पर एक का चयन कब करेंगे? मैंने एक त्वरित नमूना पृष्ठ लिखा था, जहां मुझे कोई समस्या थी और मुझे यकीन नहीं है कि यह क्यों हो रहा है इसका सही कारण है।

यहां एएसपीएक्स मार्कअप है:

 <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label ID="lblDisplayDate" runat="server" Text="Label" /><br /> <asp:Button ID="btnPostback" runat="server" Text="Register Startup Script" onclick="btnPostback_Click" /><br /> <asp:Button ID="btnPostBack2" runat="server" Text="Register" onclick="btnPostBack2_Click" /> </div> </form> </body> </html> 

यहां पीछे का कोड है:

 protected void Page_Load(object sender, EventArgs e) { lblDisplayDate.Text = DateTime.Now.ToString("T"); } protected void btnPostback_Click(object sender, EventArgs e) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(@"<script language='javascript'>"); sb.Append(@"var lbl = document.getElementById('lblDisplayDate');"); sb.Append(@"lbl.style.color='red';"); sb.Append(@"</script>"); if(!ClientScript.IsStartupScriptRegistered("JSScript")) { ClientScript.RegisterStartupScript(this.GetType(),"JSScript", sb.ToString()); } } protected void btnPostBack2_Click(object sender, EventArgs e) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(@"<script language='javascript'>"); sb.Append(@"var lbl = document.getElementById('lblDisplayDate');"); sb.Append(@"lbl.style.color='red';"); sb.Append(@"</script>"); if (!ClientScript.IsClientScriptBlockRegistered("JSScriptBlock")) { ClientScript.RegisterClientScriptBlock(this.GetType(), "JSScriptBlock", sb.ToString()); } } 

समस्या यह है कि जब मैं btnPostBack पोस्टबैक बटन पर क्लिक करता btnPostBack , यह एक पोस्टबैक करता है और लेबल को लाल रंग में बदलता है, लेकिन जब मैं btnPostBack2 पोस्टबैक 2 पर क्लिक करता btnPostBack2 , यह एक पोस्टबैक करता है, लेकिन लेबल का रंग लाल रंग में नहीं बदलता है ऐसा क्यों है? क्या ऐसा इसलिए है क्योंकि लेबल को आरम्भ नहीं किया गया है?

मैंने यह भी पढ़ा है कि यदि आप एक UpdatePanel का उपयोग कर रहे हैं, तो आपको ScriptManager.RegisterStartupScript का उपयोग करने की आवश्यकता है, लेकिन अगर मेरे पास MasterPage , तो क्या मैं ScriptManagerProxy उपयोग करूँगा?

Solutions Collecting From Web of "RegisterStartupScript और RegisterClientScriptBlock के बीच अंतर?"

यहां एक पुरानी चर्चा थ्रेड है जहां मैंने मुख्य अंतर और शर्तों को सूचीबद्ध किया था जिसमें इन विधियों में से प्रत्येक का उपयोग करना चाहिए। मुझे लगता है कि आप चर्चा के माध्यम से जाने के लिए उपयोगी पा सकते हैं।

अपने पोस्ट किए गए उदाहरण के लिए प्रासंगिक के रूप में अंतर को समझाने के लिए:

ए। जब आप RegisterStartupScript उपयोग करते हैं, तो यह पृष्ठ में सभी तत्वों के बाद आपकी स्क्रिप्ट को प्रस्तुत करेगा (फ़ॉर्म के अंत टैग के ठीक पहले)। इससे स्क्रिप्ट को पृष्ठ तत्वों को कॉल करने या संदर्भ देने में मदद मिलती है, जो उन्हें पृष्ठ के डोम में नहीं मिलती है।

जब आप RegisterStartupScript विधि को आमंत्रित करते हैं, तो पृष्ठ का गाया स्रोत यहां दिया गया है:

 <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1"><title></title></head> <body> <form name="form1" method="post" action="StartupScript.aspx" id="form1"> <div> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="someViewstategibberish" /> </div> <div> <span id="lblDisplayDate">Label</span> <br /> <input type="submit" name="btnPostback" value="Register Startup Script" id="btnPostback" /> <br /> <input type="submit" name="btnPostBack2" value="Register" id="btnPostBack2" /> </div> <div> <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="someViewstategibberish" /> </div> <!-- Note this part --> <script language='javascript'> var lbl = document.getElementById('lblDisplayDate'); lbl.style.color = 'red'; </script> </form> <!-- Note this part --> </body> </html> 

ख। जब आप RegisterClientScriptBlock उपयोग करते हैं, स्क्रिप्ट दृश्यस्टेट टैग के ठीक बाद प्रस्तुत की जाती है, लेकिन किसी भी पृष्ठ तत्वों से पहले। चूंकि यह एक सीधी स्क्रिप्ट है (एक ऐसा फ़ंक्शन नहीं जिसे कहा जा सकता है , इसे ब्राउज़र द्वारा तुरंत निष्पादित किया जाएगा।) लेकिन ब्राउज़र इस पृष्ठ पर पेज के डोम में लेबल नहीं खोजता है और इसलिए आपको "ऑब्जेक्ट नहीं मिला" त्रुटि।

जब आप RegisterClientScriptBlock विधि को आमंत्रित करते हैं, तो पृष्ठ का गाया स्रोत यहां दिया गया है:

 <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1"><title></title></head> <body> <form name="form1" method="post" action="StartupScript.aspx" id="form1"> <div> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="someViewstategibberish" /> </div> <script language='javascript'> var lbl = document.getElementById('lblDisplayDate'); // Error is thrown in the next line because lbl is null. lbl.style.color = 'green'; 

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

टिप्पणियों के बाद संपादित करें:


उदाहरण के लिए, निम्नलिखित फ़ंक्शन काम करेगा:

 protected void btnPostBack2_Click(object sender, EventArgs e) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append("<script language='javascript'>function ChangeColor() {"); sb.Append("var lbl = document.getElementById('lblDisplayDate');"); sb.Append("lbl.style.color='green';"); sb.Append("}</script>"); //Render the function definition. if (!ClientScript.IsClientScriptBlockRegistered("JSScriptBlock")) { ClientScript.RegisterClientScriptBlock(this.GetType(), "JSScriptBlock", sb.ToString()); } //Render the function invocation. string funcCall = "<script language='javascript'>ChangeColor();</script>"; if (!ClientScript.IsStartupScriptRegistered("JSScript")) { ClientScript.RegisterStartupScript(this.GetType(), "JSScript", funcCall); } } 

एएसपी.नेट समुदाय से यह सबसे सरल उदाहरण है, इसने मुझे अवधारणा पर एक स्पष्ट समझ दी है ….

यह क्या फर्क पड़ता है?

इसका एक उदाहरण के लिए, एक पृष्ठ पर एक पाठ बॉक्स पर फ़ोकस करने का एक तरीका है जब पृष्ठ ब्राउजर में लोड हो जाता है- साथ VisualStartupScript विधि का उपयोग करके Visual Basic:

 Page.ClientScript.RegisterStartupScript(Me.GetType(), "Testing", _ "document.forms[0]['TextBox1'].focus();", True) 

यह अच्छी तरह से काम करता है क्योंकि पेज पर टेक्स्ट बॉक्स जेनरेट होता है और पृष्ठ पर नीचे दिए गए समय के अनुसार ब्राउजर पृष्ठ के नीचे जाता है और जावास्क्रिप्ट के इस छोटे से हिस्से में जाता है।

लेकिन, यदि इसके बजाय इसे इस तरह लिखा गया था ( RegisterClientScriptBlock विधि का प्रयोग करके):

 Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "Testing", _ "document.forms[0]['TextBox1'].focus();", True) 

फ़ोकस पाठ बॉक्स नियंत्रण पर नहीं पहुंच जाएगा और पृष्ठ पर एक JavaScript त्रुटि उत्पन्न होगी

इसके लिए कारण यह है कि ब्राउज़र जावास्क्रिप्ट का सामना करेगा इससे पहले कि पाठ बॉक्स पृष्ठ पर है। इसलिए, जावास्क्रिप्ट एक टेक्स्टबॉक्स 1 नहीं मिल पाएगा।