Toon posts:

[AJAX] Meerdere requests uitvoeren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb de volgende javascript code voor het bereiken van een simpele AJAX-functionaliteit. Het probleem is echter dat als de functie 2 keer wordt aangeroepen, alleen de 2e keer maar goed wordt uitgevoerd. Hier is de code (het gaat vooral om de code in de onderste if):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
var counter = 0;

function load(frame, args) 
{
    var alerted;
    var requests = new Array();
    
    counter = counter + 1;
    
    /*@cc_on @*/
    /*@if (@_jscript_version >= 5)
        try 
        {
            requests[counter]=new ActiveXObject("Msxml2.XMLHTTP")
        } 
        catch (e) 
        {
            try 
            {
                requests[counter]=new ActiveXObject("Microsoft.XMLHTTP")
            } 
            catch (e) 
            {
                alert("Error: Browser doesn't contain Microsofts XML parsers.")
            }
        }
    @else
        alert("Error: Browser doesn't support JScript 5.")
        requests[counter]=false
        alerted=true
    @end @*/
        
    if (!requests[counter] && !alerted) 
    {
        try 
        {
            requests[counter] = new XMLHttpRequest();
        } 
        catch (e) 
        {
            alert("Error: Browser doesn't support XMLHttpRequest.")
        }
    }
        
    if (requests[counter]) 
    { 
        requests[counter].open("GET", "index.php?frame=" +frame +args, true);
        requests[counter].onreadystatechange = function() 
        {
            if (requests[counter].readyState == 4) 
            {
                document.getElementById(frame).innerHTML = requests[counter].responseText;
            }
        }
        
        requests[counter].send(null);
    }
}


Weet iemand wat hier mis gaat?

[ Voor 5% gewijzigd door Verwijderd op 21-03-2006 12:15 ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

(jarig!)
Wat als je je requests queue nu ook global maakt?

Intentionally left blank


Verwijderd

Topicstarter
Werkt nog steeds niet dan...

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Ik kan zoveel requests doen als ik wil :?
Moet wel zeggen dat ik het object altijd in een apparte functie hou:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function getHTTPObject() 
{
    var xmlhttp;
    
    if (window.XMLHttpRequest)
    {
        xmlhttp = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else
    {
        alert('Script werkt niet met deze browser!');
    }

    return xmlhttp;
}

var http = getHTTPObject();


/edit
Zoals crisp zegt ;)

[ Voor 11% gewijzigd door XWB op 21-03-2006 13:37 ]

March of the Eagles


Verwijderd

Topicstarter
Is die met /*@cc_on @*/ omgeven code wel nodig in mijn code voorbeeld? Ik heb dit eens een keer ergens uit een voorbeeld gehaald...

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

(jarig!)
Ik zou gewoon lekker zo doen:
JavaScript:
1
2
3
4
5
6
7
if (!window.XMLHttpRequest)
{
  function XMLHttpRequest()
  {
    ...
  }
}

Dan kan je in je normale code gewoon overal
JavaScript:
1
var foo = new XMLHttpRequest();

gebruiken zonder allerlei afvragingen te hoeven doen...

Intentionally left blank


Verwijderd

Topicstarter
Deze oplossingen werken hier niet, het vreemde is dat als ik op refresh blijf duwen soms beide "frames" worden vervangen met de content van de 2e aanroep en soms alleen de laatste en soms helemaal geen.

De aanroep doe ik nu trouwens zo (misschien dat dat duidelijkheid geeft):

<body onLoad="javascript:load('left', '');javascript:load('main', '');">

Daarna heb ik 2 divs, die ik dan frames noem in m'n script met de id's left en main...

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

crisp schreef op dinsdag 21 maart 2006 @ 13:32:
Ik zou gewoon lekker zo doen:
JavaScript:
1
2
3
4
5
6
7
if (!window.XMLHttpRequest)
{
  function XMLHttpRequest()
  {
    ...
  }
}

Dan kan je in je normale code gewoon overal
JavaScript:
1
var foo = new XMLHttpRequest();

gebruiken zonder allerlei afvragingen te hoeven doen...
Volgens mij had jij ooit deze code nog geschreven:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if (!window.XMLHttpRequest)
{
    window.XMLHttpRequest = function()
    {
        var types = [
                'Microsoft.XMLHTTP',
                'MSXML2.XMLHTTP.5.0',
                'MSXML2.XMLHTTP.4.0',
                'MSXML2.XMLHTTP.3.0',
                'MSXML2.XMLHTTP'
                ];

        for (var i = 0; i < types.length; i++)
        {
            try
            {
                return new ActiveXObject(types[i]);
            }
            catch(e) {}
        }

        return undefined;
    }
}

Deze vind ik zelf wel vrij netjes eigenlijk. Deze gebruik ik dan ook vrij vaak.

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

(jarig!)
Verwijderd schreef op dinsdag 21 maart 2006 @ 13:55:
De aanroep doe ik nu trouwens zo (misschien dat dat duidelijkheid geeft):

<body onLoad="javascript:load('left', '');javascript:load('main', '');">

wellicht niet helemaal relevant mbt je probleem, maar gebruik aub geen javascript: pseudo-protocol in event-handlers...
eghie schreef op dinsdag 21 maart 2006 @ 14:30:
[...]

Volgens mij had jij ooit deze code nog geschreven:
Klopt ja, maar ik had geen zin om 'm op te zoeken :P

Intentionally left blank


Verwijderd

Topicstarter
Maar met die code blijf ik toch hetzelfde probleem houden met meerdere requests of niet?

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

(jarig!)
Het probleem is de variabele counter in je closure; aangezien dat een global is zal het niet de waarde bevatten die je zou willen hebben.
Ik heb zelf even een kort werkend voorbeeld gemaakt:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<html>
<head>
<title>load 2</title>
<script type="text/javascript">

if (!window.XMLHttpRequest)
{
    window.XMLHttpRequest = function()
    {
        var types = [
            'Microsoft.XMLHTTP',
            'MSXML2.XMLHTTP.5.0',
            'MSXML2.XMLHTTP.4.0',
            'MSXML2.XMLHTTP.3.0',
            'MSXML2.XMLHTTP'
        ];

        for (var i = 0; i < types.length; i++)
        {
            try
            {
                return new ActiveXObject(types[i]);
            }
            catch(e) {}
        }
    
        return undefined;
    }
}

var requests = [];
function load(url, frame)
{
    var i = requests.length;
    requests[i] = new XMLHttpRequest();
    if (requests[i])
    {
        requests[i].open('GET', url, true);
        requests[i].onreadystatechange = function() 
        {
            if (requests[i].readyState == 4) 
            {
                document.getElementById(frame).innerHTML = requests[i].responseText;
                requests[i] = null;
            }
        }
        
        requests[i].send(null);
    }
    else
    {
        alert('no AJAX support');
    }
}
</script>
</head>
<body onload="load('http://localhost/test1.txt', 'number1');load('http://localhost/test2.txt', 'number2');">
<div id="number1"></div>
<div id="number2"></div>
</body>
</html>

hth

[ Voor 10% gewijzigd door crisp op 21-03-2006 16:55 ]

Intentionally left blank


Verwijderd

Topicstarter
Bedankt! Helemaal perfect :D
Pagina: 1