Ergebnis 1 bis 12 von 12
  1. #1
    L4KE 0F F!RE ist offline Grünschnabel
    registriert
    11-11-2008
    Beiträge
    7

    Problem bei meinem AJAX Object

    hallo ich habe ein prob mit meiner ajax klasse:
    und zwar an der stelle
    PHP-Code:
    this.http.onreadystatechange this.makeResult
    in der fuction this.makeResult ist this.http undefined

    und
    PHP-Code:
    this.timeout window.setTimeout("this.abortRequest();"10000); 
    hier gilt das gleiche

    hier ist der komplette code
    PHP-Code:
    <script>
    var 
    ajax_request = new Array();
    // object start
    function ajaxRequest()
    {
        
    this.obj_nr 0;
        
    args ajaxRequest.arguments;
        
    arg_cnt 0;
        
    // arguments
        
    if(args.length arg_cntthis.obj_nr args[arg_cnt];
        
    arg_cnt++;
        
    //
        
    this.http null;
        
    this.timeout null;
        
    this.http_active false;
        
    this.element_id false;
        if (
    window.XMLHttpRequest)
        {
            
    this.http = new XMLHttpRequest();
        }
        else if (
    window.ActiveXObject)
        {
            
    this.http = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }

    ajaxRequest.prototype.sendRequest = function(url)
    {
        
    send_method "GET";
        
    http_send null;
        
    args this.sendRequest.arguments;
        
    arg_cnt 1;
        
    // arguments
        
    if(args.length arg_cntthis.element_id args[arg_cnt];
        
    arg_cnt++;
        if(
    args.length arg_cntsend_method args[arg_cnt];
        
    arg_cnt++;
        if(
    args.length arg_cnthttp_send args[arg_cnt];
        
    arg_cnt++;
        
    // next argument
        
    this.http_active true;
        if(
    this.http != null)
        {
            
    this.timeout window.setTimeout("this.abortRequest();"10000);
            
    this.http.open(send_methodurltrue);
            
    // alert(this.http); // gibt "[object XMLHttpRequest]" aus
            
    this.http.onreadystatechange this.makeResult;
            if(
    send_method == "POST")
            {
                
    this.http.setRequestHeader(
                    
    "Content-Type",
                    
    "application/x-www-form-urlencoded");
            }
               
    this.http.send(http_send);
        }
        
    }

    ajaxRequest.prototype.makeResult = function()
    {
        
    // alert(this.http); // gibt "undefined" aus
        
    if(this.http.readyState == 4)
        {
            
    window.clearTimeout(this.timeout);
            
    requestResult this.http.responseText;
            
    xjs find_js(requestResult);
            if(
    this.element_id != falsedocument.getElementById(this.element_id).innerHTML requestResult;
            
    this.http_active false;
            eval(
    xjs);
        }
    }

    ajaxRequest.prototype.abortRequest = function()
    {
        
    this.http.abort();
        
    this.http_active false;
    }
    // object ende

    function getSlot()
    {
        
    free_slot false;
        for(
    r=0r<ajax_request.lengthr++)
        {
            if(
    ajax_request[r].http_active == false)
            {
                
    free_slot r;
                break;
            }
        }
        if(
    free_slot == false)
        {
            
    free_slot ajax_request.length;
            
    ajax_request[free_slot] = new ajaxRequest(free_slot);
        }
        return 
    free_slot;
    }
    function 
    loadPage(urlel)
    {
        
    slot getSlot();
        
    ajax_request[slot].sendRequest(urlel);
    }

    function 
    sendForm(formnameel)
    {
        
    url document.forms[formname].action;
        
    slot getSlot();
        
    formvalues getFormValues(formname);
        
    ajax_request[slot].sendRequest(urlel"POST"formvalues);
    }

    function 
    find_js(file_string// durchsucht string nach js
    {
        
    // ... funktioniert alles
        
    return js;
    }

    function 
    getFormValues(formname// gibt die formularfelder und werte aus
    {
        
    // ... funktioniert alles
        
    return formname;
    }
    </script> 
    danke im voraus für eure hilfe

  2. #2
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Problem bei meinem AJAX Object

    Dein Problem ist nicht das AJAX Objekt, sondern ein Verständnisproblem. this ist immer der Kontext in der die Funktion aufgerufen wird. Also das Objekt was vor der Funktion steht.
    PHP-Code:
    window.Funktion = function() { /* this == window */};
    object.onevent = function() { /* this == object */};
    object.onevent anderesObjekt.Funktion/* this == object */ 
    Das bedeutet, du kannst Event- oder Callbackfunktionen nicht als prototype deklarieren, da du, um dieses Problem zu umgehen, eine lokale Kopie von deinem Objekt anlegen musst und in deiner Funktion benutzen.

    Ganz gefährlich an deinem Code ist aber, dass du fast ausschließlich globale Variabeln verwendest, was in diesem zusammenhang zu Fehlfunktionen führen muss.

  3. #3
    L4KE 0F F!RE ist offline Grünschnabel
    registriert
    11-11-2008
    Beiträge
    7

    AW: Problem bei meinem AJAX Object

    das ist meine erste js klasse^^ ich bin eher so der php typ ;-) ich kenn mich nicht soo gut in js aus...

    ich verstehe nicht ganz, wie ich eine lokale kopie des objektes anlege.
    ich nehme an, dass du mit globalen variablen "this" meinst, verstehe aber nicht, was daran gefährlich ist.

    könnte mir einer ein beispiel geben, wie ich mein prob umgehen kann?

    thx

  4. #4
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Problem bei meinem AJAX Object

    Du kennst das Schlüsselwort var?
    Mach dich mal schlau darüber, das beantwortet alle deine Fragen.

    und mehr über OOP in JS findest du hier:
    Private static members in JavaScript | bah! la realtà!
    Private Members in JavaScript

    und gerade gefunden: Peter Kropff - JavaScript - OOP mit JavaScript
    Geändert von ein schlauer (11-11-2008 um 13:28 Uhr)

  5. #5
    L4KE 0F F!RE ist offline Grünschnabel
    registriert
    11-11-2008
    Beiträge
    7

    AW: Problem bei meinem AJAX Object

    klar jetzt wo du es sagst... var in js ist das gleiche wie global in php

    und warum muss die globale variable ajax_request zu einem fehler führen? die variable gehört doch gar nicht zur klasse sondern ist nur eine instanz. ich will mehrere instanzen dieser klasse aufrufen und überprüfe lediglich welche der instanzen gerade aktiv ist und wenn alle aktiv sind soll er eine neue instanz erstellen, damit ich mehrere requests auf einmal machen kann...

    ich habe jetzt das prototype gedöhns rausgenommen.

    PHP-Code:
    <script>
    // object start
    function ajaxRequest()
    {

        
    this.obj_nr 0;
        var 
    args ajaxRequest.arguments;
        var 
    arg_cnt 0;
        
    // arguments
        
    if(args.length arg_cntthis.obj_nr args[arg_cnt];
        
    arg_cnt++;
        
    //
        
    this.http null;
        
    this.timeout null;
        
    this.http_active false;
        
    this.element_id false;
        if (
    window.XMLHttpRequest)
        {
            
    this.http = new XMLHttpRequest();
        }
        else if (
    window.ActiveXObject)
        {
            
    this.http = new ActiveXObject("Microsoft.XMLHTTP");
        }
        
        
    this.sendRequest = function(url// private
        
    {
            var 
    send_method "GET";
            var 
    http_send null;
            var 
    args this.sendRequest.arguments;
            var 
    arg_cnt 1;
            
    // arguments
            
    if(args.length arg_cntthis.element_id args[arg_cnt];
            
    arg_cnt++;
            if(
    args.length arg_cntsend_method args[arg_cnt];
            
    arg_cnt++;
            if(
    args.length arg_cnthttp_send args[arg_cnt];
            
    arg_cnt++;
            
    // next argument
            
    this.http_active true;
            if(
    this.http != null)
            {
                
    this.timeout window.setTimeout("ajax_request["+this.obj_nr+"].abortRequest();"10000);
                
    this.http.open(send_methodurltrue);
                
    alert(this.http);
                
    this.http.onreadystatechange ajax_request[this.obj_nr].makeResult;
                if(
    send_method == "POST")
                {
                    
    this.http.setRequestHeader(
                        
    "Content-Type",
                        
    "application/x-www-form-urlencoded");
                }
                   
    this.http.send(http_send);
            }
            
        }

        function 
    makeResult() // public
        
    {
            
    alert(this.http);
            if(
    this.http.readyState == 4)
            {
                
    window.clearTimeout(this.timeout);
                var 
    requestResult this.http.responseText;
                var 
    xjs find_js(requestResult);
                if(
    this.element_id != falsedocument.getElementById(this.element_id).innerHTML requestResult;
                
    this.http_active false;
                eval(
    xjs);
            }
        }

        function 
    abortRequest() // public
        
    {
            
    this.http.abort();
            
    this.http_active false;
        }
    }
    // object ende

    var ajax_request = new Array(); // instanzen der klasse

    function getSlot() // gibt "inaktive instanz zurück oder erstellt eine neue instanz"
    {
        
    free_slot false;
        for(
    r=0r<ajax_request.lengthr++)
        {
            if(
    ajax_request[r].http_active == false)
            {
                
    free_slot r;
                break;
            }
        }
        if(
    free_slot == false)
        {
            
    free_slot ajax_request.length;
            
    ajax_request[free_slot] = new ajaxRequest(free_slot);
            
    // ajax_request[free_slot].newRequest();
        
    }
        return 
    free_slot;
    }

    function 
    loadPage(urlel)
    {
        
    slot getSlot();
        
    ajax_request[slot].sendRequest(urlel);
    }

    function 
    sendForm(formnameel)
    {
        
    url document.forms[formname].action;
        
    slot getSlot();
        
    formvalues getFormValues(formname);
        
    ajax_request[slot].sendRequest(urlel"POST"formvalues);
    }

    function 
    find_js(file_string// durchsucht string nach js
    {
        
    // ... funktioniert alles
        
    return js;
    }

    function 
    getFormValues(formname// gibt die formularfelder und werte aus
    {
        
    // ... funktioniert alles
        
    return formname;
    }
    </script> 
    Geändert von L4KE 0F F!RE (11-11-2008 um 14:41 Uhr)

  6. #6
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Problem bei meinem AJAX Object

    Zitat Zitat von L4KE 0F F!RE Beitrag anzeigen
    klar jetzt wo du es sagst... var in js ist das gleiche wie global in php
    Nein, es ist genau das gegenteil. Alle variabeln die nicht mit var deklariert werden sind global.

  7. #7
    L4KE 0F F!RE ist offline Grünschnabel
    registriert
    11-11-2008
    Beiträge
    7

    AW: Problem bei meinem AJAX Object

    so hab meinen vorigne beitrag geupdated und meinen aktuellen code eingefügt.

    Zitat Zitat von ein schlauer Beitrag anzeigen
    Nein, es ist genau das gegenteil. Alle variabeln die nicht mit var deklariert werden sind global.
    oh... da hab ich wohl mal was falsch verstanden...
    aber ich verstehe immer noch nicht, warum er nicht auf this.http zugreifen kann... ich habe das ganze jetzt über die instanz gemacht
    PHP-Code:
    ajax_request = new Array();
    ajax_request[0] = new ajaxRequest(0);
    ajax_request[0].sendRequest('ajax.php''destination_div'); 
    PHP-Code:
    // object start
    function ajaxRequest()
    {
    // ...
        
    this.sendRequest = function(url)
        {
            
    this.timeout window.setTimeout("ajax_request["+this.obj_nr+"].abortRequest();"10000);
    // ...
            
    this.http.onreadystatechange ajax_request[this.obj_nr].makeResult;
    // ...
        
    }
    // ...

    Geändert von L4KE 0F F!RE (11-11-2008 um 14:42 Uhr)

  8. #8
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Problem bei meinem AJAX Object

    Weil in der Funktion this nicht deine Instanz ist. Normalerweise wäre this == this.http, bei einem AJAX Aufruf ist dies aber nicht der Fall und this zeigt einfach auf die Funktion.

  9. #9
    L4KE 0F F!RE ist offline Grünschnabel
    registriert
    11-11-2008
    Beiträge
    7

    AW: Problem bei meinem AJAX Object

    soooo ich habe mein problem mit einer anonymen function gelöst:

    PHP-Code:
    ajax_request = new Array();
    ajax_request[0] = new ajaxRequest(0);
    ajax_request[0].sendRequest('ajax.php''destination_div');  

    // object start
    function ajaxRequest()
    {
        
    this.obj_nr 0;
        var 
    args ajaxRequest.arguments;
        var 
    arg_cnt 0;
        
    // arguments
        
    if(args.length arg_cntthis.obj_nr args[arg_cnt];
        
    arg_cnt++;
        
    // ...
        
    this.sendRequest = function(url)
        {
            
    this.timeout window.setTimeout("ajax_request["+this.obj_nr+"].abortRequest("+this.obj_nr+");"10000);
            
    // ...
            
    this.http.onreadystatechange = new Function("ajax_request["+this.obj_nr+"].makeResult("+this.obj_nr+");");
            
    // ...
        
    }
        
    // ...

    hier noch mal der komplette code:
    PHP-Code:
    <script>
    // object start
    function ajaxRequest()
    {

        
    this.obj_nr 0;
        var 
    args ajaxRequest.arguments;
        var 
    arg_cnt 0;
        
    // arguments
        
    if(args.length arg_cntthis.obj_nr args[arg_cnt];
        
    arg_cnt++;
        
    //
        
    this.http null;
        
    this.timeout null;
        
    this.http_active false;
        
    this.element_id false;
        if (
    window.XMLHttpRequest)
        {
            
    this.http = new XMLHttpRequest();
        }
        else if (
    window.ActiveXObject)
        {
            
    this.http = new ActiveXObject("Microsoft.XMLHTTP");
        }
        
        
    this.sendRequest = function(url)
        {
            var 
    send_method "GET";
            var 
    http_send null;
            var 
    args this.sendRequest.arguments;
            var 
    arg_cnt 1;
            
    // arguments
            
    if(args.length arg_cntthis.element_id args[arg_cnt];
            
    arg_cnt++;
            if(
    args.length arg_cntsend_method args[arg_cnt];
            
    arg_cnt++;
            if(
    args.length arg_cnthttp_send args[arg_cnt];
            
    arg_cnt++;
            
    // next argument
            
    this.http_active true;
            if(
    this.http != null)
            {
                
    this.timeout window.setTimeout("ajax_request["+this.obj_nr+"].abortRequest("+this.obj_nr+");"10000);
                
    this.http.open(send_methodurltrue);
                
    // alert(this.http);
                // this.http.onreadystatechange = this.makeResult(this.obj_nr);
                
                
    this.http.onreadystatechange = new Function("ajax_request["+this.obj_nr+"].makeResult("+this.obj_nr+");");
                
                if(
    send_method == "POST")
                {
                    
    this.http.setRequestHeader(
                        
    "Content-Type",
                        
    "application/x-www-form-urlencoded");
                }
                   
    this.http.send(http_send);
            }
            
        }

        
    this.makeResult = function(nr)
        {
            if(
    ajax_request[nr].http.readyState == 4)
            {
                
    window.clearTimeout(ajax_request[nr].timeout);
                var 
    requestResult ajax_request[nr].http.responseText;
                var 
    xjs find_js(requestResult);
                if(
    ajax_request[nr].element_id != falsedocument.getElementById(ajax_request[nr].element_id).innerHTML requestResult;
                
    ajax_request[nr].http_active false;
                eval(
    xjs);
            }
        }

        
    this.abortRequest = function(nr)
        {
            
    ajax_request[nr].http.abort();
            
    ajax_request[nr].http_active false;
        }
    }
    // object ende

    ajax_request = new Array();

    function 
    getSlot()
    {
        var 
    free_slot false;
        for(
    r=0r<ajax_request.lengthr++)
        {
            if(
    ajax_request[r].http_active == false)
            {
                
    free_slot r;
                break;
            }
        }
        if(
    free_slot == false)
        {
            
    free_slot ajax_request.length;
            
    ajax_request[free_slot] = new ajaxRequest(free_slot);
        }
        return 
    free_slot;
    }
    function 
    loadPage(urlel)
    {
        var 
    slot getSlot();
        
    ajax_request[slot].sendRequest(urlel);
    }

    function 
    sendForm(formnameel)
    {
        var 
    url document.forms[formname].action;
        var 
    slot getSlot();
        var 
    formvalues getFormValues(formname);
        
    ajax_request[slot].sendRequest(urlel"POST"formvalues);
    }

    function 
    find_js(file_string)
    {
        
    // ...
        
    return js;
    }

    function 
    getFormValues(formname)
    {
        
    // ...
        
    return returnstring;
    }
    </script> 
    danke für eure hilfe
    gruß victor
    Geändert von L4KE 0F F!RE (11-11-2008 um 15:37 Uhr)

  10. #10
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Problem bei meinem AJAX Object

    Das ist keine anonyme Funktion, sondern ein Funktionsobjekt was du da erzeugst.

    Eine anonyme Funktion (mit einer lokalen Kopie) sähe so aus:
    PHP-Code:
    var self this;
    this.http.onreadystatechange = function() {
    self.makeResult();
    }; 
    Diesen Trick kannst du in allen deinen Funktion benutzen und sparst dir den Zugriff auf das Array.

    Deine Kommentare sind falsch, die private Funktion ist public und die die du public nennst sind private.

    Den Timeout brauchst du meines wissens nicht, da das Request Objekt diesen selbst sendet.

  11. #11
    L4KE 0F F!RE ist offline Grünschnabel
    registriert
    11-11-2008
    Beiträge
    7

    AW: Problem bei meinem AJAX Object

    ja habs gemerkt, dass die comments net stimmen... aber danke noch mal...

    die lokale kopie darf ich dann aber nicht global machen sondern muss sie mit var setzten, richtig? ist self dann auch bei dem timeout, den ich meiner meinung nach brauch um diverse variablen auf default zu setzen, auch noch verfügbar? also ich habs net hinbekommen.

    kann ich dann ind den durch die lokale kopie aufgerufenen funktionen noch this benutzen oder muss ich da auch self benutzen?

  12. #12
    L4KE 0F F!RE ist offline Grünschnabel
    registriert
    11-11-2008
    Beiträge
    7

    AW: Problem bei meinem AJAX Object

    verdammt ich hatte einen schreibfehler drinnen...

    aber danke für den tipp...

Ähnliche Themen

  1. ajax frage und problem nach request
    Von Party im Forum JavaScript
    Antworten: 3
    Letzter Beitrag: 26-08-2008, 15:39
  2. ajax problem
    Von skymuss im Forum JavaScript
    Antworten: 4
    Letzter Beitrag: 09-03-2008, 14:47
  3. Antworten: 1
    Letzter Beitrag: 05-03-2008, 14:35
  4. Antworten: 5
    Letzter Beitrag: 10-10-2007, 12:05
  5. Problem mit IE, Ajax & onload
    Von maj0re im Forum JavaScript
    Antworten: 2
    Letzter Beitrag: 16-10-2006, 18:38

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •