2009-07-16 10 views
78

Est-ce que quelqu'un sait pourquoi un gestionnaire javascript côté client pour asp: CheckBox doit être un attribut OnClick = "" plutôt qu'un attribut OnClientClick = "", comme pour asp: Button?OnClick vs OnClientClick pour un ASP: CheckBox?

Par exemple, cela fonctionne:

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

et cela ne (pas d'erreur):

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

mais cela fonctionne:

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

et cela ne (erreur de compilation):

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

(Je sais à quoi sert Button.OnClick; Je me demande pourquoi CheckBox ne fonctionne pas de la même manière ...)

Répondre

93

C'est très bizarre. J'ai vérifié le CheckBox documentation page qui se lit

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

Comme vous pouvez le voir, il n'y a pas d'attributs OnClick ou OnClientClick défini. En gardant cela à l'esprit, je pense que c'est ce qui se passe.

Quand vous faites cela,

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

ASP.NET ne modifie pas l'attribut OnClick et il rend tout comme sur le navigateur. Il serait rendu comme:

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

De toute évidence, un navigateur peut comprendre «OnClick» et met une alerte.

Et dans ce scénario

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

Encore une fois, ASP.NET ne changera pas l'attribut et OnClientClick va le rendre comme

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

Comme navigateur ne comprend rien OnClientClick qui va se passer. Il ne soulèvera pas non plus d'erreur car c'est juste un autre attribut.

Vous pouvez confirmer ci-dessus en regardant le HTML rendu.

Et oui, ce n'est pas du tout intuitif.

+0

Bon appel. Je viens de vérifier le code html généré, et il est en train de mettre des attributs qu'il ne comprend pas dans un intervalle autour de l'entrée checkbox, mais sinon vous avez raison ... – Stobor

+0

C'est une autre chose, je n'aime pas le fait que asp: checkbox rend une portée supplémentaire inutilement. – SolutionYogi

+0

Eh bien, certains d'entre eux. Il met onclick dans l'entrée elle-même, mais onClientClick dans l'intervalle. Bizarre! – Stobor

8

Parce qu'ils sont deux types différents de contrôles ...

Vous voyez, votre navigateur web ne connaît pas la programmation côté serveur. il ne connaît que son propre DOM et les modèles d'événements qu'il utilise ... Et pour les événements de clic des objets qui lui sont rendus.Vous devriez examiner le balisage final qui est réellement envoyé au navigateur à partir d'ASP.Net pour voir les différences vous-même.

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

rend à

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

et

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

rend à

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

Maintenant, autant que je me souvienne, il n'y a pas des navigateurs partout qui prennent en charge la Evénement "OnClientClick" dans leur DOM ... 01 En cas de doute, visualisez toujours la source de la sortie telle qu'elle est envoyée au navigateur ... il y a tout un monde d'informations de débogage que vous pouvez voir.

1

Je nettoyais les avertissements et les messages et je voyais que VS en avertissait: Validation (ASP.Net): L'attribut 'OnClick' n'est pas un attribut valide de l'élément 'CheckBox'. Utilisez le contrôle d'entrée html pour spécifier un gestionnaire côté client, puis vous n'obtiendrez pas la balise span supplémentaire et les deux éléments.

+0

Intéressant ... C'était un projet que j'ai repris pendant un moment, et il y avait trop d'avertissements pour y voir quelque chose d'utile ... Si je me souviens bien, l'inconvénient d'utiliser le Le contrôle HTML est que vous ne pouvez pas effectuer de manipulations côté serveur avec ... – Stobor

5

Pour ceux d'entre vous qui suis arrivé ici à la recherche du côté serveur OnClick gestionnaire est OnCheckedChanged

+0

C'est l'événement côté serveur, pas l'événement côté client; qui n'existe pas. –

-1

Une solution est avec JQuery:

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

Passez en revue cette réponse, ce code a des erreurs de syntaxe. – ianaya89

+0

La fonction Seconf} est manquante –

0

Vous pouvez faire le tag comme ceci:

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

La propriété .checked dans le JavaScript appelé sera correcte ... l'état actuel de la case à cocher:

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