source

RegisterStartupScript와 RegisterClientScriptBlock의 차이점은 무엇입니까?

manycodes 2023. 5. 1. 21:34
반응형

RegisterStartupScript와 RegisterClientScriptBlock의 차이점은 무엇입니까?

그것이 유일한 차이점입니까?RegisterStartupScript그리고RegisterClientScriptBlockRegisterStartupScript가 마감 전에 Javascript를 배치하는 것입니다.</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?

여기에 주요 차이점과 각 방법을 사용해야 하는 조건을 나열한 오래된 토론 스레드가 있습니다.저는 당신이 그 토론을 검토하는 것이 유용하다고 생각합니다.

게시된 예와 관련하여 차이점을 설명하려면 다음과 같이 하십시오.

사용할 때RegisterStartupScript페이지의 모든 요소 뒤에 스크립트가 렌더링됩니다(양식의 끝 태그 바로 앞).이렇게 하면 스크립트가 페이지의 DOM에서 페이지 구성요소를 찾을 가능성 없이 페이지 구성요소를 호출하거나 참조할 수 있습니다.

다음은 호출할 때 페이지의 렌더링된 소스입니다.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에서 레이블을 찾지 못하므로 "Object 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); 
  } 
} 

여기 ASP의 간단한 예가 있습니다.NET Community, 이를 통해 개념에 대한 명확한 이해를 얻을 수 있었습니다.

이것이 무엇을 변화시키나요?

에 로드될 때 Visual . Basic을 사용합니다.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)

포커스가 텍스트 상자 컨트롤에 도달하지 않고 페이지에 JavaScript 오류가 생성됩니다.

텍스트 상자가 페이지에 표시되기 전에 브라우저에서 JavaScript가 표시되기 때문입니다.따라서 JavaScript는 TextBox1을 찾을 수 없습니다.

언급URL : https://stackoverflow.com/questions/666519/difference-between-registerstartupscript-and-registerclientscriptblock

반응형