XmlHttpRequest en javascript

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Edwin

Edwin

25/08/2006 17:32:00
Quote Anchor link
hallo,

Ik ben met een script bezig dat een php pagina oproept die met de database communiceert en een resultaat geeft zonder de hele pagina te moeten herladen.
Dit doe ik natuurlijk met een XmlHttpRequest.
Het probleem is alleen dat, wat de php pagina teruggeeft alleen uit html kan lijken te bestaan. En het javascript dat ertussen zit niet uitgevoert kan worden door de browser.

Dit is de xmlhttp-code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?
// BROWSER COMPATIBLE FUNTIE (XMLHTTP)
function GetXmlHttpObject()
{
var
objXMLHttp=null
if (window.XMLHttpRequest)
{

objXMLHttp=new XMLHttpRequest()
}

else if (window.ActiveXObject)
{

objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
}

return objXMLHttp
}

function
delete_mssg(id)
{


    // roep browser-compatible funtie aan
    xmlHttp=GetXmlHttpObject()
 
     // url van bestand dat wordt ingeladen
    var url="scripts/delete.php?mssgID="+id
    
    // wanneer de status verandert -> voer dan stateChanged() uit
    xmlHttp.onreadystatechange=stateChanged
    xmlHttp.open("GET",url,true)
    xmlHttp.send(null)
}
function
stateChanged()
{

    // wanneer het XMLHttpRequest is voltooid, ...
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
    {

        // ... wordt het resultaat van delete.php geprint
        document.getElementById("page").innerHTML=xmlHttp.responseText
    }
}

?>


Dit is een klein deel van de php pagina:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

require("mysqlConnect.php");

$id = $_GET["mssgID"];
    
if ($id == NULL)
{

    echo "<script type='text/javascript'>alert('Er is geen bericht selecteerd om te worden verwijderd.')</script>";
}

else ..........enz.......
[
/code]

Ik hoop niet dat het te veel leeswerk is, maar het probleem is hier dus dat er geen alert wordt uitgevoerd.
Het gaat om deze regel:
[
code]echo "<script type='text/javascript'>alert('Er is geen bericht selecteerd om te worden verwijderd.')</script>";[/code]

Iig alvast bedankt!

Edwin
Gewijzigd op 01/01/1970 01:00:00 door Edwin
 
PHP hulp

PHP hulp

03/05/2024 09:23:42
 
Jan Koehoorn

Jan Koehoorn

25/08/2006 17:39:00
Quote Anchor link
Ik denk dat het komt omdat je PHP al geparsed is voordat je AJAX script uitgevoerd wordt. Ik zie Jelmer, onze AJAX expert, niet online, maar die zou je hier denk ik wel verder mee kunnen helpen.
 
Jelmer -

Jelmer -

25/08/2006 18:02:00
Quote Anchor link
Tada!

Gehehe, geintje.

Nee, maar helaas is het normaal dat scripts in content die via innerHTML worden geinsert niet worden uitgevoerd. Er zijn wel workarounds voor prototype heeft er eentje in zich, maar die zijn niet ideaal.

Wat je ook kan doen is berichten, alleen veranderende informatie opsturen. Deze verwerk je dan in je stateChanged-functie. Zo zou je bijvoorbeeld met codes kunnen werken:
Quote:
200:berichten verwijderd
400:geen berichten geselecteerd
401:geen rechten om berichten te verwijderen

enzovoord. Zo hoef je geen Javascript op te sturen.

Een andere aanpak is voorafgaande een type mee te geven. Dit zou kunnen via headers, maar je kan er ook bijvoorbeeld de eerste 4 karakters voor gebruiken:
Quote:
html:dit is een bericht
eval:alert('hello world');

Met responseText.substr(0, 4) zou je dan een switch kunnen maken en de juiste actie ondernemen. Dus of innerHTML of eval() in dit geval.

En als laatste is er nog de prototype-oplossing: met een regular expression alle <script/>-tags eruit vissen en de code erin 'handmatig' uitvoeren met eval(). Dit is een verreweg van ideaal oplossing, aangezien je niet precies kan voorspellen wat er gaat gebeuren. Het is goed mogelijk dat als je bijvoorbeeld document.write() opstuurt middenin je responseText deze wordt uitgevoerd voordat de responseText in de div wordt gezet met innerHTML. Zo ook met alert() en dingen als getElementById, waarbij het heel erg essentieel is dat eerst het element met het ID bestaat voordat je het probeert aan te roepen.

Kortom: probeer zoveel mogelijk javascript in je javascript te houden en niet op te sturen. Stuur alleen variabele waarden.

En nog een aanrader: JSON. Hiermee hoef je niet te exploden of je data na te bewerken, aangezien je gewoon een object terug krijgt. Lekker makkelijk en snel.
 
Edwin

Edwin

25/08/2006 19:23:00
Quote Anchor link
Mooi uitgebreid antwoord. Hier heb ik veel aan. Bedankt!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.