Sie sind hier:  Home > Forum
 
Zurück   dsl-user.de Board - DSL - Hilfe - DSL einrichten > Computer und WWW > Für Webmaster
Benutzername
Kennwort

Für Webmaster Alles was mit dem Erstellen zu tun hat, HTML, XML, PHP, Webspace

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 10.04.2007, 17:04
Benutzerbild von Quidoff
wie auch immer
 
Registriert seit: 03.04.2004
Ort: Jossgrund
Alter: 23
Beiträge: 1.016
Question [JavaScript] Problem mit der String-Zahlenumwandlung

Hallo,
ich habe Eingabefelder auf einer Seite, in die man nur die Zahlen von 0 bis 15 eingeben kann.
Im Internet Explorer und im Firefox tritt das Phänomen auf, dass die Eingabe "08" und "09" verworfen wird. Die Zahlen "00" bis "07" funktionieren aber.
Das ist mein Code:
HTML-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>String-Zahlenumwandlung<title>
</head>

<body>
<form action="" method="get">
	Deutsch: <input name="deutsch" type="text" /><br/>
	Mathe: <input name="mathe" type="text" /><br/>
	Englisch: <input name="englisch" type="text" />
</form>

<script type="text/javascript">
<!--
	var inputs = document.getElementsByTagName('form')[0].getElementsByTagName('input');

	for(var i=0; i < inputs.length; i++) {
		var input = inputs[i];
		if(input.type=="text") {					
			input.onblur = function() {
				if(this.value.length>2 || parseInt(this.value)>15 || parseInt(this.value)<0 || parseInt(this.value)!=String(this.value)) {
					this.value='';
				}
			}
		}
	}
//-->
</script>
</body>
</html>
Die Eingabe ist also auf jeden Fall falsch, wenn die Länge des eingegebenen String größer ist als 2 (man soll also auch nur "00" bis "15" eingeben können und nicht "000" bis "015"). Es ist auch falsch, wenn die Zahl größer als 15 oder kleiner als 0 ist. Mit der letzten Bedingung prüfe ich, ob der Zahlenwert der Eingabe mit der Eingabe an sich übereinstimmt. Wenn man z.B. "1a" eingibt, dann ist der Zahlenwert "1", aber das entspricht nicht der Eingabe.
Wie gesagt ist diese letzte Bedingung wohl für die Eingabe von "08" und "09" im Internet Explorer und Firefox wahr.
Warum funktioniert es bei dieses Eingaben nicht?

//edit
Hier könnt ihr den Code als Seite sehen. In Opera 9.1 tritt das Problem nicht auf.

Mfg
Quidoff
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 10.04.2007, 23:31
Benutzerbild von logiman87
îî__ !! ich liebe ihn !!
 
Registriert seit: 11.05.2002
Ort: Stuttgart
Alter: 24
Beiträge: 1.842
Also ich würde das Problem elegant umgehen.
Wenn Du mal einen parseInt auf dein this.value per alert ausgeben lässt, dann siehst Du, dass die vorangestellten Nullen über parseInt gelöscht werden. Logisch, ein Integerfeld kennt keine vorangestellten Nullen.

Workaround:

Code:
if(this.value.length>2 || parseInt(this.value)>15 || parseInt(this.value)<0) {
statt
Code:
if(this.value.length>2 || parseInt(this.value)>15 || parseInt(this.value)<0 || parseInt(this.value)!=String(this.value)) {
Warum funktioniert es trotzdem korrekt? (Sogar mit den vorangestellten Nullen? )
Jeder Wert, der nicht ausschließlich aus Ziffern besteht, ist kein valider Integerwert und fällt damit druch deine beiden Größenüberprüfungen durch.

Warum jetzt aber die beiden Werte im Firefox und IE durchfallen kann ich Dir nicht sagen...
Weil eigentlich stimmt der String-Wert mit vorangestellten Nullen niemals mit dem parseInt-Wert überein.
__________________
Mit Zitat antworten
  #3 (permalink)  
Alt 10.04.2007, 23:47
Benutzerbild von Quidoff
wie auch immer
 
Registriert seit: 03.04.2004
Ort: Jossgrund
Alter: 23
Beiträge: 1.016
Zitat:
Jeder Wert, der nicht ausschließlich aus Ziffern besteht, ist kein valider Integerwert und fällt damit druch deine beiden Größenüberprüfungen durch.
Das stimmt nicht: parseInt() versucht so viele Zeichen wie möglich in Zahlen umzuwandeln und bricht erst ab, wenn es keine Zahlen mehr gibt. "1a" wird durch parseInt() zu einer "1" und würde bei den Prüfungen deshalb nicht durchfallen.

Ich habe das Problem aber inzwischen gelöst. Und zwar liegt es an einer anderen Implementierung der parseInt()-Funktion in den Browsern. Opera nimmt den ersten Parameter als Zahl im Dezimalsystem an. Firefox und Internet Explorer allerdings als Oktalzahl. Das erklärt, warum es ab "08" nicht mehr funktioniert, denn diese Zahl gibt es nicht im Oktalsystem. Mit dem zweiten Parameter kann man das Zahlensystem allerdings explizit bestimmen.
Die richtige Zeile lautet also folgendermaßen:
Code:
if(this.value.length>2 || parseInt(this.value, 10)>15 || parseInt(this.value, 10)<0 || parseInt(this.value, 10)!=String(this.value)) {
Dadurch geht alles klar.

Danke trotzdem für deine Antwort.
Mit Zitat antworten
Sponsored Links
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an



Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
© 2002-2012 - www.dsl-user.de -