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


139

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

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

यहाँ aspx मार्कअप है:

<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बटन पर क्लिक करता हूं , यह एक पोस्टबैक करता है और लेबल को लाल में बदलता है, लेकिन जब मैं क्लिक करता हूं btnPostBack2, तो यह पोस्टबैक करता है, लेकिन लेबल का रंग लाल में नहीं बदलता है। ऐसा क्यों है? क्या यह इसलिए है क्योंकि लेबल आरंभीकृत नहीं है?

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

जवाबों:


162

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

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

ए। जब आप उपयोग करते हैं 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, तो स्क्रिप्ट को Viewstate टैग के ठीक बाद प्रदान किया जाता है, लेकिन पृष्ठ तत्वों में से किसी से पहले। चूंकि यह एक प्रत्यक्ष स्क्रिप्ट है (ऐसा फ़ंक्शन नहीं जिसे कॉल किया जा सकता है , इसे तुरंत ब्राउज़र द्वारा निष्पादित किया जाएगा। लेकिन ब्राउज़र को इस स्तर पर पेज के डोम में लेबल नहीं मिलता है और इसलिए आपको "ऑब्जेक्ट नहीं मिला" प्राप्त करना चाहिए। त्रुटि।

जब आप 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); 
  } 
} 

1
क्या आप इनलाइन फ़ंक्शंस के बारे में कुछ और बता सकते हैं।
Xaisoft

2
मेरी पोस्ट को बेहतर तरीके से संपादित करते हुए इसे आपके उदाहरण के खिलाफ बताएं।
सेरेब्रस

1
मुझे वास्तव में एक त्रुटि नहीं मिलती है, समय अपडेट होता है, लेकिन रंग नहीं बदलता है। मेरे प्रश्न के उस हिस्से के बारे में जहां मैं पूछता हूं कि क्या मुझे ScriptManagerProxy का उपयोग करना है अगर मेरे पास पहले से ही एक मास्टर पेज में ScriptManager है?
Xaisoft

1
सम्पादन संपन्न, संपादन संपन्न किया। मैं ScriptManagerProxy के साथ त्रुटि के बारे में निश्चित नहीं हूं। मुझे लगता है कि आपको मूल्यांकन करना चाहिए कि क्या वास्तव में एक अलग प्रश्न नहीं है। ;-)
सेरेब्रस

1
महान! अब तक धन्यवाद। मुझे ScriptManagerProxy के साथ कोई त्रुटि नहीं मिल रही है। मुझे सिर्फ इतना पता है कि आप केवल ScriptManager के एक उदाहरण की घोषणा कर सकते हैं, इसलिए अगर मेरे पास पहले से ही एक ScriptManager उदाहरण के लिए एक मास्टर पृष्ठ में परिभाषित है, तो मैं मान लूंगा कि मैं इसके बजाय ScriptManagerProxy का उपयोग करूंगा।
Xaisoft

6

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

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

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

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)

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.