2009-04-09 8 views
10

textbox le problème que je suis confronté est la suivante:Appel Javascript événement onchange en changeant la valeur programatically

  • J'ai une zone de texte pour une plage de dates le long du côté un contrôle de calendrier.
  • Lorsque l'utilisateur sélectionne une date dans le calendrier, il la remplit dans la zone de texte
  • Lorsque cela se produit, je souhaite déclencher une fonction javascript, mais l'événement 'onchange' ne semble pas se produire.

Je voudrais idéalement être en mesure d'ajouter l'événement comme un attribut à la zone de texte, quelque chose comme:

txtCreateDate.Attributes.Add("onchange", string.Format("JSfunction({0},'{1}');", arg1, arg2)); 

merci à l'avance

plus d'info: La date est entrée dans la zone de texte dans C#. Le contrôle de calendrier a un eventhandler sur la page. Lorsqu'une date est sélectionnée, le gestionnaire d'événement place la date dans la zone de texte. J'ai essayé de mettre l'accent sur la zone de texte à ce stade, puis de mettre un attribut onBlur dans la zone de texte, mais la zone de texte ne semble jamais avoir le focus. Je suppose que je pourrais appeler directement la fonction javascript à ce stade en faisant ClientScript.RegisterClientScriptBlock ou quelque chose comme ça, mais cela semble bâclé et ne fonctionne jamais comme je le veux.

Répondre

7

Vous interprétez mal ce que l'événement onchange fait lorsqu'il est appliqué à une zone de texte. Il ne tirera pas tant qu'il ne perdra pas le focus ou que vous ne frapperez pas. Pourquoi ne pas tirer la fonction d'un onchange sur le select qui remplit la zone de texte?

Vérifiez ici pour en savoir plus sur l'événement onchange: w3schools

2

Onchange est uniquement déclenché lorsque l'utilisateur saisit quelque chose au clavier. Un possible peut être d'abord de focaliser le champ de texte, puis de le modifier.

Mais pourquoi ne pas récupérer l'événement lorsque l'utilisateur clique sur une date? Il doit déjà y avoir du javascript.

+0

La date est définie dans la txtbox en utilisant C#, pas javascript. J'ai essayé de mettre l'accent sur la zone de texte à ce stade et en utilisant l'événement onBlur, mais la zone de texte ne semble jamais avoir le focus correctement. –

+0

@ Matthew-Cela n'a aucun sens. Si la date est définie sur le serveur, quel problème avez-vous appelé sur l'événement Onchange si vous êtes déjà sur le serveur dans une fonction? – TStamper

-4

Le « onchange » est tiré uniquement lorsque l'attribut est modifié ou programme lorsque l'utilisateur effectue un changement et se concentre ensuite hors du champ.

Avez-vous regardé l'utilisation de l'objet de calendrier de YUI? J'ai codé une solution qui place le calendrier yui dans un panneau yui et cache le panneau jusqu'à ce qu'une image associée soit cliquée. Je suis capable de voir les changements de l'un ou l'autre.

http://developer.yahoo.com/yui/examples/calendar/formtxt.html

+5

L'événement onchange ne sera pas déclenché lors de la modification de la valeur d'une entrée par programmation. –

7

Vous pouvez déclencher l'événement simplement avec

 
document.getElementById("elementID").onchange(); 

Je ne sais pas si ce travail ne marche pas sur certains navigateurs, mais il devrait fonctionner sur FF 3 et IE 7+

+0

Je dois le faire depuis C#, pas javascript. –

+0

@ matthew_360: Vous ne pouvez pas appeler/lancer un événement JavaScript à partir de C#. – palswim

1

Vous La population est du côté serveur. Utiliser le registerclientscript placera le script au début du formulaire .. vous devrez utiliser RegisterStartupScript (Block) pour placer le script à la fin de la page en question.

Le premier essaie d'exécuter le script avant que la zone de texte existe dans le dom, le dernier exécutera le script après la création de cet élément dans la page.

18

Ceci est une vieille question, et je ne suis pas sûr si cela va aider, mais j'ai pu tirer un événement en utilisant programatically:

if (document.createEvent && ctrl.dispatchEvent) { 
    var evt = document.createEvent("HTMLEvents"); 
    evt.initEvent("change", true, true); 
    ctrl.dispatchEvent(evt); // for DOM-compliant browsers 
} else if (ctrl.fireEvent) { 
    ctrl.fireEvent("onchange"); // for IE 
} 
+1

Bien que votre commentaire soit ancien, il a sauvé ma journée aujourd'hui :) Merci! Une petite remarque, je voudrais inverser l'ordre des contrôles, IE 9 prend en charge la fonction de répartition, il serait donc préférable de vérifier d'abord la version conforme DOM et si cela échoue revenir en mode IE, cela force de nouveaux navigateurs (comme IE 9) pour utiliser les techniques les plus récentes (et compatibles). – Gertjan

0

Vous pouvez le mettre dans une autre classe et puis appelez une fonction. Cela fonctionne lorsque ajax refresh

$(document).on("change", ".inputQty", function(e) { 

//Call a function(input,input); 
}); 
Questions connexes