1. Code
  2. JavaScript

Erstellen eines unglaublichen jQuery-Rechners

Scroll to top

German (Deutsch) translation by Tatsiana Bochkareva (you can also view the original English article)

Sicher ist es schön, einen Brieföffner direkt neben Ihrem Postkorb, einen Schuhlöffel neben Ihren Slippern und eine Taschenlampe neben Ihrem Nachttisch zu haben. Ebenso ist es schön, einen Taschenrechner zur Hand zu haben, wenn Sie etwas rechnen müssen. Dieses Tutorial und der Download zeigen Ihnen, wie Sie eine Website korrigieren können.


Überlegungen zur Benutzeroberfläche


Einige Tasten mit den Nummern 1 bis 9, einigen Funktionen und einer großen "Gleich" -Taste. Das ist alles, was ein Taschenrechner ist, oder?  Muss es ein Stück Kuchen sein. Jede Programmiersprache kann damit problemlos umgehen. Natürlich, aber selbst etwas so Einfaches wie ein Taschenrechner muss einige Dinge berücksichtigen, wenn er entwirft, wie genau es funktioniert.

Der Screencast, der diesem Artikel beiliegt, konzentriert sich hauptsächlich auf diese Dinge und weniger auf die heruntergekommene Codierung. Während dieser schriftliche Teil auf den Code konzentriert wird. Trotzdem hier ein kurzer Überblick über einige der kleinen Details der Benutzeroberfläche:

  • Wenn der Rechner geladen wird, wird 0 (zero) im Display angezeigt. Durch Drücken der Nummer 2 wird nicht die Nummer 02, sondern nur 2.
  • Wenn Sie eine Funktionstaste drücken, wird die aktuell im Display angezeigte Zahl als erste Zahl in der Berechnung "gesperrt", bleibt jedoch genau dort, wo sie sich befindet. Wenn eine andere Nummer gedrückt wird, wird die Nummer ersetzt.
  • Wenn eine Funktionstaste gedrückt wird und dann eine andere Funktionstaste gedrückt wird, ist die zuletzt verwendete Funktion die zuletzt gedrückte.
  • Nachdem eine Berechnung durchgeführt wurde, gibt es zwei mögliche Szenarien. A) Eine neue Nummer wird gedrückt. Dadurch wird der Rechner vollständig zurückgesetzt und mit dieser Nummer neu gestartet. B) Eine Funktionstaste wird gedrückt, die die Summe als "erste" Zahl sperrt, so dass eine zweite Berechnung für die Summe durchgeführt werden kann
  • Die Schaltfläche zum Löschen muss sich wie angekündigt verhalten und den Rechner vollständig zurücksetzen
  • Gegebenenfalls muss visuelles Feedback verwendet werden. Noch wichtiger ist jedoch, dass die Funktionalität dem Standard entspricht, der von zig Taschenrechnern auf Desktops weltweit festgelegt wurde.

Die Liste könnte sogar weitergehen, aber Sie sehen, dass selbst die einfachsten Schnittstellen viel Aufmerksamkeit erfordern.


Das HTML-Markup

Nichts Besonderes hier. Wir brauchen einen Container für den Taschenrechner, wir brauchen eine Anzeige und wir brauchen ein paar Knöpfe. <div>, <input>, und <a> werden gut funktionieren. JavaScript erledigt hier die ganze Arbeit, es findet keine "anmutige Degradition" statt. Wenn JavaScript deaktiviert ist, funktioniert dieser Rechner nicht, sodass wir ihn nur vollständig ausblenden. Wir werden dies also nicht zu einer echten <form> machen. Warum also die <input>? Durch Eingaben kann Text manuell eingegeben werden, was wir zulassen werden. Sie ermöglichen eine einfache Auswahl und verfügen über das Attribut "Wert", das zum Abrufen und Einstellen praktisch ist.

Hier ist das ganze Kit und Kaboodle:

1
<div id="calculator"> 
2
 
3
	<input type="text" id="display" /> 
4
		 
5
	<a class="num-button seven" href="#">7</a> 
6
	<a class="num-button eight" href="#">8</a> 
7
	<a class="num-button nine" href="#">9</a> 
8
	 
9
	<a class="num-button four" href="#">4</a> 
10
	<a class="num-button five" href="#">5</a> 
11
	<a class="num-button six" href="#">6</a> 
12
	 
13
	<a class="num-button one" href="#">1</a> 
14
	<a class="num-button two" href="#">2</a> 
15
	<a class="num-button three" href="#">3</a> 
16
	 
17
	<a class="num-button zero" href="#">0</a> 
18
	<a class="num-button dot" href="#">.</a> 
19
	<a class="clear-button clear" href="#">C</a> 
20
	 
21
	<a class="function-button add" href="#"> </a> 
22
	<a class="function-button subtract" href="#">&ndash;</a> 
23
	<a class="function-button multiply" href="#">x</a> 
24
	<a class="function-button divide" href="#">/</a> 
25
	 
26
	<a class="equals-button" href="#">=</a> 
27
		 
28
</div>

Vollbild

Please accept preferences cookies to load this content.


Erstellen der Bilder


Wir brauchen nur wenige. Der Hintergrund des gesamten Rechners, eine Schaltfläche im Stil "number", eine Schaltfläche im Stil "function" und die Schaltfläche "equals". Jede Zahl und Funktion benötigt kein eigenes Bild, wir legen nur Text direkt darüber. Ich denke, "Arial Black" macht eine schöne fette und rechnerähnliche Schrift.

Später, wenn wir den Rechner öffnen und schließen, verwenden wir die "Mini" -Rechnergrafik und die "Schließen" -Schaltfläche.


Styling mit CSS

Auch hier nichts Besonderes. Absolute Positionierung erledigt den größten Teil der Grunzarbeit, damit die Dinge dahin gehen, wo sie hin sollen. Wir setzen die position: relative auf dem Rechner div selbst und dann können wir uns absolut darin positionieren.

Hier ist viel davon:

1
*				{ margin: 0; padding: 0; } 
2
body				{ font: 25px "Arial Black", Arial, Sans-Serif; } 
3
 
4
#page-wrap		    	{ width: 500px; margin: 25px auto; } 
5
 
6
h1				{ font-size: 22px; } 
7
p				{ font: 14px Arial, Sans-Serif; } 
8
a				{ color: black; text-decoration: none; outline: none; } 
9
 
10
#calculator			{ width: 266px; height: 400px; background: url(../images/calc-bg.png) no-repeat; 
11
	 			  position: relative; display: none; } 
12
 
13
#display 			{ background: none; border: none; position: absolute;  
14
				  top: 15px; left: 15px; width: 197px; text-align: right; 
15
			  	  font: 35px "Arial Black", Arial, Sans-Serif; } 
16
					 
17
.num-button			{ width: 44px; height: 41px; padding: 3px 0 0 0; text-align: center;  
18
	 		      	  background: url(../images/button-bg.png) no-repeat;  
19
				  position: absolute; display: block; } 
20
.clear-button			{ width: 44px; height: 41px; padding: 3px 0 0 0; text-align: center;  
21
	 		          background: url(../images/button-bg.png) no-repeat;  
22
				  position: absolute; display: block; } 
23
.function-button    		{ width: 44px; height: 41px; padding: 3px 0 0 0; text-align: center;  
24
	 		          background: url(../images/function-button-bg.png) no-repeat;  
25
				  position: absolute; display: block; } 
26
.function-button:active, 
27
.pendingFunction    		{ background-position: bottom left; } 
28
					 
29
.seven				{ top: 86px; left: 15px; } 
30
.eight				{ top: 86px; left: 66px; } 
31
.nine				{ top: 86px; left: 118px; } 
32
 
33
/* ... the rest of the buttons ... */ 
34
 
35
.multiply			{ top: 188px; left: 169px; } 
36
.divide				{ top: 237px; left: 169px; } 
37
 
38
.equals-button			{ width: 206px; height: 42px; text-align: center; top: 293px; left: 15px; 
39
	 			  background: url(../images/equals-bg.png) no-repeat; position: absolute;  
40
				  display: block; }

Einrichten der jQuery-Umgebung

Im HTML selbst müssen wir einige Aufrufe vornehmen, um uns auf das Schreiben unseres eigenen jQuery-JavaScript vorzubereiten. Laden Sie nämlich die jQuery- und jQuery-UI-Bibliotheken und rufen Sie unsere bald vorhandene JavaScript-Datei auf.

1
<script src="http://www.google.com/jsapi" type="text/javascript"></script> 
2
<script type="text/javascript"> 
3
    google.load("jquery", "1.3.1"); 
4
</script> 
5
<script type="text/javascript" src="js/jquery-ui-personalized-1.6rc6.min.js"></script> 
6
<script type="text/javascript" src="js/example.js"></script>

Einrichten

Lassen Sie uns die Grundlagen erläutern. Wir benötigen die klassische Anweisung "Wenn das DOM fertig ist", um die Dinge zu starten. Dies ist allen JavaScript gemeinsam, da wir mit Elementen nichts tun möchten, bevor sie alle geladen wurden. Dann richten wir einige grundlegende Ereignisse ein, von denen wir wissen, dass sie eintreten werden. Wir haben ein Klickereignis und eine Funktion für jeden Schaltflächentyp. Wir werden auch die jQuery-UI-Funktion aufrufen, um unseren Taschenrechner ziehbar zu machen, sowie die winzige kleine Funktion, mit der die Sichtbarkeit umgeschaltet werden kann.

1
$(function(){ 
2
		 
3
	$(".num-button").click(function(){ 
4
		// do stuff 

5
	}); 
6
	 
7
	$(".clear-button").click(function(){ 
8
		// do stuff 

9
	}); 
10
	 
11
	$(".function-button").click(function(){ 
12
		// do stuff 

13
	}); 
14
	 
15
	$(".equals-button").click(function(){ 
16
	     // do stuff 

17
	}); 
18
	 
19
	$("#calculator").draggable(); 
20
	 
21
	$("#opener, #closer").click(function(){ 
22
		$("#opener").toggle(); 
23
		$("#calculator").toggle(); 
24
	}); 
25
	 
26
});

Verwenden von .data() für Variablen, nicht für Globale

Variablen in JavaScript sind lokal für die Funktion, in der sie erstellt wurden. Wenn Sie eine an eine andere übergeben müssen, übergeben Sie sie als Parameter, wenn Sie die neue Funktion aufrufen. Das ist alles schön und gut, aber wir haben sieben davon und die meisten unserer Funktionen werden sie alle auf die eine oder andere Weise brauchen. Das könnte die ganze Zeit ein bisschen haarig werden. Was wir wirklich brauchen, sind globale Variablen, aber so wie ich es verstehe, ist das eine Art Nein-Nein (etwas, das gegen Namespaces verstößt).

jQuery hat sowieso eine bessere Möglichkeit, mit der Funktion data() umzugehen. Wir können "Daten" an jedes jQuery-Objekt anhängen, und diese Daten werden mit diesem Objekt überall hin übertragen. Grundsätzlich wie ein Attribut, nur Sie können es nicht wirklich im DOM sehen. Dies macht im Grunde das, was globale Variablen für uns tun würden, und es ist genauso einfach zu bedienen. Hier sind die Datenbits, die wir verwenden werden:

  • ValueOne - Die erste Zahl in der Gleichung
  • ValueOneLocked - Ist diese erste Nummer einsatzbereit?
  • ValueTwo - Die zweite Zahl in der Gleichung
  • ValueTwoLocked - Ist diese zweite Nummer einsatzbereit?
  • isPendingFunction - Ist eine Funktion ausgewählt?
  • thePendingFunction - Welche?
  • fromPrevious - Wurde NUR eine Berechnung durchgeführt?

Wir werden diese Datenbits an die Eingabe #display anhängen, die sozusagen das Gehirn unseres Rechners sein wird. Ein bisschen macht Sinn. Wir müssen Standardwerte für all diese Datenbits einrichten, aber lassen Sie uns einen Moment darüber nachdenken. Wir könnten es in der Hauptfunktion richtig machen, aber seien wir schlau und abstrahieren es zu einer Funktion. Es wird mehrere Szenarien geben, in denen wir diese Werte zurücksetzen müssen. Erstellen wir also eine Funktion namens resetCalculator, um die Aufgabe zu erledigen. Dann können wir diese Funktion jederzeit aufrufen. Akzeptieren wir auch einen Zahlenparameter und setzen den Rechner auf diesen Wert zurück. Wenn der Rechner geladen wird, ist dies Null, aber nach einer Funktion werden wir erneut zurücksetzen und nur auf den endgültigen Wert der Berechnung zurücksetzen.

1
function resetCalculator(curValue) { 
2
	$("#display").val(curValue); 
3
	$(".function-button").removeClass("pendingFunction"); 
4
	$("#display").data("isPendingFunction", false); 
5
	$("#display").data("thePendingFunction", ""); 
6
	$("#display").data("valueOneLocked", false); 
7
	$("#display").data("valueTwoLocked", false); 
8
	$("#display").data("valueOne", curValue); 
9
	$("#display").data("valueTwo", 0); 
10
	$("#display").data("fromPrevious", false); 
11
}

Wenn Sie auf eine Zahl klicken...

Wie sich herausstellt, ist das, was der Taschenrechner tut, wenn Sie auf eine Zahl klicken, das komplizierteste Stück Code in der ganzen Sache. Es gibt vier "Zustände", in denen sich der Rechner befinden kann, und er verhält sich je nach Zustand unterschiedlich, wenn Sie auf eine Zahl klicken. Sie sind:

  • A) Klicken Sie auf eine Nummer in einem völlig neuen Zustand (Anzeige zeigt zero) oder wenn noch keine Nummer gesperrt ist.
  • B) Klicken Sie auf eine Zahl, nachdem gerade eine Funktionstaste ausgewählt wurde.
  • C) Klicken Sie auf eine Nummer, nachdem eine Funktionstaste ausgewählt und zusätzliche Nummern eingegeben wurden.
  • D) Klicken Sie auf eine Zahl, nachdem gerade eine Berechnung durchgeführt wurde.

Unser Verhalten muss wie folgt sein:

  • A) Fügen Sie die neue Nummer an das an, was bereits vorhanden ist. Wenn es eine Null ist, ersetzen Sie diese.
  • B) Sperren Sie die erste Nummer und ersetzen Sie die Anzeige durch die neue Nummer.
  • C) Fügen Sie die neue Nummer an das an, was bereits vorhanden ist.
  • D) Setzen Sie den Rechner auf diese Nummer zurück.

Und hier ist alles im Code:

1
$(".num-button").click(function(){ 
2
 
3
	if ($("#display").data("fromPrevious") == true) { 
4
 
5
		resetCalculator($(this).text()); 
6
	 
7
	} else if (($("#display").data("isPendingFunction") == true) && ($("#display").data("valueOneLocked") == false)) { 
8
	 
9
		$("#display").data("valueOne", $("#display").val()); 
10
		$("#display").data("valueOneLocked", true); 
11
	 
12
		$("#display").val($(this).text()); 
13
		$("#display").data("valueTwo", $("#display").val()); 
14
		$("#display").data("valueTwoLocked", true); 
15
 
16
	// Clicking a number AGAIN, after first number locked and already value for second number	 

17
	} else if (($("#display").data("isPendingFunction") == true) && ($("#display").data("valueOneLocked") == true)) { 
18
 
19
		var curValue = $("#display").val(); 
20
		var toAdd = $(this).text(); 
21
 
22
		var newValue = curValue   toAdd; 
23
 
24
		$("#display").val(newValue); 
25
	 
26
		$("#display").data("valueTwo", $("#display").val()); 
27
		$("#display").data("valueTwoLocked", true); 
28
 
29
	// Clicking on a number fresh	 

30
	} else { 
31
 
32
		var curValue = $("#display").val(); 
33
		if (curValue == "0") { 
34
			curValue = ""; 
35
		} 
36
 
37
		var toAdd = $(this).text(); 
38
 
39
		var newValue = curValue   toAdd; 
40
 
41
		$("#display").val(newValue); 
42
 
43
	} 
44
	 
45
});

Die Funktionstaste ist einfacher zu handhaben. Wenn Sie darauf klicken, wird die erste Nummer gesperrt, sodass die Zifferntasten wissen, dass es Zeit ist, die zweite Nummer zu starten. Es gibt jedoch eine besondere Überlegung, und das ist zu tun, wenn eine Funktionstaste unmittelbar nach der Durchführung einer Berechnung gedrückt wird. In diesem Fall muss die erste Nummer als Endwert festgelegt werden und bereits bereit sein, diese zweite Nummer zu akzeptieren. Dies ermöglicht die Verkettung von Berechnungen, was sehr nützlich ist.

Wenn Sie darauf klicken, werden alle Funktionstasten von einer speziellen "pendingFunction" -Klasse gelöscht, und diese Klasse wird dann auf die bestimmte angeklickte Klasse angewendet. Dies gibt uns die CSS-Steuerung, um die Hintergrundposition zu verschieben und visuelles Feedback zu geben, welche Funktion derzeit aktiv ist.


1
$(".function-button").click(function(){ 
2
 
3
	if ($("#display").data("fromPrevious") == true) { 
4
		resetCalculator($("#display").val()); 
5
		$("#display").data("valueOneLocked", false); 
6
		$("#display").data("fromPrevious", false) 
7
	} 
8
	 
9
	// Let it be known that a function has been selected 

10
	var pendingFunction = $(this).text(); 
11
	$("#display").data("isPendingFunction", true); 
12
	$("#display").data("thePendingFunction", pendingFunction); 
13
	 
14
	// Visually represent the current function 

15
	$(".function-button").removeClass("pendingFunction"); 
16
	$(this).addClass("pendingFunction"); 
17
});

Und die Antwort ist...

Die Gleichheitsfunktion ist auch ziemlich einfach. Als erstes prüfen wir, ob wir tatsächlich bereit sind, Berechnungen durchzuführen. Wir wissen das, wenn BEIDE Nummern "gesperrt" sind. Wenn dies der Fall ist, rechnen Sie ein wenig, um die endgültige Zahl zu erhalten, und setzen Sie dann den Rechner auf diesen endgültigen Wert zurück (und setzen Sie "fromPrevious" auf "true", damit wir den empfindlichen Zustand kennen, in dem wir uns befinden).

Wenn die Nummern nicht gesperrt sind ... nichts tun.

1
$(".equals-button").click(function(){ 
2
 
3
	if (($("#display").data("valueOneLocked") == true) && ($("#display").data("valueTwoLocked") == true)) { 
4
		 
5
		if ($("#display").data("thePendingFunction") == " ") { 
6
			var finalValue = parseFloat($("#display").data("valueOne"))   parseFloat($("#display").data("valueTwo")); 
7
		} else if ($("#display").data("thePendingFunction") == "%u2013") { 
8
			var finalValue = parseFloat($("#display").data("valueOne")) - parseFloat($("#display").data("valueTwo")); 
9
		} else if ($("#display").data("thePendingFunction") == "x") { 
10
			var finalValue = parseFloat($("#display").data("valueOne")) * parseFloat($("#display").data("valueTwo")); 
11
		} else if ($("#display").data("thePendingFunction") == "/") { 
12
			var finalValue = parseFloat($("#display").data("valueOne")) / parseFloat($("#display").data("valueTwo")); 
13
		} 
14
		 
15
		$("#display").val(finalValue); 
16
					 
17
		resetCalculator(finalValue); 
18
		$("#display").data("fromPrevious", true); 
19
					 
20
	} else { 
21
		// both numbers are not locked, do nothing. 

22
	} 
23
	 
24
});

KLAR!

Last but not least ist der Löschknopf der einfachste von allen. Drücken Sie darauf und löschen Sie den Rechner auf Zero.

1
$(".clear-button").click(function(){ 
2
	resetCalculator("0"); 
3
});

Und wir sind fertig



Das macht es Leute. Ich hoffe, zwischen dem Live-Beispiel, dem Screencast und diesem schriftlichen Tutorial war dies eine wertvolle Lernsitzung. Ich habe sicherlich ein paar Dinge gelernt, als ich es erstellt habe. Wenn Sie sich äußerst nützliche Anwendungen dafür vorstellen können, kontaktieren Sie mich und lassen Sie es mich wissen.