Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

javascript asynchroon?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een script met een thickbox, alleen ik krijg hem niet werkend. Ik heb het idee dat het eraan ligt dat js asynchroon werkt, eerst opdrachten doet die verder in de lijst staan en daarna verder gaat.
Ik heb bijvoorbeeld deze code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function reqdat() {
var times;
var done;
var password;
done = 1;
times = 0;
tb_show("Status:",'empty.php?height=150&width=300','');
setTimeout("regdat2()",500);
}
function regdat2(){
document.getElementById('TB_ajaxContent').innerHTML = '<div align="center"><br /><br /><font size="5"><b id="message">Checking data!</b><br /><br /><input type="button" value="Close" /><br /><br /></font></div>'
if(!document.login.username.value){document.getElementById('message').innerHTML = 'Please enter your username!';}
else{
if(!document.login.password.value){document.getElementById('message').innerHTML = 'Please enter your password!';}
else{
document.getElementById('response').innerHTML = '<iframe id=response2 width=500 border=10 height=500 name=response2 src="communicate.php?username='+document.login.username.value+'&subject=login1" ></iframe>';
document.getElementById('message').innerHTML = 'Connecting!';}}}

vul ik geen password in of geen username, werkt alles perfect. Zoals je ziet heb ik al een tijd trigger toe gepast omdat hij anders de thickbox niet laad, als iemand daar een oplossing voor heeft zou dat perfect zijn. Heb al do{}while(!getElementById('TB_ajaxContent')); gebruikt, dit blijkt niet te werken alleen als ik nog geen tb_show heeft gedaan valt hij in de lus anders gaat hij gewoon door.

Maar als ik alles goed invul, dus password en username. Dan laad hij de thickbox heel langzaam en is hij onder het laden zichtbaar bezig met het maken van de andere iframe. Ook komt er alleen connecting voor, hij kan de commando's voor dat de iframe getekend wordt ook niet uitvoeren. (als ik connecting ervoor zet komt er helemaal niks te staan.

Hoe is dit op te lossen want kom er echt niet meer uit. Code normaal in php, en vind javascript dan ook een irritante taal om in te coderen (misschien omdat php meer toestaat en betere fouten weergeeft)

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Als je ajax wilt gebruiken, raad ik je aan eens te googlen op XAJAX. Dat is een GPL-script, wat een brug slaat tussen Javascript en PHP. Werkt perfect!

  • f.v.b
  • Registratie: Januari 2008
  • Laatst online: 17-11 09:06
Javascript zelf werkt niet asynchroon. Pas als je Ajax gaat gebruiken wordt javascript (per definitie) asynchroon. Als je javascript nog niet beheerst en je begint direct met het gebruiken van Ajax technieken, dan krijg je te maken met een flink steile leercurve.

Waar het volgens mij fout gaat is doordat je het password niet doorgeeft als parameter van het iframe. Je geeft er alleen de usercode mee:

JavaScript:
1
src="communicate.php?username='+document.login.username.value+'&subject=login1"


Verder nog wat tips:

Je maakt het voor ons extra moeilijk om je te helpen. De javascript code is op deze manier niet leesbaar. Zorg voor goede indentering. Verder beschrijf je in je verhaal niet alleen het probleem met deze voorbeeld code, maar ook met andere versies die je hebt geprobeerd.

Je declareert in reqdat() drie variabelen die je vervolgens nergens gebruikt. In regdat2() zet je een if binnen een else clausule. Je had daar beter

JavaScript:
1
else if (!document.login.password.value)


kunnen gebruiken.

Hieronder de html die ik heb gebruikt om te kijken of er misschien javascript errors inzaten.

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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script language="javascript" type="text/javascript">
<!--

function reqdat()
{
    var times;
    var done;
    var password;
    done = 1;
    times = 0;
    tb_show("Status:",'empty.php?height=150&width=300','');
    setTimeout("regdat2()",500);
}

function regdat2()
{
    document.getElementById('TB_ajaxContent').innerHTML = '<div align="center"><br /><br /><font size="5"><b id="message">Checking data!</b><br /><br /><input type="button" value="Close" /><br /><br /></font></div>'

    if (!document.login.username.value)
    {
        document.getElementById('message').innerHTML = 'Please enter your username!';
    }
    else
    {
        if (!document.login.password.value)
        {
            document.getElementById('message').innerHTML = 'Please enter your password!';
        }
        else
        {
            document.getElementById('response').innerHTML = '<iframe id=response2 width=500 border=10 height=500 name=response2 src="communicate.php?username='+document.login.username.value+'&subject=login1" ></iframe>';
            document.getElementById('message').innerHTML = 'Connecting!';
        }
    }
}
// -->
</script>
</head>
<body>
    <div id="TB_ajaxContent"></div>
    <div id="message"></div>
    <div id="response"></div>
    <form name="login">
        <input type="text" name="username" value="">
        <input type="text" name="password" value="">
        <input type="button" value="Login" onclick="regdat2();">
    </form>
</body>
</html>

Don't erase all files?
       [Yes]   [No]


Verwijderd

Topicstarter
nee, de username code moet alleen verzonden worden en het password later, ik ga denk ik proberen om XAJAX te gebruiken, misschien gaat dat een stuk beter. die vars kwamen van eerder werk omdat het eerst niet werkte, die moet ik nogweghalen.

Ik gebruikte jquery + thickbox (das zo'n popup als ze bij tweakers met plaatjes hebben). Waarschijnlijk gaat het daar ergens asynchroon over, dus ik ga wel proberen om de thickbox code aan te passen zodat hij de code weer geeft.

Dat was ook de reden dat ik niet de complete code kon weergeven om dat thickbox deze aanmaakt.

  • RM-rf
  • Registratie: September 2000
  • Nu online

RM-rf

1 2 3 4 5 7 6 8 9

in je code gebruik je de setTimeout()-functie....
code:
1
2
tb_show("Status:",'empty.php?height=150&width=300','');
setTimeout("regdat2()",500);


Dat betekent dat je javascript de opdracht geeft hier 500 milliseconden te wachten (een halve seconde) voordat je de functie "regdat2()" uitvoert ....

oftewel, javascript wacht niet op de response van het Ajax-object dat je in 'tb_show()' aangeroepen hebt maar wacht enkel domweg een halve seconden en voert dan de tweede functie uit, los ervan of je ajax-request nu al geladen is of niet ....

Ik zou je enkel aanraden gewoon eens een goede AJAX-tutorial te volgen en goed na te denken wat de code daarin precies doet ... bij mijn weten is het 'wachten op de teruggave van de gerequestte data juist in iedere tutorial hoofdbestanddeel (en natuurlijk ook essentieel aan AJAX-toepassing)..
Als je dat tot nu toe gemist hebt, is dat een teken dat je té snel wilt gaan en zonder het te begrijpen te snel losse codebrokken slecht toepast....

neem gewoon wat meer de tijd om te leren.

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


Verwijderd

Topicstarter
Ow, ja, ik heb em al geupdate en dat was gewoon een schatting om hem werkende te krijgen. Blijkbaar werkt mijn nieuwe php code wel goed:
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
<? require_once("classes.php");
switch ($_GET['script']){
case 1:
print <<<END
function loop1(){
if($("#TB_window").css("display") != "block"){setTimeout("loop1()",50);}
else{setTimeout("regdat2()",300);}
}
function reqdat() {
tb_show("Status:",'empty.php?height=150&width=300','');
loop1();
}
function regdat2(){
document.getElementById('TB_ajaxContent').innerHTML = '<div align="center"><br /><br /><font size="5"><b id="message">Checking data!</b><br /><br /><input type="button" id="TB_closeWindowButton" value="Close" /><br /><br /></font></div>'
$("#TB_closeWindowButton").click(tb_remove);
if(!document.login.username.value){document.getElementById('message').innerHTML = 'Please enter your username!';
}
else if(!document.login.password.value){document.getElementById('message').innerHTML = 'Please enter your password!';}
else{
document.getElementById('message').innerHTML = 'Connecting!';
document.getElementById('response').innerHTML = '<iframe id=response2 width=0 frameborder=0 height=0 name=response2></iframe>';
frames[0].document.write("<html><body><form method='POST' id=form name=form action=
END;
print data::surl;
print <<<END
communicate.php?subject=login><input type=text name=username id=username value="+document.login.username.value+"></input><input type=text name=password id=password value="+document.login.password.value+"></input></form></body></html>");
frames[0].document.form.submit();
}}
END;
break;
}

  • f.v.b
  • Registratie: Januari 2008
  • Laatst online: 17-11 09:06
Au, au, dit doet pijn aan mijn ogen. :'(

Maar als ik het dus goed begrijp heb je een formulier in je pagina. Zodra daarin usercode en password zijn ingevuld, maak je een iframe aan. In dat iframe maak je weer een formulier aan, wat je vult met usercode en password, en vervolgens submit je dat laatste formulier.

Wat kan het tweede formulier wat het eerste formulier niet kan?

... bzzz ...

Aha. Ik snap 'm. Je wilt inloggen zonder weg te navigeren van de huidige pagina.

[ Voor 11% gewijzigd door f.v.b op 02-02-2008 03:24 ]

Don't erase all files?
       [Yes]   [No]

Pagina: 1