[asp.net] ASP : CheckBox에 대한 OnClick 대 OnClientClick?

asp : CheckBox에 대한 클라이언트 측 자바 스크립트 핸들러가 asp : Button과 같이 OnClientClick = “”속성이 아닌 OnClick = “”속성이어야하는 이유를 아는 사람이 있습니까?

예를 들어 다음과 같이 작동합니다.

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />

그리고 이것은 (오류 없음) :

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />

그러나 이것은 작동합니다.

<asp:Button runat="server" OnClientClick="alert('Hi');" />

그리고 이것은 (컴파일 시간 오류) :

<asp:Button runat="server" OnClick="alert('hi');" />

(나는 Button.OnClick이 무엇인지 알고 있습니다. 왜 CheckBox가 같은 방식으로 작동하지 않는지 궁금합니다 …)



답변

그것은 매우 이상합니다. 나는 CheckBox 문서 페이지 를 확인했습니다.

<asp:CheckBox id="CheckBox1"
     AutoPostBack="True|False"
     Text="Label"
     TextAlign="Right|Left"
     Checked="True|False"
     OnCheckedChanged="OnCheckedChangedMethod"
     runat="server"/>

보시다시피 OnClick 또는 OnClientClick 속성이 정의되어 있지 않습니다.

이것을 염두에두고 이것이 일어나고 있다고 생각합니다.

이렇게하면

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />

ASP.NET은 OnClick 특성을 수정하지 않고 브라우저에서 그대로 렌더링합니다. 다음과 같이 렌더링됩니다.

  <input type="checkbox" OnClick="alert(this.checked);" />

분명히 브라우저는 ‘OnClick’을 이해하고 경고를 표시합니다.

그리고이 시나리오에서

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />

다시 말하지만 ASP.NET은 OnClientClick 특성을 변경하지 않고 다음과 같이 렌더링합니다.

<input type="checkbox" OnClientClick="alert(this.checked);" />

브라우저가 OnClientClick을 이해하지 못하므로 아무 일도 일어나지 않습니다. 또 다른 속성이므로 오류가 발생하지 않습니다.

렌더링 된 HTML을 보면 위에서 확인할 수 있습니다.

그리고 예, 이것은 전혀 직관적이지 않습니다.


답변

두 종류의 컨트롤이기 때문에 …

웹 브라우저는 서버 측 프로그래밍에 대해 알지 못합니다. 자체 DOM과 사용하는 이벤트 모델에 대해서만 알고 있습니다. 그리고 렌더링 된 객체의 클릭 이벤트에 대해서도 알고 있습니다. ASP.Net에서 브라우저로 실제로 전송 된 최종 마크 업을 검사하여 차이점을 확인해야합니다.

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />

렌더링

<input type="check" OnClick="alert(this.checked);" />

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />

렌더링

<input type="check" OnClientClick="alert(this.checked);" />

이제 내가 기억할 수 있듯이 DOM에서 “OnClientClick”이벤트를 지원하는 브라우저는 어디에도 없습니다.

확실하지 않은 경우 브라우저로 전송되는 출력의 소스를 항상 확인하십시오. 볼 수있는 디버그 정보의 전 세계가 있습니다.


답변

당신이 맞아요 이것은 일관성이 없습니다. 무슨 일이 일어나고 있는지 CheckBox에 서버 측 OnClick 이벤트가 없으므로 마크 업이 브라우저에 렌더링됩니다. http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkbox_events.aspx

Button에는 OnClick이 있으므로 ASP.NET은 OnClick 마크 업의 이벤트에 대한 참조를 기대합니다.


답변

여기에 서버 측 OnClick 핸들러를 찾는 사람들에게는OnCheckedChanged


답변

경고 및 메시지를 정리하고 VS가 이에 대해 경고하는 것을 확인했습니다. 유효성 검사 (ASP.Net) : 속성 ‘OnClick’은 ‘CheckBox’요소의 유효한 속성이 아닙니다. html 입력 컨트롤을 사용하여 클라이언트 측 핸들러를 지정하면 추가 스팬 태그와 두 요소를 얻을 수 없습니다.


답변

Asp.net CheckBox는 OnClientClick 메서드를 지원하지 않습니다.
asp : CheckBox에 자바 스크립트 이벤트를 추가하려면 서버 코드의 “Pre_Render”또는 “Page_Load”이벤트에 관련 속성을 추가해야합니다.

씨#:

    private void Page_Load(object sender, EventArgs e)
    {
        SomeCheckBoxId.Attributes["onclick"] = "MyJavaScriptMethod(this);";
    }

참고 : 페이지 머리글에 AutoEventWireup = “false”를 설정하지 마십시오.

VB :

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SomeCheckBoxId.Attributes("onclick") = "MyJavaScriptMethod(this);"
    End Sub


답변

다음과 같이 태그를 수행 할 수 있습니다.

<asp:CheckBox runat="server" ID="ckRouteNow" Text="Send Now" OnClick="checkchanged(this)" />

호출 된 JavaScript의 .checked 속성이 정확합니다 … 확인란의 현재 상태 :

  function checkchanged(obj) {
      alert(obj.checked)
  }