রেজিস্টারস্টার্টআপস্ক্রিপ্ট এবং রেজিস্টারক্লিয়েন্টস্ক্রিপ্টব্লকের মধ্যে পার্থক্য?


139

RegisterStartupScriptএবং এর মধ্যে পার্থক্য কি কেবল RegisterClientScriptBlockরেজিস্টারস্টার্টআপস্ক্রিপ্ট জাভাস্ক্রিপ্টটিকে </form>পৃষ্ঠার সমাপনী ট্যাগের আগে রাখে এবং রেজিস্টারক্লিয়েন্টসক্রিপ ব্লক পৃষ্ঠাটির প্রারম্ভিক <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বোতামটি ক্লিক করি তখন এটি একটি পোস্টব্যাক করে এবং লেবেলটিকে লাল রঙে পরিবর্তন করে, তবে আমি যখন ক্লিক করি তখন 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স্ক্রিপ্টটি ভিউস্টেট ট্যাগের ঠিক পরে, কিন্তু পৃষ্ঠার উপাদানগুলির আগে রেন্ডার করা হয়। যেহেতু এই একটি সরাসরি স্ক্রিপ্ট (একটি ফাংশন যা করা যেতে পারে বলা , তা অবিলম্বে ব্রাউজার দ্বারা মৃত্যুদন্ড কার্যকর করা হবে না। কিন্তু ব্রাউজার এই পর্যায়ে পৃষ্ঠার DOM মধ্যে ট্যাগ খুঁজে না এবং অত: পর আপনি একটি "অবজেক্ট not found" গ্রহণ করা উচিত ত্রুটি.

আপনি 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
আপনি ইনলাইন ফাংশন সম্পর্কে আরও কিছু ব্যাখ্যা করতে পারেন।
জাইসফট

2
আমার পোস্টটিকে আপনার উদাহরণের বিপরীতে চিত্রিত করার জন্য সম্পাদনা করা।
সেরিব্রাস

1
আমি আসলে একটি ত্রুটি পাই না, সময় আপডেট হয় তবে রঙ পরিবর্তন হয় না। আমার প্রশ্নের যে অংশটি আমি জিজ্ঞাসা করব সে সম্পর্কে যদি আমার কাছে ইতিমধ্যে একটি মাস্টার পৃষ্ঠায় একটি স্ক্রিপ্টম্যানেজার সংজ্ঞায়িত করা আছে তবে আমাকে স্ক্রিপ্ট ম্যানেজারপ্রক্সি ব্যবহার করতে হবে?
জাইসফট

1
সম্পাদন করা শেষ. স্ক্রিপ্ট ম্যানেজারপ্রক্সির সাথে ত্রুটি সম্পর্কে আমি নিশ্চিত নই। আমি মনে করি যদি এটি সত্যিই আলাদা প্রশ্ন না হয় তবে আপনার মূল্যায়ন করা উচিত। ;-)
সেরিব্রাস

1
গ্রেট! ধন্যবাদ এখন পর্যন্ত। স্ক্রিপ্টম্যানেজারপ্রক্সির সাথে আমি ত্রুটি পাচ্ছি না। আমি কেবল জানি যে আপনি কেবল স্ক্রিপ্ট ম্যানেজারের একটি উদাহরণ ঘোষণা করতে পারেন, সুতরাং যদি ইতিমধ্যে উদাহরণস্বরূপ একটি মাস্টার পৃষ্ঠায় আমার কাছে একটি স্ক্রিপ্ট ম্যানেজার সংজ্ঞায়িত করা থাকে তবে আমি ধরে নেব যে আমি এর পরিবর্তে স্ক্রিপ্টম্যানেজারপ্রক্সি ব্যবহার করব।
জাইসফট

6

এএসপি.এনইটি সম্প্রদায়ের একটি সহজ উদাহরণ এখানে দেওয়া হয়েছে , এটি আমাকে ধারণার উপর একটি সুস্পষ্ট ধারণা দিয়েছে ...

এটি কি পার্থক্য করে?

এর উদাহরণের জন্য, পৃষ্ঠাটি যখন ব্রাউজারে লোড হয় a 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)

ফোকাস পাঠ্যবক্স নিয়ন্ত্রণে পাবেন না এবং পৃষ্ঠাতে একটি জাভাস্ক্রিপ্ট ত্রুটি উত্পন্ন হবে

এর কারণ হ'ল পাঠ্য বাক্সের পৃষ্ঠাটিতে উপস্থিত হওয়ার আগে ব্রাউজারটি জাভাস্ক্রিপ্টের মুখোমুখি হবে। অতএব, জাভাস্ক্রিপ্ট কোনও পাঠ্যবক্স 1 খুঁজে পাবে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.