Dennis: Gemeinsame Funktionen für Java- und JScript (für Tastatureingaben)

Nach all den Regeln und Bedingungen, die einem in diesem Forum so gestellt werden, wirkt es zwar fast schon wie ein Verbrechen, aber ich erlaube mir einfach mal ohne stundenlanges Suchen in zig-tausend Archiven eine Frage zu stellen:

Kann ich Funktionen definieren (im JavaScript-Bereich) auf die per Angabe der Tastaturcodes sowohl IE als auch NS zugreifen können? Bei mir endete das irgendwie im Chaos. Ziel ist es, dass Benutzer von beiden Browsern auf eine Taste tippen, das wird registriert und an eine vielleicht für jeden Browser spezielle Funktion übermittelt, die dann den Tastencode so übersetzt, dass eine für beide Browser gemeinsame (also JavaScript-) Funktion dann weitere Aktionen steuert. Ich komme leider nicht weiter als bis zur Anzeige des Tastaturcodes (beim IE). Für Netscape ist soweit alles fertig, nur die Kleinweich-Extrawurst muss noch bedient werden =:-[

  1. Nach all den Regeln und Bedingungen, die einem in diesem Forum so gestellt werden, wirkt es zwar fast schon wie ein Verbrechen, aber ich erlaube mir einfach mal ohne stundenlanges Suchen in zig-tausend Archiven eine Frage zu stellen:

    :-)
    ich finde dort (auch) selten etwas, da die Suche case-sensitive ist und daher nicht immer von Erfog gekrönt ist, auch wenn etwas existieret.. wie auch immer.

    Für den IE4 mußt Du auf die Events des DOM zurückgreifen, sprich einen Eventhandler definieren, der an das betreffende Objekt gebunden ist, z.B.
    <SCRIPT TYPE="text/javascript" LANGUAGE="JavaScript1.2"
    EVENT="onKeyPress" FOR="document">
    // aktionen
    </SCRIPT>
    Dies sollte allerdings Browserunabhängig sein.

    Der IE läßt Events allerdings die Hierarchie hinaufsteigen: "event bubbling" genannt. Wenn Du also ein Event für eine TABLE definierst, und dieses in dem Event-Handler nicht abgeschossen wird (z.B. weil "falsche Taste"), wird es an dessen Parent, z.B. BODY weitergereicht. Existiert ebenfalls ein Event für keyPress, wird dort die Verarbeitung weitergeführt und kann ggf. ungewünschte Ergebnisse liefern:
      table_onKeyPress() { andereFunktion() }
      body_onKeyPress() { andereFunktion() }
    Hier würde u.U. die Funktion "anderFunktion" zweimal hintereinander aufgerufen werden, wenn in "table_onKeyPress" das Event nicht vorher gelöscht wird. Vielleicht liegt hier auch das Chaos verborgen, von dem du sprichst.

    Abhilfe laut Doku:
    <cite>
    The return value can be used to override the keycode value. This event will bubble. Events that bubble can be handled on any parent element of the object that fired the event. To cancel the keystroke, use the following code in the onkeypress event:
       event.returnValue=false;
    </cite>

    Wie Du hier siehst gehört der KeyStroke auch nicht dem Objekt "document" sondern dem globalen Objekt "event" des window-Objektes (muß immer mit window.event angesprochen verwenden). Allgemein läßt sich das Event-Bubbling wie folgt ausschalten:

    <cite/>
    The following document fragment cancels bubbling of the onclick event if it occurs in the IMG element when the SHIFT key is down. This prevents the event from bubbling up to the onclick event handler for the document.

    <SCRIPT LANGUAGE="JScript">
    function checkCancel() {
    if (window.event.shiftKey)
        window.event.cancelBubble = true;
    }
    function showSrc() {
        if (window.event.srcElement.tagName == "IMG")
            alert(window.event.srcElement.src);
    }
    </SCRIPT>
    <BODY onclick="showSrc()">
    <IMG onclick="checkCancel()" SRC="sample.gif">

    </city>

    All dies ist Nachzulesen bei:
    http://msdn.microsoft.com/workshop/author/dhtml/handleevents.asp
    http://msdn.microsoft.com/workshop/author/script/ie4event.asp

    have fun

    CirTap

  2. Hallo Dennis

    Kann ich Funktionen definieren (im JavaScript-Bereich) auf die per Angabe der Tastaturcodes sowohl IE als auch NS zugreifen können?

    Kennst du das Beispiel unterhalb von <../../tecbc.htm#a1>? Dort findest du beschrieben, wie man eine Tastaturabfrage fuer beide Browser machen kann. Das Beispiel musst du dann halt fuer deine Zwecke weiter ausbauen und abhaengig von erfolgtem Tastendruck eine Funktion aufrufen oder was immer du vorhast.
    Leider ist das Event-Handling bei beiden Browsern sehr unterschiedlich geloest, wie ja schon CirTap geschrieben hat, deshalb ist das so umstaendlich und vertrackst.

    Nach all den Regeln und Bedingungen, die einem in diesem Forum so gestellt werden, wirkt es zwar fast schon wie ein Verbrechen, aber ich erlaube mir einfach mal ohne stundenlanges Suchen in zig-tausend Archiven eine Frage zu stellen:

    So ordentlich und sachlich gestellte Fragen wie deine wird sicherlich niemand beanstanden, das ist ja eine der Aufgaben dieses Forums. Die vielen Regeln hast du all denen zu verdanken, die in der Vergangenheit nicht in der Lage waren, sich in andere Leute reinzuversetzen und uns mit diversem Quatsch genervt haben. Eigentlich sollte man als erste Regel noch dazuschreiben: "wenn du ganz normal im Kopf bist, brauchst du all das folgende kaum zu lesen" ;-)

    viele Gruesse
      Stefan Muenz

  3. Moin Dennis,

    ich bin heute zufällig bei einem der Tools mit denen ich werkle auf die folgende Routine gestoßen. Soweit ich das feststellen konnte, machen beide Browser da anstandslos mit: kurz und bündig aber nicht bulletproof was die Browserabfrage anbelangt. NS3 zieht sich angeblich auch JS1.2 rein, obwohl er es nicht sollte...

    <SCRIPT language="JavaScript1.2">
    <!--
    IE4 = (document.all);
    NS4 = (document.layers);

    if (NS4) document.captureEvents(Event.KEYPRESS); document.onkeypress = doKey;

    function doKey(e) {
    whichASC = (NS4) ? e.which : event.keyCode;
    whichKey = String.fromCharCode(whichASC).toLowerCase();

    switch (whichKey) {
    case "b":
      eval("alert('Taste b')");
    break;
    default: break;}
    }
    // -->
    </SCRIPT>

    anstelle des eval() kannst du natürlich auch eine andere Funktion aufrufen.

    Viel Spaß noch damit.

    CirTap