top trim

Mehr über Event Handling

Im vorigen Teil wurden wir in den allgemeinen Prozess des Einbindens von Programmlogik in eine Anwendung mit Scripting und Event Handling eingeführt. In diesem Teil werden wir Event Handling genauer betrachten.

Damit sie uns etwas nutzt, muss eine Anwendung fähig sein, auf Geschehenisse (Events) die während der Laufzeit auftreten reagieren können, wie die Bewegung der Maus, der Initialisierung eines Szenarios oder gar des Abschließens einer Animation.

Einige der Events auf die eine Boxely Anwendung reagieren kann sind:

Als Entwickler ist es unsere Aufgabe, eine Anwendung zu programmieren, die auf Events wartet und aus sie reagiert, durch die Verwendung einer (oder beider) der folgenden Methoden:

Event Handling mit Behaviors und Reactions

Um ein Gadget zu programmieren, das auf Events wartet und auf sie reagiert, können die behavior und reaction Elemente verwendet werden. Das reaction Element wartet auf einen Event. Wenn der Event auftritt wird die zugewiesene Aktion ausgeführt. Das behavior Element stellt einen Container für reaction Elemente bereit, die für das Gadget definiert sind.

Schauen wir uns ein Beispiel an. Wir nehmen an, wir möchten ein Gadget programmieren, das eine bestimmte Funktion aufruft, wenn der Benutzer seine Maus ueber dem Gadget platziert, und eine andere Funktion, wenn auf des Gadget geklickt wird. Um das zu verwirklichen, würden wir ein Behavior Element mit zwei enthaltenen Reaction Elementen zur Gadget Definition hinzufügen, wie unten fett hervorgehoben:

<gadget id="myGadget" language="jscript" code="4a_eventHandling.js" >
  <parts>
    <box:text id="myPart" value="Change Gadget Fill" />
  </parts> 
  <behavior>
    <reaction event="mouseOver" action="gadget:changeFill();" />
    <reaction event="click" action="gadget:oneNewWindow();" />
  </behavior>
</gadget>

In diesem Beispiel werden Funktionen aufgerufen, wenn ein Event auf irgendeinem Teil des Gadgets stattfindet, wie in den Bildern unten gezeigt:

Tabelle 4.2. Das Gadget ändert seine Füllfarbe, wenn sich die Maus darüber befindet


Nach dem Laden wird das Gadget in seinem Anfangsstadium angezeigt. Wenn die Maus über irgendeinen Teil des Gadgets platziert wird, wird die changeFill Funktion aufgerufen.

Der folgende Code demonstriert das Programmieren einer Box in einem Gadget, um auf Events zu reagieren:

<gadget id="myGadget" language="jscript"
  code="../../content/appendix/4a_eventHandling.js"  >
  <parts>
    <box:text id="myPart" value="Change Gadget Fill" > 
      <box:reaction event="mouseOver" action="gadget:changeFill();" />
      <box:reaction event="click" action="gadget:oneNewWindow();" />
    </box:text>
  </parts>
</gadget>

In diesem Beispiel wird eine Funktion aufgerufen, wenn ein Ereignis in der myPart Box auftritt. Wenn der Benutzer mit irgendeinem Teil des Gadgets interagiert, das außerhalb der myPart Box ist, geschieht nichts.

Tabelle 4.3. Das Gadget ändert seine Füllfarbe, wenn sich die Maus über der "change gadget fill" Box befindet


Nach dem Laden wird das Gadget in seinem Anfangsstadium angezeigt. Wenn die Maus über dem Gadget platziert wird, aber nicht über der Box darin, geschieht nichts. Wenn die Maus über die Box im Gadget platziert wird, wird die changeFill Funktion aufgerufen.

Event Handling mit dem on Namespace

Als Alternative zur Verwendung von behaviors und reactions zur Erstellung von Event Handlern, kann der on Namespace verwendet werden:

  • Deklaieren des on Namespace im XML Code.

  • Hinzufügen des on:eventName Attributs zur Box die auf ein Ereignis reagieren soll.

Den on Namespace deklaieren:

Bevor der on Namespace in Anwendungen verwendet werden kann, muss er deklaiert werden. Falls beabsichtigt ist, on Namespace Attribute auf window UI Elemente anzuwenden, muss der on Namespace im window Start-Tag deklaiert werden, wie unten fett formatiert.

<window xmlns="http://www.aol.com/boxely/box.xsd"
  xmlns:s="http://www.aol.com/boxely/style.xsd" 
  xmlns:on="http://www.aol.com/boxely/reaction.xsd"
  title="My Application" ... >

</window>

Falls beabsichtigt ist, on Namespace Attribute auf Objekte anzuwenden, die sich in einer library befinden (und der on Namespace nicht übergeordnet festgelegt wurde), muss er im library Start-Tag deklaiert werden, wie hier gezeigt:

<window xmlns="http://www.aol.com/boxely/box.xsd"
  title="My Application" ... >

  <library xmlns="http://www.aol.com/boxely/resource.xsd"
    xmlns:box="http://www.aol.com/boxely/box.xsd"
    xmlns:s="http://www.aol.com/boxely/style.xsd" 
    xmlns:on="http://www.aol.com/boxely/reaction.xsd" >

    ...

  </library>
</window>

Das on:eventName Attribut zu einer Box hinzufügen:

Sobald der on Namespace deklaiert ist, kann das on:eventName Attribut verwendet werden, um eine Box zu programmieren, die auf ein Ereignis reagiert. Das on:eventName Attribut ist durch folgende Syntax festgelegt:

on:eventName="someFunction();"

In dieser Syntax ist "eventName" der Name eines Boxely Events auf das die Box reagieren soll, und "someFunction" ist der Name einer JavaScript Funktion die dem Gadget verfügbar ist.

Ein Beispiel folgt:

<gadget id="myGadget" script="someJavaScript.js" >
  <parts>
    <box:box  on:mouseOver="gadget:changeFill()"
             on:click="gadget:openNewWindow();" >
      <box:text id="myPart" value="Change Gadget Fill" />
    </box:box>
  </parts>
</gadget>

Im obigen Code wird die changeFill Funktion aufgerufen, wenn der Benutzer seine Maus über der Box platziert. Wenn der Benutzer auf die Box klickt, wird die openNewWindow Funktion aufgerufen.

bottom trim