Problem mit Ajax.Autocompleter

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit Ajax.Autocompleter

    Hallo ich habe ein Eingabefeld welches mit
    ajax.Autocompleter werte anzeigt, das funzt auch ganz gut,
    nur habe ich im Firebug bemerkt das der ajax Request mehr als einmal
    abgeschossen wird.

    1 Zeichen kein Request
    2 zeichen 1 mal
    3 zeichen 2 mal
    4 zeichen 3mal usw.


    PHP-Code:
    var InputWatcher=Class.create();
    InputWatcher.prototype = {
       
    initialize: function(field)
       {
          
         
    this.field=$(field);
         if(
    func=='getFebiNum')
         {
             
    this.field.onkeyup=this.getNum.bindAsEventListener(this); 
         }
         
               
          
       },
       
    getFebiNum:function(evt)
       {
          var 
    taste=evt.keyCode;
            if(
    taste==13)
          {
             var 
    value=$('hersteller').value;
             
    alert(value);
             new 
    Ajax.Updater('result_table','/ajax/ArtikelByNum/', {methode:'post',parameters:'text='+value});
          }
          else if(
    taste<38 || taste>40 )
          {
             new 
    Ajax.Autocompleter('hersteller','box_febi','/ajax/SuggestNumbers/', {paramName'text'});
          }
       }
      
    }

    var 
    watcher =  new InputWatcher('hersteller'); 
    Wenn man das auf auf paar hundert User hochrechnet wird das narülich untragbar..... warum passiert das und wie kann man das verhinder?

    Danke schon mal
    Zuletzt geändert von martin2; 19.06.2008, 11:21.
    <?php echo "ad astra"; ?>
    www.utopiafuture.de

  • #2
    Ganz einfach: du musst nach jedem Zeichen ein counter runterlaufen lassen von 500ms. Erst wenn dieser runtergelaufen ist und kein Zeichen währenddessen kommt wird der request gesendet. Wenn doch ein Zeichen kommt wird der counter zurück gesetzt und das Spiel beginnt von Vorne.

    Ich mache es immer in Prototype, deshalb kann ich dir gerade nicht den direkten Code in JS geben

    PHP-Code:
    <input type="text" onClick="startObserver(this)">

    var 
    obs;
        function 
    startObserver(element){
         if(!
    obs){
              
    obs = new Form.Element.Observer(
              
    input,
              
    0.5,
              function(
    elvalue){
                if(
    input.value.length 2)  new Ajax.Updater(elementsearch.php,
                         { 
    method'post'parameters"string"+searchstring});
              }
            )
          }
        } 
    info bei prototype:http://www.prototypejs.org/api/timedObserver
    Zuletzt geändert von zerni; 19.06.2008, 13:40.
    Killerspiele sollten in der Größenordnung von Kinder********************grafie eingeordnet werden.(G. Beckstein)
    - ...und solche Behauptungen in "falsches Resourcenmanagement"

    Kommentar


    • #3
      mit einer zeitverzögerung habe ich es auchon versucht, das grundproblem beliebt aber er setzt bei 4 Buchstaben 3 identische Request ab....völlig identische Requests.....

      (benutze übrigends scriptaculous, den großen Bruder von prototype)
      Zuletzt geändert von martin2; 19.06.2008, 13:54.
      <?php echo "ad astra"; ?>
      www.utopiafuture.de

      Kommentar


      • #4
        Habe dies durchgetestet mit Prototype 1.6.0, script.aculo.us 1.8.0 und kann den beschriebenen Effekt nicht feststellen.

        Code:
        <html>
        <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <script src="src/prototype.js" type="text/javascript"></script>
        <script src="src/scriptaculous.js" type="text/javascript"></script>
        
        <style type="text/css" media="screen">
            .selected { background-color: #888; }
        </style>
        
        <script type="text/javascript" language="javascript">
        
        window.onload = function() {
        	new Ajax.Autocompleter('inputfeld','autocompleterfeld','autocomplete_result.html', {afterUpdateElement: macheEtwas});
        }
        
        function macheEtwas(){
        	alert('Du hast '+$('inputfeld').value+' ausgesucht.');
        	return false;
        }
        
        </script>
        
        </head>
        <body>
        
        <form>
        <input id="inputfeld" type="text" style="width:220px;"/>
        <div id="autocompleterfeld" style="display:none;border:1px solid black;background-color:#ffffee;"></div>
        </form>
        
        </body>
        </html>
        Download ET-Chat v3.x.x

        Kommentar


        • #5
          mit einer zeitverzögerung habe ich es auchon versucht, das grundproblem beliebt aber er setzt bei 4 Buchstaben 3 identische Request ab....völlig identische Requests.....
          Ist doch ganz einfach: Du erzeugst jedes mal einen neuen Autocompleter - das ist doch Unsinn:
          Code:
                   this.field.onkeyup = ... getFebiNum:function(evt) {
          ...
                   new Ajax.Updater('result_table','/ajax/ArtikelByNum/', {methode:'post',parameters:'text='+value});
          ... / ...
                   new Ajax.Autocompleter('hersteller','box_febi','/ajax/SuggestNumbers/', {paramName: 'text'});
            }
          Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

          Kommentar


          • #6
            Original geschrieben von martin2
            (benutze übrigends scriptaculous, den großen Bruder von prototype)
            Scriptaculous ist nicht der große Bruder, sondern der sehr feminin angehauchte Cousin von Protoype, der in der Großstadt Kunst macht, ein paar Musiker managt und bei jeder Party im Glitterkostüm anzutreffen ist. Da er sehr großzügig ist und viele an seinem Erfolg teilhaben läßt, ist er aber allenthalben sehr beliebt.

            Kommentar


            • #7
              PHP-Code:
              var InputWatcher=Class.create();
              InputWatcher.prototype = {
                 
              initialize: function(field)
                 {
                   
              this.field=$(field);
                   
              this.field.onkeyup=this.getNum.bindAsEventListener(this); 
                        
                 },
                 
              getNum:function(evt)
                 {
                    var 
              taste=evt.keyCode;
                    if(
              taste!=13 && (taste<38 || taste>40))
                    {
                       new 
              Ajax.Autocompleter(
                                
              'hersteller',
                                
              'box_febi',
                                
              '/ajax/autocompleter/'
                                {
                                   
              paramName'text',
                                   
              afterUpdateElement:getArtDetails
                                
              }
                      );
                    }
                 }
                 
              }

              function 
              getFebiArtDetails(wert)
              {
                 new 
              Ajax.Updater('result_table','/ajax/getData/',{parameters: {text:wert.value}});
              }
              var 
              watcher =  new InputWatcher('hersteller'); 
              so sieht das jetzt aus!, trotzdem hab ich immer noch das Problen mit den Requestes...an welchen handler solltze man das ganze den binden?

              nochmal alles durch gelesen, ich mache also beijedem keyup einen neuen Ajax.Autocomleter auf das sehe ich doch richtig oder?

              Wie kann ich das verhindern? also praktisch eine Singelton implementieren?

              Erledig... das bindAsEventListener(this); ist natürlich doppel gemoppelt bei autocompleter ;-)

              PHP-Code:
              window.onload=function(){   

                       new 
              Ajax.Autocompleter(
                                
              'hersteller',
                                
              'box',
                                
              '/ajax/autocompleterfebi/'
                                {
                                   
              paramName'text',
                                   
              afterUpdateElement:getArtDetails,
                                   
              frequency:1.0                  }
                      );
                    }
                   
              function 
              getArtDetails(wert)
              {
                 new 
              Ajax.Updater('result_table','/ajax/getData/',{parameters:{text:wert.value}});

              llöst das Problem welches bei richtigem lesen der doku garnicht aufgetreten wäre....
              Zuletzt geändert von martin2; 20.06.2008, 22:55.
              <?php echo "ad astra"; ?>
              www.utopiafuture.de

              Kommentar


              • #8
                Original geschrieben von pekka
                Scriptaculous ist nicht der große Bruder, sondern der sehr feminin angehauchte Cousin von Protoype, der in der Großstadt Kunst macht, ein paar Musiker managt und bei jeder Party im Glitterkostüm anzutreffen ist. Da er sehr großzügig ist und viele an seinem Erfolg teilhaben läßt, ist er aber allenthalben sehr beliebt.
                oder so :-) gute charakterisierung
                <?php echo "ad astra"; ?>
                www.utopiafuture.de

                Kommentar

                Lädt...
                X