Onclick vs OnClientClick for en asp: avmerkingsbokser?

stemmer
81

Er det noen som vet hvorfor en klientsiden javascript behandleren for asp: avmerkingsbokser må være en onclick = attributt i stedet for en OnClientClick = attributt, som for asp: Button?

For eksempel, fungerer dette:

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

og dette gjør ikke (ingen feil):

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

men dette fungerer:

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

og dette ikke (kompilering feil):

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

(Jeg vet hva Button.OnClick er for, jeg lurer på hvorfor avmerkingsbokser ikke fungerer på samme måte ...)

Publisert på 16/07/2009 klokken 02:27
kilden bruker
På andre språk...                            


8 svar

stemmer
8

Du har rett dette er inkonsekvent. Det som skjer er at avmerkingsbokser ikke har en server-side onclick arrangementet, slik at markup blir gjengitt i nettleseren. http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkbox_events.aspx

Mens Button har en onclick - så ASP.NET forventer en referanse til en hendelse i onclick markup.

Svarte 16/07/2009 kl. 02:34
kilden bruker

stemmer
98

Det er veldig rart. Jeg sjekket avmerkingsbokser dokumentasjon som leser

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

Som du kan se, er det ingen onclick eller OnClientClick attributter definert.

Med dette i tankene, tror jeg dette er hva som skjer.

Når du gjør dette,

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

ASP.NET endrer ikke onclick-attributtet og gjør det som er på nettleseren. Det ville bli gjengitt som:

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

Selvsagt kan en nettleser forstå onClick og setter et varsel.

Og i dette scenariet

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

Igjen, ASP.NET vil ikke endre OnClientClick attributt, og vil gjøre det som

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

Som leseren ikke vil forstå OnClientClick ingenting vil skje. Det vil heller ikke heve noen feil som det er bare en annen egenskap.

Du kan bekrefte ovenfor ved å se på gjengitt HTML.

Og ja, dette er ikke intuitiv i det hele tatt.

Svarte 16/07/2009 kl. 02:35
kilden bruker

stemmer
8

Fordi de er to forskjellige typer kontroller ...

Du skjønner, nettleseren ikke vet om server side programmering. det bare vet om sin egen DOM og hendelses modeller som den bruker ... Og for klikk hendelser på objekter som ytes til det. Du bør undersøke den endelige markering som faktisk er sendt til nettleseren fra ASP.Net å se forskjellene selv.

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

gjengir til

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

og

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

gjengir til

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

Nå, så nær som jeg kan huske, er det ingen nettlesere hvor som helst som støtter "OnClientClick" hendelse i sin DOM ...

Når du er i tvil, alltid vise kilden av produksjonen som den sendes til nettleseren ... det er en hel verden av debug informasjon som du kan se.

Svarte 16/07/2009 kl. 02:39
kilden bruker

stemmer
1

Jeg var å rydde opp advarsler og meldinger og se at VS advare om det: Validation (ASP.Net): Egenskap onClick er ikke en gyldig egenskap av elementet 'boksen'. Bruk html innspill kontrollen for å angi en klientsiden handler og da vil du ikke få ekstra span tag og de to elementene.

Svarte 03/10/2010 kl. 20:56
kilden bruker

stemmer
5

For de av dere som kom hit på jakt etter den server-side OnClickhandler detOnCheckedChanged

Svarte 29/11/2012 kl. 16:00
kilden bruker

stemmer
-1

En løsning er med JQuery:

$(document).ready(
    function () {
        $('#mycheckboxId').click(function () {
               // here the action or function to call
        });
    }
);
Svarte 19/01/2015 kl. 16:17
kilden bruker

stemmer
0

Du kan gjøre koden som dette:

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

Den .checked eiendom i kalles Javascript vil være riktig ... den nåværende tilstanden i boksen:

  function checkchanged(obj) {
      alert(obj.checked)
  }
Svarte 14/02/2018 kl. 21:28
kilden bruker

stemmer
0

Asp.net avmerkingsbokser ikke støtter metoden OnClientClick.
Hvis du ønsker å legge til noen javascript hendelse til Asp: avmerkingsbokser du må legge til relaterte attributter på "Pre_Render" eller på "Page_Load" hendelser i serverkode:

C #:

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

Merk: Pass på å ikke sette AutoEventWireup = "false" i side spissen.

VB:

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SomeCheckBoxId.Attributes("onclick") = "MyJavaScriptMethod(this);"
    End Sub
Svarte 19/12/2018 kl. 12:29
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more