Jochen Gebauer: onKeydown anstatt onlick

Hallo,

ich führe psychologische Onlinestudien durch bei denen die Teilnehmer auf Fragen antworten indem sie Radiobuttons betätigen. Beim betätigen der Radiobuttons geschieht dann (1) Speicherung der Reaktionszeit, (2) Speicherung des Wertes des ausgewählten Buttons und (3) automatische Weiterleitung zur nächsten Seite (mit der nächsten Frage).

Mein Problem: Ich will jetzt von Mausklicks auf Tastatureingabe umsteigen und kenne mich bei JavaScript überhaupt nicht aus. Ich vermute mal, dass man nur 1-2 Zeilen im Quelltext umschreiben muss aber ich blick leider überhaupt nicht durch...

Hier ist der Quelltext einer typischen Seite des Onlinefragebogens:

<?php include ('fieldforwarder.php'); ?>

<html>

<script language="Javascript">

<!--    //ASSUMPTIONS MADE:     // - This JavaScript code assumes that the hosting form is called "myForm".     // - If you use timeOuts and see a timer, call the watching object "myTimerViewer" and ensure     //   that you have a submit-input field.     //     // Of course you can search and replace within the code in order to change these naming conventions...

// Change the following constants as needed   var arrayLength=1;    // the arrayLength has to be the number of items you use on the current website! - 1. thing you have to adapt on your study concerning the time meassurement.   var timeOutLimit=-1;   // Define your timeOut in milliseconds here or -1 if you don't want timeouts   var timeOutRefresh=100;   // Define a refresh time here. Try not to choose smaller values unless it's absolutly necessary.   var showTime=false;   // Display time? (true - false)   var showRemainingTime=false;  // Display the past or the remaining time? (true - false)   var showMillis=false;   // Display time in milliseconds? (If not time will be displayed in minutes) (true - false)

//Don't change these members   var timeOutStart   var lastClickTime;   var antwortZeiten=new Array(arrayLength);   var timeOutTriggered=false;

function initialisiere() {    var lauf;    lastClickTime=new Date();    //AntwortZeiten mit 0 initialisieren    for (lauf=0;lauf<arrayLength;lauf++) {     antwortZeiten[lauf]=0;    }    //timeout enabled?    if (timeOutLimit>=0) {     if (timeOutRefresh<10) timeOutRefresh=10;     timeOutStart=new Date();     handleTimerEvent();    }   }

function getTimeDifference(d1,d2) {    var iStr=Date.parse(d1.toUTCString());    var jStr=Date.parse(d2.toUTCString());    iStr=iStr+d1.getMilliseconds();    jStr=jStr+d2.getMilliseconds();    var difference=jStr-iStr;    return difference;   }

function getArrayIndexFromName(bezeichnung) {    switch (bezeichnung) {     case "actual_se_01":      return 0;      break;     default:      DEBUG("@getArrayIndexFromName: Index konnte nicht bestimmt werden!");    }   }

function handleClickEvent(senderName) {    now=new Date();    var index=getArrayIndexFromName(senderName);    antwortZeiten[index]=antwortZeiten[index]+getTimeDifference(lastClickTime,now);    lastClickTime=now;    sendResults();    myForm.submit()   }

function sendResults() {    myForm.rtactual02.value=antwortZeiten[0]   }

function handleTimerEvent() {    now=new Date();    var timeSinceStart=getTimeDifference(timeOutStart,now);    var timeToShow;    //update watcher    if (showTime==true) {     if (showRemainingTime==true) {      timeToShow=timeOutLimit-timeSinceStart;     }     else {      timeToShow=timeSinceStart;     }     if (showMillis==true) {      myForm.myTimerViewer.value=Math.floor(timeToShow/1000)+"."+Math.floor(timeToShow%1000)     }     else {      myForm.myTimerViewer.value=Math.floor(timeToShow/60000+1)     }    }    //check for timeout    if (timeSinceStart>=timeOutLimit && !timeOutTriggered) {     //TIMEOUT!     timeOutTriggered=true;     sendResults();     myForm.submit()    }    //setup timer callback    setTimeout("handleTimerEvent()",timeOutRefresh)   }

//-->

</script>

<head>

<title>Online Study - The School of Psychology at Cardiff University, Cardiff Wales</title>

<meta NAME="keywords" content="web-experiment, web-experiments, web-study, web-studies, online-study, online-studies, online-experiment, online-experiments, psychology, psychological, study, studies, experiment, experiments, online, psychological web-experiment, psychological web-experiments, psychological web-study, psychological web-studies, psychological online-study, psychological online-studies, psychological online-experiment, psychological online-experiments, psychological study, psychological studies, psychological experiment, psychological experiments, Cardiff, Cardiff University, University, Universities">   <meta NAME="description" content="Online Study - The School of Psychology at Cardiff University, Cardiff Wales">   <meta NAME="Content-Language" content="en">   <meta NAME="author" content="Jochen Gebauer">   <meta HTTP-EQUIV="Reply-to" content="soci@lpsychology.com">   <meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=iso-8859-1">   <meta name="robots" content="noindex">

<link rel="SHORTCUT ICON" href="http://www.psy.de/favicon.ico">

<link rel=stylesheet type="text/css" href="stylesheet.css">

</head>

<body bgcolor="#FFFFFF" onLoad="initialisiere()">

<form name="myForm" action="ioav16v08.php" method="post">

<?php echo field_forwarder(); ?>

<table width="700" align="center" border="0" cellspacing="0" cellpadding="0">

<tr><td>

<table border="0" cellspacing="0" cellpadding="0">

<tr>     <td><img src="pictures/banner.jpg" border="0"></td>    </tr>

<tr>     <td height="2" bgcolor="#FFFFFF"><b></b></td>    </tr>

</table>

<table border="0" cellspacing="0" cellpadding="0">

<tr>     <td height="20" width="190" bgcolor="#000000"><b></b></td>     <td width="710" bgcolor="#000000"><b class="Pt12YellowBold"><?php echo $studyname;?></b class="Pt12YellowBold"></td>    </tr>

</table>

<table border="0" cellspacing="0" cellpadding="0">

<tr>     <td width="190" bgcolor="#000066"><b></b></td>     <td width="630" bgcolor="#FFFFFF"><b></b></td>     <td><img src="pictures/curve_top.gif" border="0"></td>     <td width="39" bgcolor="#666699"><b></b></td>    </tr>

</table>

<table border="0" cellspacing="0" cellpadding="0">

<tr>     <td height="1" width="170" bgcolor="#000066"><b></b></td>     <td width="720" bgcolor="#000000"><b></b></td>     <td width="15" bgcolor="#666699"><b></b></td>    </tr>

</table>

<table border="0" cellspacing="0" cellpadding="0">

<tr>     <td height="10" width="170" bgcolor="#000066"><b></b></td>     <td width="1" bgcolor="#000000"><b></b></td>     <td width="10" bgcolor="#FFFFFF"><b></b></td>     <td width="700" bgcolor="#FFFFFF"><b></b></td>     <td width="10" bgcolor="#FFFFFF"><b></b></td>     <td width="1" bgcolor="#000000"><b></b></td>     <td width="15" bgcolor="#666699"><b></b></td>    </tr>

</table>

<table border="0" cellspacing="0" cellpadding="0">

<tr>     <td width="170" bgcolor="#000066"><b></b></td>     <td width="1" bgcolor="#000000"><b></b></td>     <td width="10" bgcolor="#FFFFFF"><b></b></td>     <td width="700" bgcolor="#FFFFFF">

<table border="0" cellspacing="0" cellpadding="0">

<tr>        <td height="10"><b></b></td>       </tr>

<tr>        <td width="10"><b></b></td>        <td><b class="Pt12Bold">To what extent do you <b class="Pt12BoldUline">ACTUALLY</b class="Pt12BoldUline"> possess this value?</b class="Pt12Bold"></td>       </tr>

<tr>        <td height="10"><b></b></td>       </tr>

</table>

<table border="0" cellspacing="0" cellpadding="0">

<tr>        <td width="45"><b></b></td>        <td valign="top" width="40"><br><br><b class="Pt12Fett">02c.</b class="Pt12Fett"><br><br></td>        <td valign="top"><br><br><b class="Pt12Fett">WEALTH (material possessions, money)</b class="Pt12Fett"><br><br></td>       </tr>

</table>

<table border="0" cellspacing="0" cellpadding="0">

<tr>        <td colspan="9" height="20"><b></b></td>       </tr>

<tr>        <td width="90" height="40"><b></b></td>        <td valign="center" align="middle" width="110"><b></b></td>        <td valign="center" align="middle" width="70"><b class="Pt10">0</b class="Pt10"></td>        <td valign="center" align="middle" width="70"><b class="Pt10">1</b class="Pt10"></td>        <td valign="center" align="middle" width="70"><b class="Pt10">2</b class="Pt10"></td>        <td valign="center" align="middle" width="70"><b class="Pt10">3</b class="Pt10"></td>        <td valign="center" align="middle" width="110"><b></b></td>       </tr>

<tr>        <td><b></b></td>        <td valign="center" align="middle"><b class="Pt08">SLIGHTLY</b class="Pt08"></td>        <td valign="center" align="middle"><input type="radio" name="actual_se_01" value="1" onclick="handleClickEvent(this.name);"></td>        <td valign="center" align="middle"><input type="radio" name="actual_se_01" value="2" onclick="handleClickEvent(this.name);"></td>        <td valign="center" align="middle"><input type="radio" name="actual_se_01" value="3" onclick="handleClickEvent(this.name);"></td>        <td valign="center" align="middle"><input type="radio" name="actual_se_01" value="4" onclick="handleClickEvent(this.name);"></td>        <td valign="center" align="middle"><b class="Pt08">EXTREMELY</b class="Pt08"></td>       </tr>

<tr>        <td colspan="9" height="60"><b></b></td>       </tr>

</table>

<input type="hidden" name="rtactual02" value=0>

</td>     <td width="10" bgcolor="#FFFFFF"><b></b></td>     <td width="1" bgcolor="#000000"><b></b></td>     <td width="15" bgcolor="#666699"><b></b></td>    </tr>

</table>

<table border="0" cellspacing="0" cellpadding="0">

<tr>     <td height="10" width="170" bgcolor="#000066"><b></b></td>     <td width="1" bgcolor="#000000"><b></b></td>     <td width="10" bgcolor="#FFFFFF"><b></b></td>     <td width="700" bgcolor="#FFFFFF"><b></b></td>     <td width="10" bgcolor="#FFFFFF"><b></b></td>     <td width="1" bgcolor="#000000"><b></b></td>     <td width="15" bgcolor="#666699"><b></b></td>    </tr>

</table>

<table width="900" border="0" cellspacing="0" cellpadding="0">

<tr>     <td height="1" width="170" bgcolor="#000066"><b></b></td>     <td width="720" bgcolor="#000000"><b></b></td>     <td width="15" bgcolor="#666699"><b></b></td>    </tr>

</table>

<table border="0" cellspacing="0" cellpadding="0">

<tr>     <td height="5" width="168" bgcolor="#000066"><b></b></td>     <td width="22" bgcolor="#000033"><b></b></td>     <td width="671" bgcolor="#CCCCFF"><b></b></td>     <td width="24" bgcolor="#333366"><b></b></td>     <td width="15" bgcolor="#666699"><b></b></td>    </tr>

</table>

<table border="0" cellspacing="0" cellpadding="0">

<tr>     <td width="190" bgcolor="#000066"><b></b></td>     <td width="630" bgcolor="#FFFFFF"><b></b></td>     <td><img src="pictures/curve_bottom.gif" border="0"></td>     <td width="39" bgcolor="#666699"><b></b></td>    </tr>

</table>

<table width="900" align="center" valign="middle" border="0" cellspacing="0" cellpadding="0">

<tr  align="center" valign="middle">     <td height="50"><b class="Pt10">Email questions to <b class="Pt10UlineBlue"><a href="mailto:Soci@lPsychology.com">Soci@lPsychology.com</a></b class="Pt10UlineBlue"><br>Copyright (c) 2004-2005 by Jochen E. Gebauer</b class="Pt10"></td>    </tr>

</table>

</td></tr>

</table>

</form>

</body>

</html>

  1. hallo,

    Mein Problem: Ich will jetzt von Mausklicks auf Tastatureingabe umsteigen und kenne mich bei JavaScript überhaupt nicht aus.

    In Korrespondenz zum gewählten posting-Titel: du kannst einem HTML-Element so viele EventHandler mitgeben, wie du für richtig hältst. Das heißt, du kannst sowohl "onclick()" wie auch "unkeydown()" einsetzen. Wenn jemand klickt, passiert dann etwas, und wenn jemand eine Taste drückt, passiert auch etwas.

    Hier ist der Quelltext einer typischen Seite des Onlinefragebogens:

    Oh. Davon ist rund die Hälfte überflüssig, weil es nur noch dein HTML ist. Die Angabe der Javascript-Zeilen hätte ausgereicht. Und da gibt es zwei Dinge:

    <?php
    include ('fieldforwarder.php');
    ?>
    <html>
    <script language="Javascript">

    Ja, ok, das Ganze steht in einem PHP-Script, deswegen ist es vielleicht nicht ganz so schlimm. Aber: unter
       <html>
    (dem eigentlich auch noch eine <!DOCTYPE>-Zeile hätte vorangestellt werden müssen) folgt dann als erstes ein Scriptbereich, der da noch nichts zu suchen hat, sondern
       <head>
    hätte zuerst notiert werden müssen. Das heißt, dein Scriptbereich gehört _in_ den Header, und nicht irgendwohin.

    Als zweites:

    <script language="Javascript">

    Wenn Cheatah das mitkriegt, bekommst du die überaus beliebte Standard-Antwort:
       "ERROR! Required attribute 'type' missing"

    Ansonst sehe ich nicht wirklich, wo sich in deinem ganzen Code etwas verstecken könnte, was der angegebenen Thematik entspricht. Kann aber sein, daß ich aufgrund der Fülle etwas übersehen habe. In einem solchen Fall wärs besser, den ganzen Krm auf eine temporäre Adresse hochzuladen und dann den Link hier anzugeben.

    Und sowas:

    //ASSUMPTIONS MADE:
        // - This JavaScript code assumes that the hosting form is called "myForm".
        // - If you use timeOuts and see a timer, call the watching object "myTimerViewer" and ensure
        //   that you have a submit-input field.
        //
        // Of course you can search and replace within the code in order to change these naming conventions...

    kannst du ganz weglassen. Das bläht dein posting nur auf und enthält keinerlei relevante Informationen, die für eine Problemlösung nötig wären.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. Hi Christoph,

      danke für Deine Antwort! Ich will allerdings die Radiobuttons gar nicht mehr haben sondern anstatt den buttons eine Tastatureingabe. D.h. ich brauche für jeden Radiobutton eine Ersatztaste (z.B. d,f,g,h,etc.). Die Ersatztasten sollen dann die gleiche Funktion erfüllen wie die Radiobuttons momentan noch erfüllen. Ein Beispiel wie die Befragung momentan - noch mit Radiobuttons - funktioniert findet man unter http://www.JochenGebauer.de/sapjeg41

      1. Hi,

        // Tastatur-Steuerung
        function defMenu(menuChar,order) {
         var i;
         for(i=0;i<menuChar.length;i++) {
          menu[menuChar.charCodeAt(i)]=order;
         }
        }

        function initKeyMenu(type) {
         if(String.fromCharCode) {
          menu=new Array();

        // Default-Menuesteuerung "numerisch", wenn type nicht oder als true uebergeben wurde
          if(typeof(type)=="undefined" || (typeof(type)=="boolean" && type)) { type="num"; }

        if(type.indexOf("num")+1) {
           defMenu("1!",1);
           defMenu("2"",2);
           defMenu("3§",3);
           defMenu("4$",4);
           defMenu("5%",5);
           defMenu("6&",6);
           defMenu("7/",7);
           defMenu("8(",8);
           defMenu("9)",9);
           defMenu("0=",10);
          }
          if(type.indexOf("alpha")+1) {
           defMenu("aA",1);
           defMenu("bB",2);
           defMenu("cC",3);
           defMenu("dD",4);
           defMenu("eE",5);
           defMenu("fF",6);
           defMenu("gG",7);
           defMenu("hH",8);
           defMenu("iI",9);
           defMenu("jJ",10);
          }
          if(menu.length) {
           if(document.captureEvents) { document.captureEvents(Event.KEYPRESS); }
           document.onkeypress=keyMenu;
           allowKeyMenu=true;
          }
         }
        }
        function keyMenu(evt) {
         var code, e=evt || window.event;
         if(document.layers) {
          if(e.which>0) { code=e.which; }
         } else if(document.all) {
          if(e.keyCode>0) { code=e.keyCode; }
         } else if(document.getElementById) {
          if(e.charCode>0) { code=e.charCode; }
         }
         if(allowKeyMenu && code && code>=0 && menu[code]) {
          selectInput(menu[code],true)
         }
        }

        Und in selectInput() wird bei mir der zur Taste gehörige Radiobutton gesetzt. Du kannst dann ja was anderes machen.

        Gruß, Cybaer

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
    2. Hi there,

      (dem eigentlich auch noch eine <!DOCTYPE>-Zeile hätte vorangestellt werden müssen) folgt dann als erstes ein Scriptbereich, der da noch nichts zu suchen hat, sondern
         <head>
      hätte zuerst notiert werden müssen. Das heißt, dein Scriptbereich gehört _in_ den Header, und nicht irgendwohin.

      Darf ich aus selfhtml 8.1, Einführung in Javascript und DOM, zitieren:

      "Es gibt keine festen Vorschriften dafür, an welcher Stelle einer HTML-Datei ein JavaScript-Bereich definiert werden muss."

      1. Hi,

        "Es gibt keine festen Vorschriften dafür,

        Mißverständlich.

        Natürlich kann man SCRIPT überall hinsetzen - wohin es die DTD erlaubt. Z.B. auch zwischen <head> und </head> oder zwischen <body> und </body>. Aber nicht, wie Jochen es macht, zwischen <html> und <head>. =:-)

        Gruß, Cybaer

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
        1. Hi there,

          Natürlich kann man SCRIPT überall hinsetzen - wohin es die DTD erlaubt. Z.B. auch zwischen <head> und </head> oder zwischen <body> und </body>. Aber nicht, wie Jochen es macht, zwischen <html> und <head>. =:-)

          Ja klar, in der dem Dokument eigenen "Aufteilung" macht das nicht viel Sinn, aber solange es funktioniert...

          1. Hi,

            Ja klar, in der dem Dokument eigenen "Aufteilung" macht das nicht viel Sinn, aber solange es funktioniert...

            Es funktioniert nur solange, bis ein Browser-Programmierer nicht so freundlich ist, auch jenseits (hier: aller) Standards zu arbeiten. Daran kann man glauben, oder man kann sichergehen. Vieles was nicht erlaubt ist, funktioniert. Es ist trotzdem nicht erlaubt. Und wer sagt, daß es nicht erlaubt ist, der hat Recht.

            Christoph hat ja nicht gesagt, es würde nicht funktionieren ... ;-)

            Gruß, Cybaer

            --
            Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  2. Hi,

    Mein Problem: Ich will jetzt von Mausklicks auf Tastatureingabe umsteigen und kenne mich bei JavaScript überhaupt nicht aus. Ich vermute mal, dass man nur 1-2 Zeilen im Quelltext umschreiben muss

    Nein.

    Aber für komplette Lösungen, kann man auch Webdesigner beauftragen - oder eben selbst wuseln. Eine Hilfestelung hast Du ja nun schon ...

    Und BTW: onclick reagiert auch auf Tastatur.

    Gruß, Cybaer

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  3. Hi!

    Was hast du denn abgeleckt, dass der Eventhandler onlick aktiv wurde?

    Gruß aus Iserlohn

    Martin *SCNR*

    1. Hi,

      Was hast du denn abgeleckt, dass der Eventhandler onlick aktiv wurde?

      Vermutlich sabbernd einmal quer übers Motherboard! >;->

      Gruß, Cybaer

      --
      Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!