2009-07-16 6 views
78

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

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

<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 не работает одинаково ...)

ответ

93

Это очень странно. Я проверил CheckBox documentation page, который читает

<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-код.

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

+0

Хороший звонок. Я только что проверил сгенерированный html, и на самом деле он помещает атрибуты, которые он не понимает, в диапазон вокруг ввода флажка, но в противном случае вы правы ... – Stobor

+0

Другое дело, мне не нравится тот факт, что asp: checkbox лишний раз изливает лишний промежуток. – SolutionYogi

+0

Ну, некоторые из них. Он помещает onclick в сам вход, но onClientClick в диапазон. Weird! – Stobor

8

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

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

8

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

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

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

1

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

+0

Интересный ... Это был проект, который я взял на себя на некоторое время, и у него было слишком много предупреждений, чтобы увидеть что-нибудь полезное там ... Если я правильно помню, недостаток в использовании Управление HTML состоит в том, что вы не можете делать с ним серверные манипуляции ... – Stobor

5

Для тех из вас, кто был здесь, глядя на стороне сервера OnClick обработчика оно OnCheckedChanged

+0

Это событие на стороне сервера, а не событие на стороне клиента; которого нет. –

-1

Одно из решений с JQuery:

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

Просмотрите этот ответ, этот код имеет синтаксические ошибки. – ianaya89

+0

Функция Seconf} отсутствует –

0

Вы можете сделать тег, как это:

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

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

function checkchanged(obj) { 
     alert(obj.checked) 
    } 
Смежные вопросы