Kleinere Probleme bei eigener Erweiterung

  • Hallo!

    Ich hoffe, dass ich mit dieser Frage nicht in ein englischsprachiges Forum muss, da ich ansonsten ein großes Problem hätte... :oops:

    Ich habe mir eine kleine Erweiterung für ein Forum geschrieben, das im Prinzip so ähnlich funktioniert, wie ein Searchplugin. Da man für mehrere Suchbereiche jedoch mehrere Plugins benötigen würde, habe ich den Weg über eine Erweiterung mit einer Auswahl per Radiobuttons gewählt.
    Man kann die Erweiterung per Klick auf die rechte Maustaste aufrufen. Es öffnet sich dann ein kleines Fenster im Vordergrund, das ein Textfeld (Sucheingabe), drei Radiobuttons (Auswahl des Suchbereichs) und zwei Buttons (Suche und Abbruch) enthält.

    Jetzt zu den Problemen:

    Wenn sich das Suchfenster öffnet, hätte ich gerne, dass das Textfeld bereits im Fokus ist. Momentan ist scheinbar "nichts" im Fokus. Das Fenster ist wohl aktiv. Klicke ich nach Aufruf der Erweiterung auf die Tab-Taste, springt der Fokus im neuen Fenster auf das Textfeld. Mit dem nächsten Tab geht es auf die Radiobuttons, danach auf den Such-Button, dann auf den Cancel-Button und dann wieder auf das Textfeld.
    Die Reihenfolge scheint also zu stimmen. Nur sind weder Textfeld, Radiobuttons noch die Buttons beim Start fokussiert...

    Außerdem klappt es nicht mit den Zugriff auf die Buttons mit der Enter-Taste.
    Ich habe folgenden Code in meiner xul-Datei:

    Code
    <keyset>
    <key id="suchelos" keycode="VK_ENTER" oncommand="suche();"/>
    <key id="suchende" keycode="VK_ESCAPE" oncommand="window.close();"/>
    </keyset>
    
    
    <button id="Suchknopf" tabindex="3" label="Suchen" keycode="suchelos" oncommand="suche();"/>
    <button id="Schliessknopf" tabindex="4" label="Schließen" keycode="suchende" oncommand="window.close();"/>


    Bei Drücken der Esc-Taste an jeder beliebigen Stelle schließt das Fenster wie gewünscht. Leider passiert bei Drücken der Enter-Taste nur dann etwas, wenn der Fokus auf einem Button liegt. Und dann auch nur das, was bei oncommand drinsteht.
    Also bei Fokus auf Suchknopf startet mit Enter die Funktion suche(), bei Fokus auf Schließen wird mit Enter das Fenster geschlossen. Ist etwas anderes fokussiert, passiert nichts...

    Wäre schön, wenn mir jemand helfen könnte...

    Vorab herzlichen Dank!

    Gruß, Fetz

  • dem Standard-Fokus würde ich mit diesem einfachen Script begegnen:

    Code
    document.getElementByID("idDerTextbox").focus();


    ausgeführt natürlich onload bzw. onDOMContentLoaded

    Wenn du einem der Buttons das Attribut default="true" verpasst, sollte der auch zum Standard-Button werden und so beim drücken von Enter benutzt werden. Da bin ich mir aber nicht ganz sicher, vielleicht musst du auch einen Dialog benutzen.

  • Hallo Dr. Evil!

    Herzlichen Dank für die Tipps!
    Inzwischen konnte ich das mal genauer testen. Beim Setzen des default-Attributes war der Suche-Button dann auch hinterlegt (WinXP-mäßiger blauer Rand). Allerdings war der Button dennoch nicht fokussiert (schwarzer gepunkteter Rand). Daher hat er auch weiterhin nicht auf VK_ENTER reagiert. Als ich das Gefühl hatte, dass es eben an dieser Taste liegen könnte, suchte ich nach einer alternativen Taste und fand zu meiner Überraschung VK_RETURN. Und damit klappt es erstaunlicherweise problemlos.
    Was ist der Unterschied zwischen VK_ENTER und VK_RETURN? (naja, nicht sooo wichtig)

    Das mit der focus() Anweisung leuchtet mir ein. Allerdings fehlt mir da dann doch das Grundverständnis so einer Konstruktion. Ich habe nämlich den Fall dass ich aus einer xul-Datei ein Javascript per Menüklick starte

    Code
    <menuitem label="Meine Forensuche" id="WGS" oncommand="meinesuche();"/>


    Dieses Javascriptprogramm startet eine andere xul-Anwendung

    Code
    function meinesuche() {
        window.open("chrome://suchprogramm/content/search.xul", "MeineSuche", "chrome,dialog,alwaysRaised");
    }


    und in diesem Fenster habe ich schon mein Textfeld.

    Einen onload-Befehl könnte ich ja jetzt - glaube ich wenigstens - allerhöchstens in der Funktion meinesuche() einbauen, da ja nur hier etwas geladen wird (?).
    Wie lautet von hier der Zielort für mein Textfeld im Fenster "MeineSuche"? Und wo kann ich da ein onload einfügen? In den window-Tag des xul-Dokuments?

    (Ja, ich bin Javascript-Anfänger)

    Gruß, Fetz

  • in der XUL-Datei chrome://suchprogramm/content/search.xul fügst du einen script-Tag hinzu:

    Code
    <script type="application/x-javascript" src="chrome://suchprogramm/content/search.js" />


    dann erstellst du diese search.js und schreibst das rein:

    Code
    // die Funktion focusTextbox gibt der Textbox mit der ID --- den Fokus
    function focusTextbox()
    {
        document.getElementById("idDerTextbox").focus();
    }
    // wenn das Fenster komplett geladen wurde, wird die Funktion focusTextbox aufgerufen:
    window.addEventListener("load", focusTextbox, false);
  • Zitat von Fetz

    Was ist der Unterschied zwischen VK_ENTER und VK_RETURN?

    Hi Fetz,

    ohne die Konstanten zu kennen, nur nach dem Namen: Enter liegt auf dem Nummernblock (steht bei meiner Tastatur auch auf der Taste). Return liegt auf dem "normalen" Tastenblock.

    Zumeist haben die Tasten die gleiche Funktion, da es aber unterschiedliche Tasten sind, sollte es auch unterschiedliche Tastaturcodes dafür geben. Also versuche es mal mit den beiden Zeilen:

    Code
    <key id="suchelos" keycode="VK_ENTER" oncommand="suche();"/>
    <key id="suchelos" keycode="VK_RETURN" oncommand="suche();"/>

    Oder kannst Du beide im keycode zusammenfassen?

    Ciao,
    Mike

  • Hallo Mike!

    Danke für den Tipp.
    Bei mir funktioniert das ganze nur mit der Zeile, die VK_RETURN enthält. Die Suche wird mit der Taste im Num-Block und im "normalen" Tastenfeld ausgelöst. Das ist zumindest bei mir so. Kann natürlich sein, dass das nur bei meiner Rechnerkonfiguration so klappt. Sollte ich aus meiner kleinen Benutzergruppe Reklamationen erhalten, werde ich das probieren.

    Gruß, Fetz