OnClick vs OnClientClick для asp: флажок?


кто-нибудь знает, почему обработчик javascript на стороне клиента для ASP:CheckBox должен быть атрибутом OnClick="", а не атрибутом OnClientClick="", как для ASP:Button?

например, это работает:

<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');" />

(Я знаю, какая кнопка.OnClick для; Мне интересно, почему флажок Не работает точно так же...)

7 81

7 ответов:

это очень странно. Я проверил флажок страница документации, который читает

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

и да,это совсем не интуитивно.

вы правы, это несовместимо. Происходит то, что флажок не имеет события OnClick на стороне сервера, поэтому ваша разметка отображается в браузере. http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkbox_events.aspx

в то время как кнопка имеет OnClick-так ASP.NET ожидает ссылку на событие в разметке OnClick.

потому что это два разных вида контроля...

вы видите, ваш браузер не знает о программировании на стороне сервера. он знает только о своем собственном 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);" />

теперь, насколько я помню, нигде нет браузеров, которые поддерживают событие "OnClientClick" в своем DOM...

если вы сомневаетесь, всегда просматривайте источник вывода, когда он отправляется в браузер... существует целый мир отладочной информации, которую вы можете видеть.

для тех из вас, кто попал сюда в поисках серверной части OnClick обработчик это OnCheckedChanged

я убирал предупреждения и сообщения и вижу, что VS предупреждает об этом: Валидация (ASP.Net): атрибут ' OnClick 'не является допустимым атрибутом элемента'CheckBox'. Используйте элемент управления вводом html для указания обработчика на стороне клиента, и тогда вы не получите дополнительный тег span и два элемента.

вы можете сделать тег следующим образом:

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

The .проверенное свойство в вызываемом JavaScript будет правильным...текущее состояние флажка:

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

одно решение с JQuery:

$(document).ready(
    function () {
        $('#mycheckboxId').click(function () {
               // here the action or function to call
        });
    }
);