Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[js] Probleem met return en ajax

Pagina: 1
Acties:

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 13-11 16:12
Ik probeer iets heel simpels. Ik heb een javascript dat prima werkt dat ik gebruik voor ajax. normaal gebruik ik dit gewoon met een div id, maar nu wil ik het in een andere functie gebruiken. Ik wil dat als je met je muis over een text heen gaat (een span), dat door middel van een onmouseover de inhoud van een bepaald bestaand (via ajax) weergegeven wordt. Dit bestand is een php scriptje dat wat info uit de database haalt.

Ik heb de volgende code:

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
var requests = []; 
function load2(url) 
{ 

    var i = requests.length; 
    requests[i] = new XMLHttpRequest(); 

    if (requests[i]) 
    { 
           url = 'data.php?' + url;    
        requests[i].open('GET', url, true); 
        requests[i].onreadystatechange = function()  
        {           
            if (requests[i].readyState == 4)  
            { 
                var content = requests[i].responseText;
                alert(content); //dit werkt
            //return content;  //deze werkt niet
            
            requests[i] = null; 
            } 
        } 
         
        requests[i].send(null); 
    } 
   return content;  //en deze dus ook niet
} 

function test()
{
    resultaat = load2('action=23');
    
    alert(resultaat);
        
}


in de html heb ik gewoon even:

code:
1
<span onmouseover="test()">hoi hoi </span>


zodat functie test aangeroepen wordt als je met je muis er over heen gaat. functie test roept functie load2 aan, wat ik even heb gemaakt om het probleem duidelijk te maken.

met de code zoals hierboven krijg je eerst een alert met de data er in, die wordt in functie load2 gegeven, en daarna een alert met "undefined". ik kan gewoon op geen enkele manier de waarde van variabele content terug koppelen naar functie test. Ik heb ook allerlei rare manieren geprobeerd zoals variabele content in een andere variabele zetten en die dan terug te sturen, maar ook dat werkt niet.

ik snap er echt helemaal niks meer van, hoe kan het nou dat ie hem wel kan alerten, wat dus bewijst dat het goed werkt en dat er data in staat, maar vervolgens niet terug kan sturen dmv return :?

Leef lekker in het nu, er is niks anders


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Laat me raden, het ajax script heb je gekopieerd?

Je return statement geeft het resultaat terug aan 'onreadystatechange'. Wat je kunt doen is het resultaat naar requests[i].response wegschrijven na het ifblock daarvan de waarde terug geven (return requests[i].response).

If it isn't broken, fix it until it is..


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waar hoort mijn topic?
PRG >> WEB

Je call wordt A-synchroon uitgevoerd (vandaar AJAX) en dus wordt de call naar je (nu: anonieme) functie pas uitgevoerd "onready". Je kunt die anonieme functie natuurlijk ook gewoon veranderen naar een 'gewone' functie waarin je je zaken afhandelt. (Overigens zie ik dan zo snel ook het nut niet van een requests array).

[ Voor 64% gewijzigd door RobIII op 04-07-2008 16:08 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:25

Janoz

Moderator Devschuur®

!litemod

Probeer te begrijpen hoe een asynchrone call werkt. Wat er nu gebeurt is dat je een request doet en vervolgens een nieuwe functie definieerd (de onreadystatechange) die wordt uitgevoerd zodra hij klaar is. De originele load2 functie loopt gewoon door. Aan het einde is het re2quest natuurlijk nog niet klaar dus returned hij helemaal niks.

Wat jij wilt is een synchrone call. Daarbij blijft de aanroep net zo lang wachten totdat het resultaat er is.

Hier staat wel iets over de parameters die je dan nodig hebt :
http://msdn.microsoft.com/en-us/library/ms536648(VS.85).aspx

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 13-11 16:12
ahhhh nu snap ik het :) Best simpel achteraf... ;)

Omdat de call asychrone was, kwam hij inderdaad nooit bij de return. Ik heb nu het e.a. veranderd en nu werkt het wel, bedankt :)

Had ik het nou maar eerder gepost, ben al vanaf 12:30 hiermee bezig :(

Leef lekker in het nu, er is niks anders


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

RobIII schreef op vrijdag 04 juli 2008 @ 16:06:
Waar hoort mijn topic?
PRG >> WEB

Je call wordt A-synchroon uitgevoerd (vandaar AJAX) en dus wordt de call naar je (nu: anonieme) functie pas uitgevoerd "onready". Je kunt die anonieme functie natuurlijk ook gewoon veranderen naar een 'gewone' functie waarin je je zaken afhandelt. (Overigens zie ik dan zo snel ook het nut niet van een requests array).
De array is nodig als de ajax implementatie als object is uitgevoerd. Zonder de array kan anders de javascript engine nooit meer de callback benaderen. De array zorgt er eigenlijk voor dat de scope van de object veranderd naar applicatie level (in plaats van de functie scope). De anonieme callback kan gebruikt worden voor een simpele validatie waarna de applicatie callback wordt aangeroepen.

JavaScript:
1
2
3
4
5
Ajax ajax = new Ajax();
ajax.url = "http://www.website.nl/eventlog.aspx";
ajax.successHandler = handleEventUpdate;
ajax.errorHandler = handlerEventUpdateError;
ajax.Submit();


Alleen wordt in de code van de TS request[i] nooit naar null terug gezet, waardoor de array zal blijven groeien met objecten en waardoor het geheugen gebruikt zal blijven toenemen. De array methode wordt overigens door de meeste ajax frameworks toegepast. In het geval van de TS is de array niet nodig omdat de callback functie ook op applicatie level niveau is te benaderen.

If it isn't broken, fix it until it is..

Pagina: 1