4 <meta http-equiv=
"content-type" content=
"text/html; charset=UTF-8">
5 <meta name=
"author" content=
"Permondes (see permondes.de)">
6 <meta name=
"date" content=
"2019-12-17a">
8 <title>Permondes Pocket Calculator
</title>
10 <!-- Taschenrechner, adopted from https://wiki.selfhtml.org/wiki/JavaScript/Tutorials/Taschenrechner
12 = | <enter>: Ergebnis berechnen
15 ln| "l": natürlicher Logarithmus
16 ANS|"a": answer, letztes Resultat
17 STO|"s": store in memory
18 RCL|"m": recall memory
19 ENG|"n": notation (exponential / norm)
20 ESC|"c": zurücksetzen auf Null
23 <!-- style ------------------------------------------------------------------------------------------------------------>
29 /* form of calculator */
31 border:
1px solid dimgray;
33 box-shadow: inset
0 0 1px LightGray;
34 display: inline-block;
40 /* input and output area fieldset */
45 #f_Eingabe, #f_Ergebnis, #f_Formel {
50 padding:
0.2em
1em; /* top, bottom:
0; left, right:
1 */
59 /* buttens fieldset */
67 border:
2px #
222222 outset;
68 background-image: linear-gradient(to bottom right, #
222222, #
585858);
81 <!-- script ------------------------------------------------------------------------------------------------------------>
86 v_Formel, v_Ergebnis, v_Eingabe,
88 v_FormularOverwrite = true,
91 // convert a number to text taking into account the notation
92 function convertNumToText(p_notation, p_number) {
94 if (p_notation ==
"ENG") {
95 v_text = p_number.toExponential();
97 v_text = p_number.toString();
102 function toggleNotation() {
111 v_Ergebnis.value = convertNumToText(notation, ans);
114 /* clear Formular field */
115 function clear_Formular () {
120 function key_clear () {
121 v_Eingabe.value =
"";
123 v_Ergebnis.value =
"";
126 /* delete last character */
127 function deletechar () {
128 v_Eingabe.value = v_Eingabe.value.substr(
0, v_Eingabe.value.length-
1);
131 /* input of number, decimal point, e or () */
132 function key_number (c) {
133 if (c ==
",") {
c=
"."}
134 v_Eingabe.value += c;
137 function getLastResult () {
138 v_Eingabe.value = convertNumToText(notation, ans);
142 function memory_store () {
146 function memory_recall () {
147 v_Eingabe.value = convertNumToText(notation, mem);
151 /* Basic arithmetics */
152 function operator_function (c) {
153 if (v_FormularOverwrite) {
155 v_FormularOverwrite = false; }
156 v_Formel.value +=
" " + v_Eingabe.value +
" " + c; // Operatoren sind durch Leerzeichen von den Zahlen getrennt
157 v_Eingabe.value =
"";
160 /* In der Funktion extra() werden Math Berechnungen durchgeführt */
161 function extra_function (type) {
164 v_Eingabe.value = Math.sqrt(v_Eingabe.value);
167 v_Eingabe.value = Math.pow(v_Eingabe.value,
2);
170 v_Eingabe.value = Math.log(v_Eingabe.value);
175 // Bei einem Klick auf = (oder bei passender Benutzung der Tastatur) berechnet die Funktion result() das Ergebnis.
176 // Mit einem RegEx werden nur Ziffern, der Dezimalpunkt und die vier Operatoren als gültige Zeichen für die Berechnung zugelassen (inklusive möglicher Leerzeichen). Dabei werden die üblichen Tastenbeschriftungen für Multiplikation und Division durch ihre JavaScript-Entsprechungen ersetzt. Das eigentliche Rechenergebnis wird mit der window-Methode eval berechnet.
178 operator_function(
"");
180 input = v_Formel.value,
184 // replace × with * and ÷ with / for eval()
185 input = input.replace(/×/g,
"*").replace(/÷/g,
"/");
187 // remove anything else that is not allowed here
188 input = input.replace(/[^
0-
9.e() +\-*\/]/g,
"");
196 // v_Ergebnis.textContent = convertNumToText(notation, r);
197 v_Formel.value = v_Formel.value +
"=";
198 v_Ergebnis.value = convertNumToText(notation, r);
199 v_FormularOverwrite = true;
203 /* Der Eventhandler DOMContentLoaded wird ausgelöst, wenn das DOM vollständig aufgebaut,
204 aber noch nicht alle externen Ressourcen wie z.B. Bilder geladen sind.. */
205 document.addEventListener(
"DOMContentLoaded", function () {
207 v_Formel = document.getElementById(
"f_Formel");
208 v_Ergebnis = document.getElementById(
"f_Ergebnis");
209 v_Eingabe = document.getElementById(
"f_Eingabe");
211 var form = document.getElementById(
"calc");
213 /* click-handling für alle buttons in #calc erstellen */
214 document.querySelectorAll(
"#calc button").forEach(function (b) {
215 var c = b.textContent;
232 b.addEventListener(
"click", function () { key_number(c); });
236 b.addEventListener(
"click", function () {getLastResult(); });
240 b.addEventListener(
"click", function () { memory_store(); });
243 b.addEventListener(
"click", function () { memory_recall(); });
250 b.addEventListener(
"click", function () { operator_function(c); });
256 b.addEventListener(
"click", function () { extra_function(c); });
260 b.addEventListener(
"click", function () { deletechar() } );
264 b.addEventListener(
"click", function () {key_clear() });
268 b.addEventListener(
"click", function () {result() });
272 b.addEventListener(
"click", function () {toggleNotation();});
278 /* reacting on keypress */
279 document.addEventListener(
"keyup", function (ev) {
301 extra_function(
"ln");
307 extra_function(
"x²");
309 case
"Escape": //
<escape> to clear display
313 case
"Backspace": //
<backspace> to remove
1 char
320 operator_function(c);
340 /* Da der Taschenrechner ein einzeiliges Formularfeld enthält,
341 kann dieses Formular jederzeit mit Betätigung der Eingabetaste abgesendet werden.
342 Ein Absenden ist im Zusammenhang mit dem Taschenrechner jedoch unerwünscht.
343 Deshalb wird mit addEventListener eine Funktion an das submit-Event des
<form>-Elements gebunden, die verhindert,
344 dass der Browser das Standardverhalten beim Absenden eines Formulars ausführt: */
345 form.addEventListener(
"submit", function (ev) {
346 // prevent form submission and page reload
348 ev.stopPropagation();
351 form.addEventListener(
"dblclick", function (ev) {
353 ev.stopPropagation();
364 <!-- body -------------------------------------------------------------------------------------------------------------->
366 <h1>Permondes
<br/>Pocket Calculator
</h1>
369 <fieldset class=
"cl_IO">
370 <input id=
"f_Formel" readonly
></input>
371 <input id=
"f_Ergebnis" readonly
></input>
372 <input id=
"f_Eingabe" readonly
></input>
374 <fieldset class=
"cl_Buttons">
378 <button> </button>
379 <button> </button>