J.P.Morgan: onmousedown und +=

Hi,

<input type="Text" name="" value="1" onmousedown="this.value *=2;">

Bei jedem Klick eine Verdopplung des Wertes/Values, klar.
1,2,4,8,16,usw...

Warum geht aber das nicht ?
<input type="Text" name="" value="1" onmousedown="this.value +=2;">
Hier sieht JS das wohl als Verkettung an, aber wie kann ich
das ändern ?

Denn heraus kommt bei jedem Klick eine angehängte 2.
1,12,122,1222,12222

*****************************

Überhaupt wieso Klick (Habe ich mich schon oft gefragt),
ich nutze doch onmousedown. Und da erwarte ich doch,
eine Aktion ausgeführt wird solange ich die Maustaste
festhalte,ähnlich einer manuellen Schleife.

Stattdessen, verhält sich dieser Eventhandler
immer wie onclick. Oder gibts da doch einen Unterschied ?
Ja ich weiss, der Auslösezeitpunkt und somit als
eine der möglichen Anwendungsform drag & Drop.

Da ist auch genau der Effekt wie ich es mir vorstelle:
onclick      = tu was beim Klick / also einmalig
onmousedown  = tu was solange ich gedrückt werde.

Stimmt aber nicht , denn bei drag & drop scripten wird
der onmouseup benutzt um eine 2 Aktion auszulösen, also
zb funktion abschalten.

Das bedeutet:

Falsche Vorstellung
onmousedown  = tu was solange ich gedrückt werde.

Richtige Vorstellung
onmousedown  = tu einamlig was aber nicht permanent.

Wenn ichs mir doch schon selbst erkläre,
wo ist dann die Frage ?

Die Frage lautet: Gibt es vielleicht noch irgendeinen undokumentierten Eventkey der meine falsche Vorstellung
von onmousedown realisieren kann ?

  1. Hello out there!

    <input type="Text" name="" value="1" onmousedown="this.value *=2;">
    Bei jedem Klick eine Verdopplung des Wertes/Values, klar.

    Warum geht aber das nicht ?
    <input type="Text" name="" value="1" onmousedown="this.value +=2;">
    Hier sieht JS das wohl als Verkettung an,

    Ja, natürlich, wegen typeof this.value, der ist 'string'.

    Für Strings gibt es den '+'-Operator, der macht die Konkatenation.

    Für Strings gibt es aber keinen '*'-Operator, deshalb wandelt der JavaScript-Interpreter automatisch in Zahlen um und führt die Multiplikation aus.

    See ya up the road,
    Gunnar

    --
    “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
    1. Hi Gunnar

      Ja, natürlich, wegen typeof this.value, der ist 'string'.

      Ja das dachte ich mir schon. Nur wie kann ich das ändern ?

      1. Hallo J.P..

        Ja, natürlich, wegen typeof this.value, der ist 'string'.

        Ja das dachte ich mir schon. Nur wie kann ich das ändern ?

        Das schrieb Gunnar bereits.

        Einen schönen Dienstag noch.

        Gruß, Ashura

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
        [HTML Design Constraints: Logical Markup]
        1. Ja, natürlich, wegen typeof this.value, der ist 'string'.

          Ja das dachte ich mir schon. Nur wie kann ich das ändern ?

          Das schrieb Gunnar bereits.

          Super, auch wenn du oft gute Antworten gibst Ashura,
          das ist mal wieder eine typische Ignoranzhaltung.

          Wenn es eine Antwort war habe ich sie wohl nicht verstanden,
          sonst würde ich nicht nachfragen.

          Natürlich habe ich nachgeschaut was er damit meinen könnte:
          http://de.selfhtml.org/javascript/sprache/operatoren.htm#typeof

          Aber eine Lösung sehe ich dadurch noch nicht.

          1. Hallo J.P..

            Wenn es eine Antwort war habe ich sie wohl nicht verstanden,
            sonst würde ich nicht nachfragen.

            Natürlich habe ich nachgeschaut was er damit meinen könnte:
            http://de.selfhtml.org/javascript/sprache/operatoren.htm#typeof

            Aber eine Lösung sehe ich dadurch noch nicht.

            Es geht auch nicht um den typeof–Operator, sondern um folgenden Absatz:

            Für Strings gibt es aber keinen '*'-Operator, deshalb wandelt der JavaScript-Interpreter automatisch in Zahlen um und führt die Multiplikation aus.

            Nutze dies zu deinen Gunsten aus und führe eine unsinnige Rechenoperation (z. B. mal 1) aus, so dass aus der Zeichenkette eine Zahl wird.

            Einen schönen Dienstag noch.

            Gruß, Ashura

            --
            sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
            „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
            [HTML Design Constraints: Logical Markup]
  2. Hallo J.P.Morgan,

    Warum geht aber das nicht ?

    Stichwort typenschwache Sprache. += ist, wie du ja richtig darlegst, im Gegensatz zu *= nicht eindeutig, kann also String-Verkettung oder Addition bedeuten. Um JS mitzuteilen, dass du an letzterem interessiert bist, musst du this.value als Integer casten, entweder, indem du sagst, this.value = parseInt(this.value) + 2, oder aber, weniger elegant ... = (this.value *1) + 2

    onmousedown bedeutet 'in dem Moment, wo der Button unten ankommt', ist also nur ein Augenblick, nicht anders als bei onclick oder onmouseup auch. Wenn du ein onaslongasthemousebuttonispressed-Event haben willst, musst du das, zumindest, soweit ich weiss, selbst basteln. Das saehe dann etwa so aus:
    onmousedown = starte eine Funktion, die zB. per setIntervall() irgendwas treibt
    onmouseup   = clearInterval() der Funktion

    Gruß,

    Dieter

    1. Hallo Dieter,

      [...] oder aber, weniger elegant ... = (this.value *1) + 2

      im Gegenteil, ich finde das sogar wesentlich eleganter!

      Ciao,
       Martin

      --
      Ungeschehene Ereignisse können einen katastrophalen Mangel an Folgen nach sich ziehen.
        (Unbekannter Politiker)
      1. Hello out there!

        this.value = parseInt(this.value) + 2, oder aber, weniger elegant ... = (this.value *1) + 2

        IIRC my benchmark tests, ist die weniger elegante Art aber die schnellere.

        im Gegenteil, ich finde das sogar wesentlich eleganter!

        Über deinen Geschmack und deine Vorstellung von Eleganz lasse ich mich jetzt besser nicht aus. >;-)

        See ya up the road,
        Gunnar

        --
        “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
  3. Hallo,

    <input type="Text" name="" value="1" onmousedown="this.value +=2;">
    Hier sieht JS das wohl als Verkettung an, aber wie kann ich
    das ändern ?

    Gunnar hat den wesentlichen Knackpunkt schon erwähnt: this.value ist vom Typ String, also wird der '+' Operator als Stringverkettung angesehen. Sorge also dafür, dass der Ausdruck als Number interpretiert wird. Okay, so elegant-bequem mit dem '+=' Operator geht's dann leider nicht mehr.

    Überhaupt wieso Klick (Habe ich mich schon oft gefragt),
    ich nutze doch onmousedown. Und da erwarte ich doch,
    eine Aktion ausgeführt wird solange ich die Maustaste
    festhalte,ähnlich einer manuellen Schleife.

    Nein, sondern in dem Moment, da du die Maustaste niederdrückst. Alle Eventhandler orientieren sich ja, wie der Name schon sagt, an einem Event, einem _Ereignis_, nicht einem Zustand. Und beim onmousedown ist das Ereignis das Niederdrücken der Maustaste. Das Gedrückt-Halten wäre ja ein Zustand.

    Stattdessen, verhält sich dieser Eventhandler
    immer wie onclick. Oder gibts da doch einen Unterschied ?

    Ja, mehrere. Erstens zündet onclick AFAIK nicht beim Niederdrücken, sondern beim Loslassen. Zweitens reagiert onclick ersatzweise auch, wenn ein Element, das gewöhnlich mit der Maus bedient wird (Radiobutton, Checkbox), zur Abwechslung per Tastatur ausgelöst wird. Also sind onmousedown bzw. onmouseup zu verwenden, wenn du gezielt *nur* auf die Maus reagieren willst.

    onmousedown  = tu was solange ich gedrückt werde.

    Das musst du dir selbst bauen. Du könntest als Reaktion auf onmousedown einen Timer starten und per setInterval() zyklisch eine Aktion aufrufen lassen. Bei onmouseup stellst du den Timer mit clearInterval() wieder ab.

    Wenn ichs mir doch schon selbst erkläre,
    wo ist dann die Frage ?

    Das frage ich mich auch. ;-)

    Die Frage lautet: Gibt es vielleicht noch irgendeinen undokumentierten Eventkey der meine falsche Vorstellung von onmousedown realisieren kann ?

    Nicht dass ich wüsste. Nur Selbermachen wie oben angedeutet.
    Übrigens: Du plenkst.

    So long,
     Martin

    --
    Der Gast geht solange zum Tresen, bis er bricht.
    1. Zweitens reagiert onclick ersatzweise auch, wenn ein Element, das gewöhnlich mit der Maus bedient wird (Radiobutton, Checkbox), zur Abwechslung per Tastatur ausgelöst wird. Also sind onmousedown bzw. onmouseup zu verwenden, wenn du gezielt *nur* auf die Maus reagieren willst.

      Daran hatte ich noch nicht gedacht, guter Aspekt.

      Übrigens: Du plenkst.

      Das es dafür wirklich einen Begriff gibt ;-)

      Du meinst das Leerzeichen vor dem Fragezeichen ?
      Findest du das denn schöner ohne Leerzeichen?

      Das ist für mich, vom optischen gesehen, das Gleiche
      wie das Leerzeichen nach einem Komma. Ohne Leerzeichen
      gefällts mir nicht.

      J.P.

      ps.
      Warum bekomme ich eigentlich nach jedem Postig erstmal eine Fehlermeldung und ohne Änderung gehts dann doch ?

      1. Hello out there!

        Du meinst das Leerzeichen vor dem Fragezeichen ?
        Findest du das denn schöner ohne Leerzeichen?

        Ja. Findest du einen Zeilenumbruch vor dem Fragezeichen denn schöner
        ? Ich finde, das sieht bekloppt aus.

        See ya up the road,
        Gunnar

        --
        “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)