Hoe sql/session inhoud laden in een DIV vanuit al reeds geladen DIV

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Dymo Masta

Dymo Masta

17/12/2011 23:25:11
Quote Anchor link
Ik ben een aantal dagen op zoek geweest voor de juiste oplossing maar die ben ik nog niet tegen gekomen.

Ik zit met de volgende situatie:

In mijn php pagina, laten we zeggen index.php is de structuur als volgt:

<head>
<script type="text/javascript" src="JS/jquery-1.6.2.js"></script>
<script type="text/javascript" src="function.js"></script>
</head>

<body>

<div>
<div><a href="" class="testcat" id="1">Show</a></div> --> middels deze link wordt er inhoud geladen in de volgende DIV (id=producten). Dit wordt gedaan met behulp van de functie dat in function.js is (zie hieronder).
<div id="producten"></div> -->Hier worden de eerste gegevens geladen zonder dat de pagina vernieuwd wordt. Tot hier gaat alles zoals ik wil. In testpage.php worden binnen while loop links aangemaakt. Wat ik nu wil is, als ik op een van de links klik moeten andere gegevens middels testpage2.php op zelfde wijze als bij vorige DIV geladen worden zonder dat de pagina vernieuwd wordt en dat de geladen gegevens in de eerste DIV getoond blijven worden. Deze gegevens moeten geladen worden in de DIV (id=information).
<div id="information"></div>
</div>

--> Ik heb van alles geprobeerd maar het lukt mij niet, de gegevens worden niet geladen.

</body>

function.js:
$(document).ready(function() {
$(".testcat").click(function() {
var testid = $(this).attr("id");
var datastring = 'id='+ testid ;
$.ajax({
type: "POST",
url: "testpage.php",
data: datastring,
cache: false,
success: function(res) {
$('#producten').html("<div class='loading'><img src='IMG/loading.gif' /></div>")
.hide()
.fadeIn(2000, function() {
$('#producten').html(res);
})
}
});
return false;
});

});

Inhoud van testpage.php en testpage2.php is PDO code waarmee gegevens uit de database worden geladen die door een WHILE loop gaan en vervolgens een tabel wordt gegenereerd en in DIV wordt geladen. Verder niets bijzonders.
 
PHP hulp

PHP hulp

15/11/2024 15:22:50
 
Erwin H

Erwin H

18/12/2011 00:21:57
Quote Anchor link
Heb je wel al je server script getest? Weet je zeker dat dat script de juiste data teruggeeft? Dit kan je testen door het script direct in de browser aan te roepen (hoewel je dan geen POST data kunt gebruiken), of, als je Mozilla gebruikt, via de add on Bugzilla. In die add on kan je precies zien welke Ajax calls er worden gemaakt, wat de parameters waren en welke data je terugkrijgt.
In andere browsers heb je vast ook wel van dat soort tooltjes, maar die ken ik niet.

Vraag is ook hoe de data die terugkomt van de server is gestructureerd. Je hebt geen "dataType" meegegeven, dus de browser moet een gok doen. Dat kan als je een duidelijke structuur hebt, maar kan fout gaan als dat niet duidelijk is.

Tot slot, je url is "testpage.php" terwijl je in je tekst zegt dat "testpage2.php" de Ajax calls beantwoordt, klopt dat?
Gewijzigd op 18/12/2011 00:30:25 door Erwin H
 
Dymo Masta

Dymo Masta

18/12/2011 08:31:37
Quote Anchor link
Zoals ik de script nu heb werkt alles. In beide gevallen, testpage.php als testpage2.php worden gegevens netjes getoond. Als je op een link klikt wordt een nieuwe pagina geladen en krijg je de gegevens te zien die ik wil.

Nu heb ik middels de functie, die in functie.js staat, de gegevens die door testpage.php worden opgehaald geladen in de DIV met id=producten zonder dat de pagina opnieuw geladen wordt. Dit gaat ook goed. testpage.php haalt data uit database en maakt middels een WHILE loop in <li></li> links aan. Tot zover werkt het zoals ik dat wil.

Nu begint mijn probleem:
Als ik op een link klik die door WHILE loop is aangemaakt wordt een nieuwe pagina geopend en krijg ik de gegevens te zien. Dus testpage2.php werkt ook goed.

Wat ik eigenlijk nu wil is om deze data op zelfde wijze te laden in DIV id=information als testpage.php in DIV id=producten zodat ook de geladen data in DIV id=producten nog steeds zichtbaar zijn. Als ik vergelijkbare functie gebruik als in function.js werkt het niet. De pagina wordt blijkbaar opnieuw geladen, wordt eventjes wit, en krijg ik index.php te zien.

Het lijkt erop dat de pagina dynamisch toegevoegde content niet ziet en zelfde functie niet meer werkt voor de volgende DIV.
 
Erwin H

Erwin H

18/12/2011 09:35:55
Quote Anchor link
Dat komt omdat je onclick functie alleen wordt gebonden aan elementen die tijdens de document load al bestaan. Dynamische elementen die later worden aangemaakt hebben die functie dus nog niet aan zich gebonden.
Je zal of de click functie dus nog dynamisch moeten binden op het moment dat die nieuwe element worden aangemaakt, of je kan de functie delegate() gebruiken om ervoor te zorgen dat ze gebonden worden. Check: http://api.jquery.com/delegate/
En zoals ik eerder deze week heb geleerd (met dank aan Wouter), in JQuery 1.7 kan je het met on() doen.
 
Dymo Masta

Dymo Masta

18/12/2011 09:57:26
Quote Anchor link
best Erwin,

dank voor de snelle reactie. Ik heb al geprobeerd met:
$(document).on("click", "a.testcat", function() {

maar ik weet niet wat ik verkeerd doe. zelf moet ik nog veel leren vandaar deze topic. moet ik voor beide DIV's een of aparte functies aanmaken?

hieronder volledig functie wat ik had geprobeerd:

$(document).on("click", "a.testcat", function() {
var href = $(this).attr("href");
var successDiv = $(this).data("producten");
$('#' + successDiv).html("<div class='loading'><img src='IMG/loading.gif' /></div>");
$.ajax({
type: "POST",
url: href,
data: datastring,
cache: false,
success: function(res) {
$('#' + successDiv).hide().html(res).fadeIn(2000);
}
}
return false;
});
 
Erwin H

Erwin H

18/12/2011 10:00:25
Quote Anchor link
Je gebruikt JQuery 1.6.2, daar bestaat on() volgens mij nog niet.
 
Dymo Masta

Dymo Masta

18/12/2011 10:10:27
Quote Anchor link
zoals ik de functie nu heb met JQuery 1.7.1 worden de gegevens in de eerste DIV netjes geladen als eerst:

$(document).on("click", function() {
var testid = $(this).attr("id");
var datastring = 'id='+ testid ;
//var href = $(this).attr("href");
var successDiv = $(this).data("producten");
$('#' + successDiv).html("<div class='loading'><img src='IMG/loading.gif' /></div>");
$.ajax({
type: "POST",
url: "testkassa.php",
data: datastring,
cache: false,
success: function(res) {
$('#' + successDiv).hide().html(res).fadeIn(2000);
}
});
return false;
});

Moet ik nu zelfde functie aanmaken voor de tweede DIV alleen met andere DIV ID en URL?
 
Erwin H

Erwin H

18/12/2011 10:30:19
Quote Anchor link
Ik ben kwijt over welke divs je het allemaal hebt. Dus het lijkt me verstandig om even je hele HTML pagina (of in elk geval met de relevante tags) te posten met alleen in de div het commentaar om welke div het gaat. Graag binnen "code" (dus die met rechte haken) tags zodat het inspringen ook behouden blijft.
Gewijzigd op 18/12/2011 10:31:08 door Erwin H
 
Dymo Masta

Dymo Masta

18/12/2011 10:45:38
Quote Anchor link
index.php

Quote:
<div>
DIV 1: <div><a href="" class="testcat" id="15">Test link</a></div>
DIV 2: <div id="producten"></div>
DIV 3: <div id="information"></div>
</div>


Als er op link in DIV 1 geklikt wordt, wordt data dynamisch geladen in DIV 2 door testpage.php. Dit gaat goed. Hiervoor wordt dus de functie gebruikt:

function.js:
Quote:
$(document).ready(function() {
$(".testcat").click(function() {
var testid = $(this).attr("id");
var datastring = 'id='+ testid ;
$.ajax({
type: "POST",
url: "testpage.php",
data: datastring,
cache: false,
success: function(res) {
$('#producten').html("<div class='loading'><img src='IMG/loading.gif' /></div>")
.hide()
.fadeIn(2000, function() {
$('#producten').html(res);
})
}
});
return false;
});
});


Nu moet er vanuit DIV 2 data geladen worden in DIV 3 met testpage2.php op zelfde wijze als in DIV 2 zodat de geladen data in DIV 2 nog steeds zichtbaar blijft.

Probleem is dat ik niet weet hoe ik dit met on() moet doen of op een andere manier.
Gewijzigd op 18/12/2011 10:47:55 door Dymo Masta
 
Erwin H

Erwin H

18/12/2011 10:53:00
Quote Anchor link
Volgende keer code graag tussen code tags svp, dat maakt het heel wat makkelijker leesbaar.

Je kan dezelfde functie gebruiken, als je precies dezelfde stappen moet nemen om je data te krijgen. Dus heeft div 2 dezelfde attributen (id en class) als div 1, moet dezelfde php pagina worden aangeroepen, moet daarin dezelfde functie worden doorlopen, is de output gelijk en moet daarna hetzelfde gebeuren met die output? Als dit niet allemaal identiek is dan kan je uiteraard niet dezelfde functie gebruiken, maar moet je een tweede functie definieren. Die kan je dan middels on() al vooraf binden zodat die wordt aangeroepen als de nieuwe div is gemaakt en er op wordt geklikt.
 
Dymo Masta

Dymo Masta

18/12/2011 11:02:02
Quote Anchor link
Eigenlijk gebeurt alles op zelfde wijze alleen andere data wordt geladen in andere DIV.

Probleem zit dus in die functie:

Als ik deze functie met on() gebruik gebeurt er niets!

Quote:
$(document).on("click", ".testcat", function() {
var testid = $(this).attr("id");
var datastring = 'id='+ testid ;
$.ajax({
type: "POST",
url: "testpage.php",
data: datastring,
cache: false,
success: function(res) {

$('#producten').html("<div class='loading'><img src='IMG/loading.gif' /></div>")
.hide()
.fadeIn(2000, function() {
$('#producten').html(res);
})
}
});
return false;
});


Als ik deze functie zonder on() gebruik:

Wordt alleen data geladen in DIV 2 en niet in DIV 3!

Quote:
$(document).ready(function() {
$(".testcat").click(function() {
var testid = $(this).attr("id");
var datastring = 'id='+ testid ;
$.ajax({
type: "POST",
url: "testkassa.php",
data: datastring,
cache: false,
success: function(res) {
$('#producten').html("<div class='loading'><img src='IMG/loading.gif' /></div>")
.hide()
.fadeIn(2000, function() {
$('#producten').html(res);
})
}
});
return false;
});
});


Dat is dus mijn vraag, hoe moet ik de functie zodanig omvormen dat ik dus data vanuit DIV 1 dynamisch laad in DIV 2 en vervolgen data dynamisch laad vanuit DIV 2 in DIV 3.
En dan ook nog dat de geladen data in DIV 2 en DIV 3 zichtbaar blijven.
Gewijzigd op 18/12/2011 11:03:24 door Dymo Masta
 
Erwin H

Erwin H

18/12/2011 11:12:45
Quote Anchor link
wat er over blijft is dan om te zien hoe die links eruit zien die in div2 terecht komen. Kan je HTML plaatsen die dynamisch in die divs terecht komt (dus uit je Ajax call)?
 
Dymo Masta

Dymo Masta

18/12/2011 11:55:24
Quote Anchor link
in mijn HTML broncode komt er niets alleen een lege <div id="producten"></div> als de data geladen wordt maar de code van testpage.php is als volgt:

require_once 'conn/config.php';

try {

$sQuery = "SELECT * FROM tabel WHERE id = '".$_POST['id']."' ";


if ($oStmt = $db->query($sQuery)) {

if ($oStmt->fetch() > 0) {
$oStmt = $db->prepare($sQuery);
$oStmt->execute();

print '<ul class="twee">';

while($aRow = $oStmt->fetch(PDO::FETCH_ASSOC)) {
$id = $aRow['id'];
$cat_id = $aRow['cat_id'];
$naam = $aRow['naam'];

print '<li><a href="testpage2.php?action=add&id='.$id.' ">'.$naam.'</a></li>';
}
print '</ul>';
}
else {
print 'Geen data';

}
}
}

catch(PDOException $e) {
$sMsg = '<p>
Regelnummer: '.$e->getLine().'<br />
Bestand: '.$e->getFile().'<br />
Foutmelding: '.$e->getMessage().'
</p>';
trigger_error($sMsg);
}
Gewijzigd op 18/12/2011 12:06:04 door Dymo Masta
 
Erwin H

Erwin H

18/12/2011 12:45:49
Quote Anchor link
Je click event wordt getriggered door links met een class "testcat"
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$(".testcat").click(function() {
});

De link die je aanmaakt in de php pagina heeft die class niet. Die link zal dus nooit dat event starten. Verder heeft die link ook geen id, dus zelfs als het event wordt getriggered dan zal het mislopen omdat er geen id kan worden uitgelezen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<a href="testpage2.php?action=add&id='.$id.' ">'.$naam.'</a>
 
Dymo Masta

Dymo Masta

18/12/2011 12:55:56
Quote Anchor link
Als je goed kijkt wordt deze event getriggerd in index.php DIV 1

Quote:
<div><a href="" class="testcat" id="15">Test link</a></div>


dan wordt data geladen in DIV 2: DIV 2: <div id="producten"></div>

dan komt dat gedeelte van mijn vorige post over PDO:

deze link moet dus nu volgende event aanspreken om data vervolgens in DIV 3 te laden:

Quote:
print '<li><a href="testpage2.php?action=add&id='.$id.' ">'.$naam.'</a></li>';


ik had het eerder zo:

Quote:
print '<li><a href="" id='.$id.' class="lijst">'.$naam.'</a></li>';


zelfde functie allen andere DIV en event:

Quote:
$(".lijst").click(function() {


maar dat werkt niet
 
Erwin H

Erwin H

18/12/2011 14:13:24
Quote Anchor link
Nee, dat werkt dus niet omdat click niet automatisch gebonden wordt bij dynamische elementen, dat hadden we 10 posts geleden al bedacht. Hier moet je dus on() gebruiken....

Wel goed lezen, begrijpen en secuur werken, anders gaat het je nooit lukken.
 
Dymo Masta

Dymo Masta

18/12/2011 14:21:22
Quote Anchor link
dat het ik ook gedaan, maar het werkt niet. kijk 3 posts terug.die conclusie had ik ook getrokken na jou 2de post.
wat doe ik dan verkeerd?

ik heb dit gedaan:

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
<div>
DIV 1: <div><a href="" class="testcat" id="15">Test link</a></div>
DIV 2: <div id="producten"></div>
DIV 3: <div id="information"></div>
</div>[/quote]

function.js
[quote]$(document).on("click", ".testcat", function() {
var testid = $(this).attr("id");
var datastring = 'id='+ testid ;
$.ajax({
type: "POST",
url: "testpage.php",
data: datastring,
cache: false,
success: function(res) {

$('#producten').html("<div class='loading'><img src='IMG/loading.gif' /></div>")
.hide()
.fadeIn(2000, function() {
$('#producten').html(res);
})
}
});
return false;
});


gebeurt niets in:

Quote:
DIV 2: <div id="producten"></div>
Gewijzigd op 18/12/2011 15:19:12 door Dymo Masta
 
Erwin H

Erwin H

18/12/2011 14:29:36
Quote Anchor link
Maar je hebt helemaal geen functie die op die link werkt! Het spijt me zeer, maar ik zie echt geen lijn meer in wat je doet.
 
Dymo Masta

Dymo Masta

18/12/2011 14:34:10
Quote Anchor link
ik heb mijn laatste post aangepast met wat ik heb gedaan, wat doe ik dan verkeerd dat de data in DIV 2 niet wordt geladen?
 
Erwin H

Erwin H

18/12/2011 14:46:30
Quote Anchor link
Code in CODE tags svp, niet in QUOTE tags, zo krijg je nog steeds geen juiste inspringing en regelnummers.

Na het klikken op div1 krijg je dus links die er zo uitzien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<a href="testpage2.php?action=add&id='.$id.' ">'.$naam.'</a>

of wat je blijkbaar eerder had:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<a href="" id='.$id.' class="lijst">'.$naam.'</a>


Maar je hebt maar een functie gedefinieerd die een Ajax call uitvoert:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$(document).on("click", ".testcat", function() {
});

Deze functie gaat natuurlijk nooit werken met een van de bovenstaande twee links want beide links bevatten NIET de class waarop die functie getriggerd wordt.

Dus OF je geeft dezelfde class mee aan die nieuwe links, OF je maakt een nieuwe functie die wel werkt op die link. Bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$(document).on("click", ".lijst", function() {
});
 
Dymo Masta

Dymo Masta

18/12/2011 15:41:47
Quote Anchor link
Ik ga nog een poging wagen om het je te verduidelijken:

Ik heb volgende bestanden:
-index.php
-function.js
-testpage.php
-testpage2.php

index.php ziet er als volgt uit en heeft een link met CLASS="testcat":

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<div>
DIV 1: <div><a href="" class="testcat" id="15">Test link</a></div>
DIV 2: <div id="producten"></div>
DIV 3: <div id="information"></div>
</div>


klik je op bovenste link dan gaat het naar functions.js, die als volgt uitziet:
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
$(document).ready(function() {
$(".testcat").click(function() {
var testid = $(this).attr("id");
var datastring = 'id='+ testid ;
$.ajax({
type: "POST",
url: "testkassa.php",
data: datastring,
cache: false,
success: function(res) {
$('#producten').html("<div class='loading'><img src='IMG/loading.gif' /></div>")
.hide()
.fadeIn(2000, function() {
$('#producten').html(res);
})
}
});
return false;
});    
});


deze haalt vervolgens gegevens met testpage.php uit database en laadt deze in DIV 2, zie index.php. testpage.php ziet er als volgt uit:
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
require_once 'conn/config.php';

try {

$sQuery = "SELECT * FROM tabel WHERE id = '".$_POST['id']."' ";


if ($oStmt = $db->query($sQuery)) {

if ($oStmt->fetch() > 0) {
$oStmt = $db->prepare($sQuery);
$oStmt->execute();

print '<ul class="twee">';

while($aRow = $oStmt->fetch(PDO::FETCH_ASSOC)) {
$id = $aRow['id'];
$cat_id = $aRow['cat_id'];
$naam = $aRow['naam'];

print '<li><a href="" class="lijst" id='.$id.'>'.$naam.'</a></li>';
}
print '</ul>';
}
else {
print 'Geen data';

}
}
}

catch(PDOException $e) {
$sMsg = '<p>
Regelnummer: '.$e->getLine().'<br />
Bestand: '.$e->getFile().'<br />
Foutmelding: '.$e->getMessage().'
</p>';
trigger_error($sMsg);
}


Dit werkt dus goed. Ik heb nu dus: index.php, functions.js en testpage.php. Ik hoop dat het tot hier duidelijk is.

Middels testpage.php worden deze links aangemaakt met CLASS="lijst":

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<li><a href="" class="lijst" id='.$id.'>'.$naam.'</a></li>


Hier begint mijn vraag. Als ik op bovenstaande link klik moet middels testpage2.php (deze is vergelijkbaar als testpage.php) gegevens uit database gelezen worden en in DIV 3 (zie index.php) getoond worden. Om dit werkend te krijgen had ik dus volgende functie aangemaakt in functions.js.

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
$(document).ready(function() {
$(".lijst").click(function() {
var testid = $(this).attr("id");
var datastring = 'id='+ testid ;
$.ajax({
type: "POST",
url: "testkassa2.php",
data: datastring,
cache: false,
success: function(res) {
$('#information').html("<div class='loading'><img src='IMG/loading.gif' /></div>")
.hide()
.fadeIn(2000, function() {
$('#information').html(res);
})
}
});
return false;
});    
});


Nu heb je dus 2 functies in function.js alleen click event en de ID zijn anders. Bovenstaande functie geeft geen resultaat omdat in DIV 2 gegevens dynamisch geladen worden. Nu heb je dus index.php, function.js, testpage.php en testpage2.php.

Jou oplossing was on() function, heb ik ook geprobeerd alleen ik weet niet wat ik verkeerd doe. Als ik on() function toepas om mijn eerste functie binnen function.js dan worden er ook geen gegevens in DIV 2 geladen.

En mijn vraag is, wat doe ik verkeerd?
 

Pagina: 1 2 volgende »



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.