asp:CheckBoxのOnClickとOnClientClick?


83

asp:Buttonのように、asp:CheckBoxのクライアント側のjavascriptハンドラーが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が同じように機能しないのか疑問に思っています...)

回答:


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 2009

それは別のことです、私はasp:checkboxが不必要に追加のスパンをレンダリングするという事実が好きではありません。
SolutionYogi

1
まあ、それらのいくつか。onclickを入力自体に配置しますが、onClientClickをスパンに配置します。奇妙な!
Stobor 2009

ワオ。ウェブコントロールを使ってからしばらく経ちましたので、記憶が薄れていきます。レンダリングされたHTMLがどのように見えるかを制御したいので、HTMLコントロールを使用することを好みます。
SolutionYogi

2
そのドキュメントは実際には.Net1.1からのものです。私の知る限り、ASP .NetにはCheckBoxのOnClickサーバー側イベントがないため、OnClickまたはOnClientClickを作成すると、それを認識しないため、デフォルトの動作であるため、作成した内容が正確にレンダリングされます(私が間違っていなければ)
Sergio Rosas 2013年

9

それらは2つの異なる種類のコントロールであるため...

ほら、あなたのウェブブラウザはサーバーサイドプログラミングについて知らない。それはそれ自身の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」イベントをサポートするブラウザはどこにもありません...

疑わしい場合は、ブラウザに送信される出力のソースを常に表示してください...表示できるデバッグ情報は世界中にあります。



6

サーバーサイド OnClickハンドラーを探してここに来た人にとっては、OnCheckedChanged


1
これはサーバー側のイベントであり、クライアント側のイベントではありません。存在しません。
プロテクター

1

警告とメッセージをクリーンアップしていて、VSがそれについて警告していることを確認しました:検証(ASP.Net):属性 'OnClick'は要素 'CheckBox'の有効な属性ではありません。html入力コントロールを使用してクライアント側ハンドラーを指定すると、余分なスパンタグと2つの要素を取得できなくなります。


興味深い...それは私がしばらく引き継いだプロジェクトであり、そこに役立つものを見つけるには警告が多すぎました...正しく覚えていれば、HTMLコントロールを使用することの欠点はサーバーを実行できないことですそれと-側の操作...
Stobor

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

呼び出されたJavaScriptの.checkedプロパティは正しくなります...チェックボックスの現在の状態:

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

-2

1つの解決策はJQueryを使用することです。

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

Seconf関数}がありません
Mahdi jokar 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.