11545 sujets

JavaScript, DOM et API Web HTML5

Salut!
Voici tout d'abord le code fautif.

<select name='logiciel' id='logiciel' onchange="javascript:logi();return false;">


et la fonction en question
<script type="javascript/text">
function logi()
{
  if (document.ajout.logiciel.value=='11') {
     val=prompt("Entrez le nom de l'application","Autres");
     while (val=='' || val==null) {
           val=prompt("Entrez le nom de l'application","Autres");
     } ;
     document.ajout.autres.value=val;
  }
}

</script>


C'est simple quand je change de valeur dans ma liste déroulante rien ne se passe.
J'ai placé un alert au début de la fonction et il ne s'affiche pas.
Par contre si je le place à la place (sorry pour le doublon) de l'appel de la fonction il s'affiche.

Quelle est mon erreur?
Modifié par Pops83 (09 Aug 2005 - 07:31)
Lu,

tu n'as pas besoin de javascript: et le "return false" tu dois le gérer dans ta fonction.

++
ça ne fonctionne toujours pas malgré la suppression de javascript: et de return false!

Question: comment le gérer dans la fonction?
Ceci n'est pas non plus correct :


<script type="javascript/text">


C'est :


<script type="text/javascript">


Sinon il y a un message d'erreur?
Bonjour,
Quel est le but de cette fonction ? Si j'ai bien compris, si l'utilisateur choisit "Autre" dans ta liste, une boîte de saisie s'affiche, permettant à l'utiliateur de modifier l'entrée de la liste ?
Désolé pour le double post, c'est un peu ma maladie, mais en relisant le code plusieurs fois, j'ai quelques remarques à faire :

Utilise la syntaxe conseillé pour l'accès aux éléments de formulaire
c'est-à-dire : document.forms['nom_du_formulaire'].elements['nom_de_element'].value au lieu de document.nom_formulaire.nom_de_element.value
Cette syntaxe est conseillée car elle peut résoudre certains problèmes de compatibilité. La première version fonctionne aussi, mais elle est deprecated.

Ensuite une autre remarque : tu ne dois pas obliger l'utilisateur à saisir quelque chose s'il a envie d'annuler son choix au dernier moment. Tu dois toujours laisser à l'utiliateur le choix d'annuler.
Or avec ta boucle while, tu fais tournier le script en boucle tant que l'utilisateur annule ou ne rentre rien dans la boîte. Tu dois pouvoir gérer l'annulation en ne modifiant pas l'état de la liste. Le return false/true peut justement être utilisé pour cela : return tru indique que le navigateur doit accepter le changement d'état qui a provoqué l'évènement, return false indique au contraire que le navigateur doit ignorer le changement. Pour expliquer cette différence, prenons par exemple une zone de texte qui réceptionne l'évènement clavier. Avec return true la lettre tapée est affichée normalement, avec return false, elle est ignorée et donc pas affichée. Dans le cas de ta liste, un return false devrait logiquement laisser sélectionnée l'élément qui y était avant l'intervention de l'utilisateur.

Voilà, c'était un peu long, j'espère que je n'ai embrouillé personne.
Sans parler de comportement, juste au niveau de la syntaxe, j'avais un peu lu ce topic de travers et c'est vrai qu'il y a des remarques à faire comme par exemple la possibilité d'envoyer la référence de l'objet courant(le select):


<select name='logiciel' id='logiciel' onchange="logi(this);">


Ensuite ta fonction se présentera ainsi:


function logi(obj) {
 // ...
}


Enfin, voici la manière d'accéder à une valeur d'un option d'une liste de sélection en prenant en compte le paramètre obj.


obj.options[obj.selectedIndex].value


++
Merci de ces réponses complémentaires.
En fait la solution était simplement l'inversion de Javascript/text et text/javascript

Il me semblait pourtant l'avoir bien écrit et le script fonctionnait avant.

Peut etre un problème de sauvegarde avec une ancienne version.

Pour les autres versions je vais m'y atteler. je vais essayer de changer ma méthode.
Comment Récupérer le fait que l'utilisateur ait appuyé sur annuler?

J'ai chercher partout(enfin presque) et je n'ai pas trouvé.
Tout simplement:


if (confirm('Sûr ?')) {
  // code pour le oui, par ex return true;
}
else
{
  // code pour le non, par ex return false;
}