SORU
20 Mart 2009, Cuma


RegisterStartupScript ve RegisterClientScriptBlock arasındaki fark?

Tek fark arasındaki RegisterStartupScript RegisterClientScriptBlock olduğunu RegisterStartupScript koyar javascript kapatmadan önce </form> etiket baskı ve RegisterClientScriptBlock koyar hemen sonra başlayan <form> etiket sayfa?

Ayrıca, ne zaman birini diğerine tercih etsin? Ben bir sorun olduğu kadar çabuk bir örnek sayfa yazdım ve emin oluyor neden tam sebebi ben değilim.

İşte SEO biçimlendirme:

<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>

İşte Kod Arkasında:

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());
    } 
 }

Sorun olduğunda ben ' I btnPostBack düğme, öyle bir geri gönderme ve değişiklikleri etiket için kırmızı, ama ne zaman ı tıklatın btnPostBack2, öyle bir geri, ama etiketin rengi değişmez kırmızı. Neden bu? Etiket başlatılmadı diye mi?

Ben de eğer MasterPage, ScriptManager.RegisterStartupScript, kullanmanız gerekir ama eğer varsa UpdatePanel, bir kullanıyorsanız ScriptManagerProxy kullandığım okudun mu?

CEVAP
20 Mart 2009, Cuma


Ana farklılıklar ve bu yöntemlerin her kullanmanız gereken şartları nerde Here's an old discussion thread. Bu yararlı bir tartışma geçmesi bulabilirsiniz sanırım.

Farklılıkları gönderildi ben örnek olarak ilgili açıklaması:

bir. RegisterStartupScript, kullandığınızda komut hale geleceksonrasayfa (sağ formun sonunda etiketinden önce) tüm unsurları. Bu çağrı veya olasılığı Sayfanın DOM onları bulmak olmadan sayfa öğeleri referans için komut dosyası sağlar.

Burada RegisterStartupScript yöntemini çağırdığınızda sayfanın işlenen kaynak:

<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>

b. RegisterClientScriptBlock, kullandığınızda komut görünüm durumu etiketinden hemen sonra oluşturulur, ancak sayfanın daha önce herhangi bir öğe. Bu bir yana, doğrudan komut dosyası (bir işlev değilaradıhemen tarayıcı tarafından çalıştırılır. Ama tarayıcı bu aşamada Sayfanın DOM etiketi ve "Nesne" hata. bulunamadı almanız gerekir dolayısıyla bulamaz

Burada RegisterClientScriptBlock yöntemini çağırdığınızda sayfanın işlenen kaynak:

<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';

Dolayısıyla, özetlemek gerekirse, eğer bir işlev tanımı işlemek istiyorsanız ikinci yöntemi aramalısın. Daha sonra oluşturabilirsinizbu fonksiyonu çağıreski yöntem (veya istemci tarafı bir öznitelik Ekle) kullanarak.

Yorum sonra düzenleyin:


Örneğin, aşağıdaki işlevi çalışır:

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); 
  } 
} 

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Austin Evans

    Austin Evans

    5 AĞUSTOS 2007
  • ChannelRichard

    ChannelRicha

    7 Kasım 2008
  • Ty Moss

    Ty Moss

    20 Kasım 2007