Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.javascript > #4851

Re: Doppelte Eingabe

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>

Show all headers | View raw


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 | NextPrevious in thread | Next in thread | Find similar


Thread

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