OnClick проти OnClientClick для переходу: CheckBox?


83

Хтось знає, чому обробник 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');" />

(Я знаю, для чого призначений Button.OnClick; мені цікаво, чому CheckBox не працює однаково ...)

Відповіді:


106

Це дуже дивно. Я перевірив сторінку документації 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.

І так, це зовсім не інтуїтивно.


Гарний дзвінок. Я щойно перевірив згенерований html, і він насправді розміщує атрибути, які він не розуміє, у певний проміжок навколо вхідного поля, але в іншому випадку ви маєте рацію ...
Stobor

Це інша річ, мені не подобається той факт, що прапорець asp: надає додатковий проміжок без потреби.
SolutionYogi

1
Ну, деякі з них. Він поміщає onclick у сам вхід, але onClientClick у діапазон. Дивно!
Stobor

Ого. Минув час з тих пір, як я користувався веб-елементами керування, тому пам’ять згасає. Я вважаю за краще використовувати елементи керування HTML, оскільки хочу контролювати, як виглядає мій відтворений HTML.
SolutionYogi

2
Ця документація насправді належить до .Net 1.1. Наскільки мені відомо, ASP .Net не має події на сервері OnClick для CheckBox, тому, коли ви пишете OnClick або OnClientClick, оскільки він цього не знає, він відображає саме те, що ви написали, оскільки це поведінка за замовчуванням ( якщо я не помиляюся)
Серхіо Росас

9

Тому що це два різні типи елементів керування ...

Розумієте, ваш веб-браузер не знає про програмування на стороні сервера. він знає лише про свій власний 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 ...

Якщо ви сумніваєтесь, завжди переглядайте джерело вихідних даних, коли воно надсилається браузеру ... Ви можете бачити цілий світ інформації про налагодження.


8

Ви праві, це непослідовно. Що відбувається, так це те, що CheckBox НЕ МАЄ серверної події OnClick, тому ваша розмітка відображається у браузері. http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkbox_events.aspx

Тоді як кнопка має OnClick - тому ASP.NET очікує посилання на подію у вашій розмітці OnClick.


6

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


1
Це подія на стороні сервера, а не на стороні клієнта; якого не існує.
Захисник один

1

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


Цікаво ... Це був проект, яким я взявся на деякий час, і він мав забагато попереджень, щоб побачити там щось корисне ... Якщо я добре пам’ятаю, недоліком використання елемента управління HTML є те, що ти не можеш робити сервер -бокові маніпуляції з ним ...
Стобор

1

Asp.net CheckBox не підтримує метод OnClientClick.
Якщо ви хочете додати якусь подію javascript до asp: CheckBox, вам потрібно додати пов’язані атрибути до подій "Pre_Render" або до подій "Page_Load" у коді сервера:

C #:

    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

0

Ви можете зробити тег таким чином:

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

Властивість. Provjeреного у викликаному JavaScript буде правильним ... поточний стан прапорця:

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

-2

Одним із рішень є JQuery:

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

Функція Seconf} відсутня
Махді Джокар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.