OnClick vs OnClientClick for an asp: CheckBox?


83

Có ai biết tại sao trình xử lý javascript phía máy khách cho asp: CheckBox cần phải là thuộc tính OnClick = "" thay vì thuộc tính OnClientClick = "", như đối với asp: Button không?

Ví dụ, điều này hoạt động:

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

và điều này không (không có lỗi):

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

nhưng điều này hoạt động:

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

và điều này không xảy ra (lỗi thời gian biên dịch):

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

(Tôi biết Button.OnClick dùng để làm gì; tôi tự hỏi tại sao CheckBox không hoạt động theo cách tương tự ...)

Câu trả lời:


106

Điều đó rất kỳ lạ. Tôi đã kiểm tra trang tài liệu CheckBox có nội dung

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

Như bạn có thể thấy, không có thuộc tính OnClick hoặc OnClientClick nào được xác định.

Luôn ghi nhớ điều này, tôi nghĩ đây là những gì đang xảy ra.

Khi bạn làm điều này,

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

ASP.NET không sửa đổi thuộc tính OnClick và hiển thị nó như trên trình duyệt. Nó sẽ được hiển thị dưới dạng:

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

Rõ ràng, một trình duyệt có thể hiểu 'OnClick' và đưa ra cảnh báo.

Và trong kịch bản này

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

Một lần nữa, ASP.NET sẽ không thay đổi thuộc tính OnClientClick và sẽ hiển thị nó dưới dạng

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

Vì trình duyệt không hiểu OnClientClick sẽ không có gì xảy ra. Nó cũng sẽ không gây ra bất kỳ lỗi nào vì nó chỉ là một thuộc tính khác.

Bạn có thể xác nhận ở trên bằng cách xem HTML được hiển thị.

Và vâng, điều này không trực quan chút nào.


Tốt cuộc gọi. Tôi chỉ cần kiểm tra html tạo ra, và nó thực sự đặt thuộc tính nó không hiểu vào một khoảng xung quanh đầu vào hộp kiểm, nhưng nếu không bạn nói đúng ...
Stobor

Đó là một điều khác, tôi không thích thực tế là hộp kiểm asp: hiển thị một khoảng bổ sung không cần thiết.
SolutionYogi,

1
Vâng, một số trong số họ. Nó đặt onclick vào chính đầu vào, nhưng onClientClick vào span. Kỳ dị!
Stobor

Chà. Đã lâu rồi tôi không sử dụng các điều khiển web nên trí nhớ của tôi ngày càng mờ nhạt. Tôi thích sử dụng các điều khiển HTML hơn vì tôi muốn kiểm soát HTML được hiển thị của mình trông như thế nào.
SolutionYogi,

2
Tài liệu đó thực sự là từ .Net 1.1. Theo như tôi biết, ASP .Net không có sự kiện phía máy chủ OnClick cho CheckBox, vì vậy khi bạn viết OnClick hoặc OnClientClick, vì nó không biết, nó hiển thị chính xác những gì bạn đã viết, vì đó là hành vi mặc định của nó ( nếu tôi không nhầm)
Sergio Rosas

9

Bởi vì chúng là hai loại điều khiển khác nhau ...

Bạn thấy đấy, trình duyệt web của bạn không biết về lập trình phía máy chủ. nó chỉ biết về DOM của chính nó và các mô hình sự kiện mà nó sử dụng ... Và đối với các sự kiện nhấp chuột của các đối tượng được hiển thị cho nó. Bạn nên kiểm tra đánh dấu cuối cùng thực sự được gửi đến trình duyệt từ ASP.Net để xem sự khác biệt của bản thân bạn.

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

ám chỉ

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

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

ám chỉ

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

Bây giờ, gần như tôi có thể nhớ lại, không có trình duyệt nào ở bất kỳ đâu hỗ trợ sự kiện "OnClientClick" trong DOM của họ ...

Khi nghi ngờ, hãy luôn xem nguồn của đầu ra khi nó được gửi đến trình duyệt ... có cả một thế giới thông tin gỡ lỗi mà bạn có thể thấy.



6

Đối với những người ở đây tìm kiếm trình xử lý phía máy chủ, OnClick nó làOnCheckedChanged


1
Đó là sự kiện phía máy chủ, không phải sự kiện phía máy khách; mà không tồn tại.
Người bảo vệ một

1

Tôi đang dọn dẹp các cảnh báo và thông báo và thấy rằng VS có cảnh báo về điều đó: Xác thực (ASP.Net): Thuộc tính 'OnClick' không phải là thuộc tính hợp lệ của phần tử 'CheckBox'. Sử dụng điều khiển đầu vào html để chỉ định trình xử lý phía máy khách và sau đó bạn sẽ không nhận được thẻ span bổ sung và hai phần tử.


Thật thú vị ... Đó là một dự án mà tôi đã tiếp quản trong một thời gian, và nó có quá nhiều cảnh báo để thấy bất cứ điều gì hữu ích trong đó ... Nếu tôi nhớ không lầm, nhược điểm của việc sử dụng điều khiển HTML là bạn không thể làm máy chủ. thao tác -side với nó ...
Stobor

1

Asp.net CheckBox không hỗ trợ phương pháp OnClientClick.
Nếu bạn muốn thêm một số sự kiện javascript vào asp: CheckBox, bạn phải thêm các thuộc tính liên quan trên "Pre_Render" hoặc trên các sự kiện "Page_Load" trong mã máy chủ:

C #:

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

Lưu ý: Đảm bảo bạn không đặt AutoEventWireup = "false" trong tiêu đề trang.

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

Bạn có thể làm thẻ như sau:

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

Thuộc tính .checked trong JavaScript được gọi sẽ chính xác ... trạng thái hiện tại của hộp kiểm:

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

-2

Một giải pháp là với JQuery:

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

Hàm Seconf} bị thiếu
Mahdi jokar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.