Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.javascript > #4851
| From | Thomas 'PointedEars' Lahn <PointedEars@web.de> |
|---|---|
| Newsgroups | de.comp.lang.javascript |
| Subject | Re: Doppelte Eingabe |
| Date | 2017-02-02 21:02 +0100 |
| Organization | PointedEars Software (PES) |
| Message-ID | <3978478.cEBGB3zze1@PointedEars.de> (permalink) |
| References | <o6uvk2$qva$1@news.albasani.net> <1t58931f77i3f82n3e8%sfroehli@Froehlich.Priv.at> <o6vg9b$e26$1@news.albasani.net> <1t58935c1bi1e45n3e8%sfroehli@Froehlich.Priv.at> <aa7ec64e-3970-59ca-f8e9-647206e26680@arcor.de> |
Christoph M. Becker wrote:
> On 02.02.2017 at 17:24, Stefan Froehlich wrote:
>> Im wesentlichen läuft es darauf hinaus:
>>
>> | <script language="JavaScript">
>
> Das language Attribut sollte eigentlich schon lange nicht mehr verwendet
> werden. Aber dazu kann ein anderer sicher mehr sagen. :)
Für gültiges HTML 4.01 (1999) fe lt das type-Attribut, und für gültiges HTML
4.01 Strict und HTML5+ (2014) gehört das language-Attribut weg. In HTML5
ist ausserdem type="text/javascript" optional; ich schreibe es aus
Kompatibilitätsgründen trotzdem hin:
<http://wayback.archive.org/web/20100904140711/http://pointedears.de/scripts/test/mime-types/>
[Keine Ahnung mehr, was “partially supported” (gelb) bedeutet; diesen
Testcase aktualisiert wieder online zu stellen, steht schon länger auf
meiner TODO-Liste. Soifz. [psf 10.1]]
>> | var isSubmitted;
>> |
>> | function singleFormSubmission() {
>> | if (isSubmitted) return false;
>> | isSubmitted = true;
>> | return true;
>> | }
>> | </script>
>> |
>> | <form [...] onsubmit="return singleFormSubmission();">
>
> Die Funktion ist nicht mal nötig. Es geht auch:
>
> <form […] onsubmit="return !!isSubmitted++">
>
> Schön ist keine der beiden Varianten, aber sie funktionieren[TM].
Nein, Deine Variante funktioniert nicht i.S.v. „tut was sie soll“, denn sie
ist nicht äquivalent :)
Funktionieren würde
<form […] onsubmit="return !isSubmitted++">
aber nur, wenn der initiale Wert von “isSubmitted” 0 oder ein entsprechend
dazu konvertierbarer Wert wäre.
Denn hier isSubmitted === undefined, und
1. Mit Post-Inkrement wird *erst* der Wert der Variablen/Eigenschaft
ausgewertet, dann wird er zu Number konvertiert und dann um 1 erhöht.
2. Mit Anfangswert “undefined”:
!!isSubmitted++ === !!undefined === !(!undefined) === !(!false) ===
!true === false
Number.isNaN(isSubmitted = (undefined + 1)); /* (!) */
Das Formular kann also so nie abgesendet werden, denn auch Number.isNaN(x++)
und Number.isNaN(++x), wenn Number.isNaN(x).
Wäre der Anfangswert isSubmitted === 0 (was Du wohl dachtest), dann machte
Dir das *Post*-Inkrement einen Strich durch die Rechnung, denn
!!isSubmitted++ === !!0 === !(!0) === !(!false) === !true === false
(isSubmitted = (isSubmitted + 1)) === (0 + 1) === 1
Das Formular würde also beim ersten Mal _nicht_ abgesendet werden, dann aber
immer, denn auch !!++Infinity === true¹.
Das kann man im gewünschten Sinn (Formular nur einmal, d.h. nur beim ersten
Mal, absenden) lösen, indem man nur *einmal* negiert:
!isSubmitted++ === !0 === !false === true
(isSubmitted = (isSubmitted + 1)) === 1;
und beim zweiten, dritten usw. Mal
(!isSubmitted++ === !x === !true === false) mit typof x == "number",
x >= 1.
Herauszufinden, ob es Initialisierungswerte für “isSubmitted” gibt, mit
denen doppelte Negation und/oder Prä-Inkrement funktionieren würde, bleibt
dem geneigten Leser zur Übung überlassen.
_______
¹ Normalerweise nur sinngemäss; hier zufällig äquivalent, da “Infinity”
eine Eigenschaft des globalen Objekts mit dem Wert
Number.POSITIVE_INFINITY ist. Das funktioniert aber nicht im Strict
Mode (TypeError), da die “Infinity”-Eigenschaft “read only” ist
([[Writable]]-Attribut ist “false”).
--
PointedEars
FAQ: <http://PointedEars.de/faq> | <http://PointedEars.de/es-matrix>
<https://github.com/PointedEars> | <http://PointedEars.de/wsvn/>
Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.
Back to de.comp.lang.javascript | Previous | Next — Previous in thread | Next in thread | Find similar
Re: Doppelte Eingabe "Christoph M. Becker" <cmbecker69@arcor.de> - 2017-02-02 18:05 +0100
Re: Doppelte Eingabe Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2017-02-02 17:07 +0000
Re: Doppelte Eingabe Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2017-02-02 21:02 +0100
Re: Doppelte Eingabe "Christoph M. Becker" <cmbecker69@arcor.de> - 2017-02-03 00:52 +0100
Re: Doppelte Eingabe Ralph Stahl <post@rstahl.de> - 2017-02-03 10:27 +0100
Re: Doppelte Eingabe "Christoph M. Becker" <cmbecker69@arcor.de> - 2017-02-03 11:38 +0100
csiph-web