JavaScript Scriptoptimierung für Input-Textfeld->DropDown-Liste

du-doch-nicht

Banned
Registriert
Juni 2014
Beiträge
9
Guten Abend,

vorab möchte ich euch erläutern was das Script machen soll.

In einem Formular ist ein Input-Textfeld. Beim anklicken soll darunter eine Liste mit alternativen Eingabemöglichkeiten erscheinen (ähnlich wie das HTML5 "datalist" Tag) die der Benutzer anklicken kann und im Textfeld übernommen wird, beim auswählen schließt die Liste automatisch.

Der Benutzer hat aber auch die Freiheit, etwas anderes ins Textfeld ein zu geben. Beim verlassen des Textfeldes wird die Liste geschlossen.


Meine Frage:

Das "setTimeOut" soll die onBlur-Aktion verzögern, da meine Liste ausserhalb des Textfeldes liegt und ich sonst keine Auswahl anklicken kann, weil die Liste sofort verschwindet da ich ja das Inputfeld verlasse. Das setTimeout gibt mir eine gewisse Zeit dennoch eine Auswahl anzuklicken und diese im Inputfeld übernommen wird, bevor die Liste geschlossen wird.

Ich habe aber gemerkt, wenn man langsam den Link in der Liste klickt, wird die Auswahl nicht ins Textfeld übernommen.
Langsam in dem Fall, wenn man die Auswahl mit der Maus anklickt, aber in den 200ms die Maustaste nicht loslässt, wird die Auswahl nicht übernommen.

Gibt es für "setTimeOut" eine alternative? Oder wie kann das Script umgeschrieben werden, damit es zu 100% funktioniert?

Ich kenn mich mit Javascript noch nicht so gut aus. Wäre sehr dankbar für eure Hilfe :-)



Quellcode: oder http://jsfiddle.net/YdSy6/
HTML:
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<meta charset="utf-8">
<style>

* { font-family: Arial, Helvetica, sans-serif; }

ul.datalist {
	border: 1px solid #CCC;
	width: 200px;
	box-shadow: 0 0 5px #DDD;
	position: absolute;
	z-index: 1;
	margin-top: -17px;
	padding: 0;
	display: none;
	background: #FFF;
	font-size: 0.9em;
}
ul.datalist li {
	display: block;
	margin: 0;
	list-style-type: none;
	cursor: pointer;
	padding: 5px;
	border-bottom: 1px solid #EEE;
}
ul.datalist li:hover {
	background-color: #C00;
	color: #FFF;
}

</style>
</head>

<body>

<p>
	<strong>Erstellt von:</strong><br />
	<input type="text" id="ipt2" name="bearbeiter" value=""
		onClick="drop('2','','open');" onBlur="drop('2','','close');" />
</p>

<ul id="dl2" class="datalist">
	<li onClick="drop('2','Max Mustermann','');">Max Mustermann</li>
	<li onClick="drop('2','Axel Springer','');">Axel Springer</li>
	<li onClick="drop('2','John Doe','');">John Doe</li>
</ul>

<script>
function drop(id,val,opt)
{
	var elem = document.getElementById("dl" + id);
	if(opt == "open")
	{
		elem.style.display = "block";
	}
	else if (opt == "close")
	{
		setTimeout(function () { elem.style.display = "none"; }, 300);
	}
	else
	{
		document.getElementById("ipt" + id).value = val;
	}
}
</script>

</body>
</html>
 
Zuletzt bearbeitet: (Link hinzugefügt)
Ehm, wieso nicht einfach Datalist verwenden?
So ein Dropdown ist verdammt schwer (vernünftig) zu Programmieren. Dein Versuch deckt z.B. überhaupt nicht die Bedienung mit der Tastatur ab und wenn es Barrierefrei sein soll, wird es noch deutlich komplexer.
Es gibt im Web Polyfills für Datalist, dann geht das auch in alten Browsern.
 
Hallo T0a5tbr0t,

"datalist" ist eine Autocomplete-Lösung, was ich nicht wirklich gebrauchen kann. Ein paar entscheidende Dinge funktionieren nicht, wie ich es mir vorstelle. Wenn eine Eingabe im Textfeld exisitiert und ich mich doch für eine andere Eingabe aus der Liste entscheide, erscheint keine Liste. Erst nachdem ich die Eingabe aus dem Feld lösche und Doppelklick auf das Inputfeld tätige erscheint die Liste und kann etwas auswählen.

Desweiteren ist "datalist" sehr unfelexibel wenn es um CSS-Anpassungen geht.

Ich setzte mein Script nur im Intranet ein und muss vorerst nicht Barrierefrei sein!
Ergänzung ()

Weiß niemand, wie ich mein Script verbessern kann, damit es besser läuft? Es muss ja eine andere Möglichkeit geben, das "setTimeOut" durch ein anderen Code zu ersetzen!?


LiveLink zum Quellcode: http://jsfiddle.net/YdSy6/
 
Zuletzt bearbeitet: (Link hinzugefügt)
Zurück
Oben