Quick-n-Dirty: Hijacking TypeAhead in CSJS

Matthias Nicklisch hat eine interessante Frage im XPages Forum gestellt, nachdem er festgestellt hat, dass im Designer zwar ein OnStart- / OnComplete-Event für die TypeAhead-Funktion angeboten wird, der Code aber als Deprecated angezeigt wird – und auf der XPage auch nicht funktioniert: Wie kann ein OnStart- / OnComplete-Event trotzdem verwendet werden?

Meine Idee dazu ist, den darunter liegenden dojo.xhr-Request zu hijacken, und auf diese Weise die Events zu erhalten. Dadurch lässt sich der Code bequem auf die jeweilige XPage einbetten, ohne das eine Manipulation der original Javascript-Dateien erfolgen muss.

Der folgender Code muß in einem CSJS-Scriptblock eingebettet werden. Dann erhält man für die TypeAhead-Funktion die Events, um zum Beispiel ein kleines „Loading“-Icon einzublenden, wenn die Daten vom Domino Server geladen werden.

var typeAheadLoad;

dojo.addOnLoad( function(){
   /*** hijacking xhr request ***/
   if( !dojo._xhr )
      dojo._xhr = dojo.xhr;

   dojo.xhr = function(){
      try{
         var args = arguments[1];
         if( args['content'] ){
            var content = args['content'];
               if( content['$$ajaxmode'] ){
                  if( content['$$ajaxmode'] == "typeahead" ){
                
                     /*** hook in load function ***/
                     typeAheadLoad = args["load"];

                     /*** overwrite error function ***/
                     args["error"] = function(){
                        alert('Error raised!') 
                     };
                    
                     /*** hijack load function ***/
                     args["load"] = function(arguments){
                  
                        /*** On Start ***/
                        alert("On Start!");
                     
                        /*** call original function ***/
                        typeAheadLoad(arguments);
                     
                        /*** On Complete ***/
                        alert("On Complete!")
                     };
                 }
             }
         }
      }catch(e){}
      dojo._xhr( arguments[0], arguments[1], arguments[2] );
   }
});
Dieser Beitrag wurde unter Allgemein, CSS, Dojo Toolkit, Errorhandling, Expression Language, Infrastruktur, Java Script, Server, Web, XPages, XSP abgelegt und mit , , , , , , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

2 Antworten zu Quick-n-Dirty: Hijacking TypeAhead in CSJS

  1. Mike Meister sagt:

    Hallo Sven,

    dieser Ansatz hat mir eine ganze Weile gute Dienste geleistet. Leider fiel mir (genauer: meinem Kunden 😉 )auf, dass dieses Hijacking nicht (oder nicht mehr wegen neuer DoJo Version 1.9?) mit Mehrfachanfragen während der Suche zurecht kommt.
    Beispiel:
    Der Anwender tippt seinen Suchbegriff nicht fortlaufend und triggert somit während der Eingabe bereits die Suche im Hintergrund. Nachdem er seine Eingabe beendet hat, triggert das TypeAhead-Feld eine erneute Suche. Es erscheint die Liste der vorgeschlagenen Werte im PopUp.
    Dieser Vorgang beschreibt das typische Verhalten, ohne den Hijack-Hack. Mit dem Hijack-Hack wird nur die erste Suche ausgeführt. Jedes weitere Tippen führt nur dann zur erneute Suche, sofern das erste Suchergebnis bereits zurückgeliefert wurde.

    Nach umfangreicher Recherche konnte ich einen neuen Ansatz erfolgreich testen:
    dojo.aspect.around
    Damit kann man sich in den Prozess des TypeAheads einklinken, ohne die ursprüngliche Routine überschreiben zu müssen.
    Ich werde ein Code-Beispiel in den org. Post auf Stack Overflow einstellen.
    Viele Grüße,
    Mike Meister

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.