84

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

4

9 に答える 9

108

それはとても奇妙です。チェックボックスのドキュメントページを確認しました。

<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を見ると、上記で確認できます。

そして、はい、これはまったく直感的ではありません。

于 2009-07-16T02:35:02.817 に答える
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」イベントをサポートするブラウザはどこにもありません...

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

于 2009-07-16T02:39:39.067 に答える
8

あなたは正しいですこれは一貫性がありません。何が起こっているのかというと、CheckBoxにはサーバー側のOnClickイベントがないため、マークアップがブラウザーにレンダリングされます。 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkbox_events.aspx

ButtonにはOnClickがありますが、ASP.NETはOnClickマークアップ内のイベントへの参照を想定しています。

于 2009-07-16T02:34:12.163 に答える
6

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

于 2012-11-29T16:00:35.070 に答える
1

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

于 2010-10-03T20:56:55.770 に答える
1

Asp.netCheckBoxはメソッド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
于 2018-12-19T12:29:54.620 に答える
0

次のようにタグを作成できます。

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

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

  function checkchanged(obj) {
      alert(obj.checked)
  }
于 2018-02-14T21:28:45.803 に答える
0

すべてのチェックボックスに機能を割り当てて、その中で確認を求めることができます。[はい]を選択した場合、チェックボックスは変更されないままである場合は変更できます。

私の場合、Autopostback = "True"属性を持つリピーター(またはグリッド)内のASP .Netチェックボックスも使用しているため、サーバー側では、送信された値と現在データベースにあるものを比較して、確認値を確認する必要があります。 「はい」の場合にのみdbを選択して更新します。

$(document).ready(function () {
    $('input[type=checkbox]').click(function(){                
        var areYouSure = confirm('Are you sure you want make this change?');
        if (areYouSure) {
            $(this).prop('checked', this.checked);
        } else {
            $(this).prop('checked', !this.checked);
        }
    });
}); 


<asp:CheckBox ID="chk" AutoPostBack="true" onCheckedChanged="chk_SelectedIndexChanged" runat="server" Checked='<%#Eval("FinancialAid") %>' />

protected void chk_SelectedIndexChanged(Object sender, EventArgs e)
{
    using (myDataContext db = new myDataDataContext())
    {
        CheckBox chk = (CheckBox)sender;
        RepeaterItem row = (RepeaterItem) chk.NamingContainer;            
        var studentID = ((Label) row.FindControl("lblID")).Text;
        var z = (from b in db.StudentApplicants
        where b.StudentID == studentID
        select b).FirstOrDefault();                
        if(chk != null && chk.Checked != z.FinancialAid){
            z.FinancialAid = chk.Checked;                
            z.ModifiedDate = DateTime.Now;
            db.SubmitChanges();
            BindGrid();
        }
        gvData.DataBind();
    }
}
于 2021-01-11T21:38:28.193 に答える
-2

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

$(document).ready(
    function () {
        $('#mycheckboxId').click(function () {
               // here the action or function to call
        });
    }
);
于 2015-01-19T16:17:44.393 に答える