AJAX Queue Prob [gelöst]

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • AJAX Queue Prob [gelöst]

    Hi @ all!

    da ich immer ein paar probs hatte mit mehr als einem AJAX Request, hab ich mir mal ne queue funktion "zusammengebastelt". Das grundgerüst hab ich irgendwo in nem forum gefunden und meinen bedürfnissen angepasst (wegen urheberrecht unzo ;)

    hier mal der code:

    Quellcode

    1. var queue = new Array();
    2. function req(query) {
    3. if(http) {
    4. if(http.readyState == 1 || http.readyState == 2 || http.readyState == 3) {
    5. queueLength = queue.length;
    6. queue[queueLength] = new Array();
    7. queue[queueLength][0] = query;
    8. //alert(queue[0][0]);
    9. } else {
    10. if(query == "") {
    11. http.open('GET', 'scripts/rpc.php', true);
    12. } else {
    13. http.open('POST','scripts/rpc.php', true);
    14. http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    15. http.send(query);
    16. //alert(query);
    17. }
    18. http.onreadystatechange = function () {
    19. var update = new Array();
    20. if(http.readyState == 4) {
    21. if(http.status == 200) {
    22. var response = http.responseText;
    23. if(response.indexOf('|' != -1)) {
    24. // alert(queue.length);
    25. update = response.split('|');
    26. //alert(update);
    27. document.getElementById(update[0]).innerHTML = update[1];
    28. //alert(queue.length);
    29. }
    30. } else if(http.status == 404) {
    31. document.getElementById(update[0]).innerHTML = 'Die Datei wurde nicht gefunden!';
    32. }
    33. // alert(queue.length);
    34. /* Warteschlange abarbeiten */
    35. queueLength = queue.length;
    36. // alert(queue.length);
    37. if(queueLength != 0) {
    38. req(queue[0][0]);
    39. queue.shift(); //Erstes Element entfernen, den Rest eine Position nach vorne rücken
    40. //alert('queue funzt!?');
    41. }
    42. }
    43. };
    44. if(query == "") {
    45. http.send(null);
    46. }
    47. }
    48. }
    49. }
    Alles anzeigen


    jetzt zu dem problem:

    wie man in der zeile zwischen 47 und 48 ( -.- ) sehen kann, wird im fall das ein request noch im queue array liegt die funktion nochmal aufgerufen

    -> req(queue[0][0]);

    mit dem entsprechenden query string als parameter. problem bei der sache, die funktion ruft sich zwar selbst auf allerdings passiert nix mehr.

    Bsp. ich habe ne Seite in der 3 <div>´s fest drin stehen. alle werden per css ausgerichtet.
    div 1: navigations menue (linke seite, oben) immer visible
    div 2: output, wenn man so will... da werden ALLE daten angezeigt, eigentlich auch immer visible ;)
    div 3: div für zusatz anzeigen, wird nur sporadisch benutzt zb bei ausgabe der live suche^^

    code:

    Quellcode

    1. <div id="menue" class="links">
    2. <ul class="navi">
    3. <li><a href="javascript:show(0)">Status</a></li>
    4. <li><a href="javascript:show(10);">Anzeigen</a></li>
    5. <ul id="subanzeige" class="navi" style="visibility:hidden;"></ul>
    6. <li><a href="javascript:show(11)">Eintragen</a></li>
    7. <li><a href="javascript:show(12)">Suchen</a></li>
    8. <li><a href="javascript:show(13)">Einstellungen</a></li>
    9. </ul>
    10. </div>
    11. <div id="ajax" class="ajax" style="visibility:hidden;text-align:center;"></div>
    12. <div id="ajax2" class="ajax" style="visibility:hidden;text-align:center;"></div>
    Alles anzeigen


    wie man sieht ist in zeile 6 ne 2. liste die defaultmäßig hidden is und nur per klick auf den link "Anzeigen" visible wird.

    in js sieht die routine folgendermaßen aus:

    Quellcode

    1. // gehört zur function show(cat) ...
    2. case 10:
    3. closesubs();
    4. document.getElementById('ajax').style.visibility = "visible";
    5. req('act=show&what='+cat);
    6. submen();
    7. /*try {
    8. setTimeout("submen()",500);
    9. }
    10. catch (E) {
    11. setTimeout("submen()",1000);
    12. }*/
    13. break;
    14. // function submen
    15. function submen(){
    16. if (document.getElementById('subanzeige').innerHTML != '') {
    17. document.getElementById('subanzeige').innerHTML = '';
    18. document.getElementById('subanzeige').style.visibility = "hidden";
    19. } else {
    20. document.getElementById('subanzeige').style.visibility = "visible";
    21. req('act=subanz');
    22. }
    23. }
    Alles anzeigen


    wenn ich das submenü innerhalb der try..catch anweisung und mit settimeout aufrufe funzt das ganze wunderbar... testweise direkt aufgerufen und try..catch auskommentiert, tut sich nix mehr...


    wie man in der queue funktion sieht sind einige alerts drin um zu sehen wie weit die jeweiligen query strings kommen...

    also nochmal: problem ist, das trotz "funktionierendem" queue die funktion nicht korrekt arbeitet und die entsprechenden daten anzeigt... sprich das submenü


    any ideas?


    thx a lot -> da BendIt
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!
  • vorweg: bist du mit deiner visbility Lösung zufrieden? Da das Element bleibt und nur unsichtbar wird, nutze ich das eigentlich gar nicht. Ich toggle immer zwischen display:none|block

    jetzt zum eigentlichen Problem:
    Die Queue sieht eigentlich ganz gut aus... könnte sein, dass zwischen 46 und 47 noch ein sleep könnte. Hatte aber auch nie eine Queue die 100%ig funktioniert hat. Ich nutze seit längerem nur noch jquery.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    *lol* ja.. meine antwort war schon länger getippt bis ich sie abgesendet habe
    Blöde Internetabmahnerei... grad wieder eine bekommen und war erstmal geschockt..
  • also bis jetzt gings eigentlich ganz gut mit der visibility lösung... außer halt ie... der peilt das nicht wenn mans wieder hidet :-/ aber das find ich nicht sooo wichtig... wer ie nutzt ist selber schuld (find ich :)))

    wie meinst du das mit sleep? afaik kennt js doch kein sleep(?) oder irre ich mich da?

    queue funzt bis jetzt auch ganz gut...wäre aber wohl dran verzweifelt wenn ich den o.g. foren eintrag mit firebug nicht gefunden hätte... weil vom logischen/programmtechnischen is die queue function imho völlig i.o. :) *freu* wenn ich das mit dem laufzeitfehler noch hinbekomme bin ich voll zu frieden^^

    btw: mit display none/block werd ich mal testen... ;)
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!