11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour, je viens d'écrire un scripte qui fait la recherche d'une chaine tapé par le clavier dans une liste déroulante. Tout marche bien mais il y a un seul probléme est que la recherche donne une plus d'importance au premier lettre c'est à dire :
si j'ai les deux mots "chien" et "etoile"dans la liste et quand je tappe tout le mot "chien" dans ma recherche, à l'instant où j'arrive à la lettre "e" , le pointeur se pointe sur etoile alors je veux qu'il reste sur le mot "chien". J'espére que j'ai bien expliqué mon problème et merci pour vos aides.
le scripte est :

<html>
<head>
<title>Liste déroulante éditable</title>




<script language="JavaScript" type="text/javascript">
//Variable globale contenant les chaines frappees (par listbox)             
var tb_chaines_rechfrappe = new Array();
 
// Gestion de la frappe clavier (fonction à mettre sur l'evt onkeyup de la listebox) :
//  - select : objet select
//  - e : objet event
function capte_rechfrappe(select,e) {
	var code = 0;
	var car = '';
 
         //Récuperation du code de la touche frappee
	if(parseInt(navigator.appVersion) >=4){
		if(navigator.appName == 'Netscape'){ // Pour Netscape, firefox, ...
			code = e.which;
		} else { // pour Internet Explorer
			code = e.keyCode;
		}
	}
 
         //Si la touche est une lettre ou un nombre on incremente la chaine globale et on lance la selection sur la listebox
	if((code>=65 && code<=90) || (code>=48 && code<=57)){
		car = String.fromCharCode(code);
 
		if ((typeof tb_chaines_rechfrappe[select.name])=='undefined')
			tb_chaines_rechfrappe[select.name] = car;
		else
			tb_chaines_rechfrappe[select.name] += car;
 
		document.getElementsByName('texte')[0].value=tb_chaines_rechfrappe[select.name];
		document.getElementsByName('code')[0].value=code;	
		placeListe_rechfrappe(select);
	}
}
 
//Placement sur la liste :
//  - select : objet select
function placeListe_rechfrappe(select) {
 
	var str_chaine = new String(tb_chaines_rechfrappe[select.name]);
	var elem_select = false;
 
         //On parcourt toute la liste d'options
	for(i=0;i<select.options.length;i++) {
		var option_text = select.options[i].text;
		var str_option_text = new String(option_text);
 
		str_option_text = str_option_text.toUpperCase();
 
                  //Si le debut de la chaine 'text' de l'option correspond a la chaine saisie on selection l'option
		if((str_option_text.substr(0,str_chaine.length) == str_chaine) && !elem_select) {
			select.options[i].selected=true;
			elem_select = true;
		}
	}
}
 
//Reinitialisation de la chaine de frappe (fonction à mettre sur l'evt onBlur de la listebox) :
//  - select : objet select
function reinit_rechfrappe(select) {
	tb_chaines_rechfrappe[select.name] = '';
}
 
</script>
 


</head>
 
<body bgcolor="#FFFFFF" text="#000000">
<form name="form">
 
<select name='selectbox[truc]' onkeyup='javascript:capte_rechfrappe(this,event);' onBlur='javascript:reinit_rechfrappe(this);'>
	<option>maison</option>
	<option>miel</option>
 	<option>mariage</option>
	<option>chien</option>
	<option>chemin</option>
	<option>chat</option>
 	<option>etoile</option>
</select>
<input type=text name='code'>
<input type=text name='texte'>
</form>
</body>
</html>
Modérateur
Bonjour,

Lorsqu'un select a le focus et est déployé, et que tu entres des caractères au clavier, le navigateur va par défaut positionner le select sur le champ dont le contenu commence par les lettres que tu entres au clavier (y a des temporisations en plus : si on attend un peu, il réinitialise la chaine).

Si tu ne désactives pas ce mécanisme, alors tu vas obtenir n'importe quoi si tu fais toi aussi quelque chose sur ton select avec tes scripts.

Amicalement,
Modérateur
Bonjour,

Qu'est-ce que tu veux faire en fait ? Je ne vois pas trop le but de ton script vu que le select fait déjà tout ça par défaut.

Amicalement,
Modifié par parsimonhi (15 Jan 2019 - 12:54)
Bon mon objectif est:
si j'ai deux mots dans la liste par exemple "chien" et "etoile " et quand je tappe dans le clavier le "e" du mot chien il ne retourne pas vers étoile. car dans mon cas si je tappe "che" le curseur retourne automatiquement vers etoile car elle commence par "e".
Modérateur
Bonjour,

Encore une fois, ce que tu cherches à faire est le comportement par défaut du navigateur.

Tu fais le test : tu retires ton script, tu affiches ta page, et tu cliques sur le select. Puis tu entres "chie" au clavier. Normalement, si tu as tapé assez vite, "chien" sera sélectionné.

Sinon, si tu tiens absolument à le faire via ton script (peut-être pour avoir le temps de taper tranquillement tes lettres au clavier ?), la première question est :
- veux-tu ce résultat quand le select est déployé ou bien refermé en ayant le focus, ou bien dans les deux cas ?

Amicalement,
Modérateur
Bonjour,

Je ne vois pas qui pourrait faire ça à part Ethan Hunt !

Le problème, c'est que quand le select est ouvert, il n'y a pas forcément d'évènements générés quand tu tapes quelque chose au clavier. Du coup, tes scripts ne seront jamais déclenchés.

Une solution est de te construire un select maison sans utiliser la balise select. Mais bon, faut vraiment avoir de bonnes raisons avant de se lancer là-dedans.

Amicalement,
Bonjour, j'ai pas compris votre phrase: "Une solution est de te construire un select maison sans utiliser la balise select. Mais bon, faut vraiment avoir de bonnes raisons avant de se lancer là-dedans." Smiley ravi
Modérateur
Bonjour,

Ça veut dire par exemple qu'au lieu d'une balise select et des balises options, tu peux par exemple utiliser une balise ul et des balises li. Ensuite, avec javascript, tu te débrouilles pour que ça se comporte comme un select quand un utilisateur fait quelque chose.

Pourquoi faut-il avoir de bonnes raisons pour ça : parce que ça va te prendre pas mal de temps à le réaliser.

Amicalement,