[JS+PHP/SQL] Zelfde functie met andere variabelen?

Status
Niet open voor verdere reacties.

Reforced

Gebruiker
Lid geworden
31 okt 2008
Berichten
29
Hallo,

Ben sinds kort me een beetje aan het verdiepen in Javascript en heb mijn eerste scriptjes in elkaar geprutst. Nu wou ik vragen of dit zo een net script is of dat het ook anders kan.

Onderstaand script wordt toegepast op een pagina met 10 verschillende items, welke elk bij het aanklikken het zelfde moeten doen; maar met de voor de verschillende items andere variabelen. Hoe dit aan te geven?

Het script wat ik nu heb:

PHP:
<head>
<script type="text/javascript">
<?php include 'connect.php';
   $qry = "SELECT * FROM tablename ORDER BY time DESC LIMIT 0, 10";
		$db->execute_sql($qry,$result,$error_msg);
		if($error_msg <> "")
		{
			echo $error_msg;
		}
		else
		{
			while($row = mysql_fetch_object($result))
			{
?>
//
// HIER DE SHOW FUNCTIE VOOR EEN ITEM
//

function show<?php echo $row->id ?>()
{
a=document.getElementById('item<?php echo $row->id ?>').getElementsByTagName('iframe')[0];
a.setAttribute('src', '<?php echo $row->link ?>');
a.setAttribute('width', '100%');
a.setAttribute('height', '960');
x=document.getElementById('item<?php echo $row->id ?>');
g=document.createElement('a');
g.setAttribute('href', '#<?php echo $row->naam ?>');
g.setAttribute('id', '<?php echo $row->id ?>');
g.onclick = hide<?php echo $row->id ?>;
g.appendChild(document.createTextNode('Verberg item'));
x.appendChild(g,x.lastChild);
b=document.getElementById('<?php echo $row->id ?>').getElementsByTagName('a')[0].firstChild;
b.nodeValue = 'Verberg item';
c=document.getElementById('<?php echo $row->id ?>').getElementsByTagName('a')[0];
c.onclick = hide<?php echo $row->id ?>;
}

//
// HIER DE HIDE FUNCTIE VOOR EEN ITEM -->
//
function hide<?php echo $row->id ?>()
{
d=document.getElementById('item<?php echo $row->id ?>').getElementsByTagName('iframe')[0];
d.setAttribute('src', '');
d.setAttribute('width', '0');
d.setAttribute('height', '0');
e=document.getElementById('<?php echo $row->id ?>').getElementsByTagName('a')[0].firstChild;
e.nodeValue = 'Toon item';
f=document.getElementById('<?php echo $row->id ?>').getElementsByTagName('a')[0];
f.onclick = show<?php echo $row->id ?>;
u=document.getElementById('item<?php echo $row->id ?>').getElementsByTagName('a')[0].firstChild;
u.parentNode.removeChild(u);
}

<?php }
} ?>
</script>
</head>

<body>
<table>
<?php
    $qry = "SELECT * FROM tablename ORDER BY time DESC LIMIT 0, 10";

		$db->execute_sql($qry,$result,$error_msg);
		if($error_msg <> "")
		{
			echo $error_msg;
		}
		else
		{
			while($row = mysql_fetch_object($result))
			{
			?>
<tr>
   <td class="inhoud">
<h1 id="<?php echo $row->naam ?>">ITEMNAAM</h1>
		<p style="text-align: justify">ITEMTEKST</p>
	<p id="<?php echo $row->id ?>"><a href="#<?php echo $row->naam ?>" onclick="show<?php echo $row->id ?>()">Bekijk item</a></p>
	</td>
	<td class="plaatje">
	<img src="<?php echo $row->picture ?>" alt="Foto van <?php echo $row->naam ?>">
	</td>
</tr>
<tr>
<td colspan="100%" id="item<?php echo $row->id ?>">
<iframe id='itemiframe' name='itemiframe' src='' scrolling='no' marginwidth='0' marginheight='0' frameborder='0' vspace='0' hspace='0' width='0' height='0'></iframe>
</td>
</tr>
<?php
}
}
?>
</table>
</body>
</html>

Wat er nu dus gebeurd is dat PHP 20 javascript functies in de head neer zet, met verschillende functienamen. In de itemlijst in de body word dit ook per item neergezet (welke functie bij welk item hoort; en dus met de goede gegevens voor het betreffende item).

Is er een kortere manier om dit te doen? Wat er ook gebeurd is dat na 1x de functie te hebben gebruikt, de hide functie niet meer werkt.. (onderaan blijft de sluit regel staan); de 1e keer werkt het goed, maar na dus nog een 2e keer een item te openen en sluiten blijft deze regel staan. Weet iemand ook hoe dit kan?

Alvast heel erg bedankt voor jullie reactie's.
 
Laatst bewerkt:
Overigens bij de 2e keer hide zegt firefox:
"u = null"

(dat is dus regel: u.parentNode.removeChild(u); die de eerste keer wel werkt)
 
Dit is toch wel een merkwaardige manier van werken hoor :shocked:;)
Voor elke record in je tabel ga je een nieuwe functie maken of eigenlijk zelfs 2.

Als je dus bvb 100 records heb, dan krijg je uiteindelijk
function show1()
function show2()
function show3()
...
function show99()
function show100()
en hetzelfde voor hide!

Dat is niet echt de juiste manier van werken. Je hoort 1 functie te maken die via de argumenten gaat bepalen waarmee ze moet werken.
bvb:
PHP:
function VeranderWeergave(wat,actie) {
  o=document.getElementById(wat).style;
  if(actie==1){
    ....
  }else{
    ....
  }
  .....
}
Die functie kan dan als volgt aangeroepen worden.
PHP:
<div id='x<?php echo $row->id ?>' onclick='VeranderWeergave("x<?php echo $row->id ?>",1);'

Als je er in jou concrete situatie niet uitkomt, wil ik gerust helpen om het uit te werken
 
Dit klopt, nu zit ik dus ook met 10 show en 10 hide functies; het werkt maar komt de grootte van de pagina niet ten goede..

Hoe kan ik in de functie dan de variabelen verwerken, zoals nu?
Ik geef nu dus zoals in het voorbeeld van jou bij een onclick de actie VeranderWeergave("x1") door bijvoorbeeld; vervolgens roept hij het script aan als:

function VeranderWeergave(x,1) {
o=document.getElementById(1).style;
if(actie==1){
....
}else{
....
}
.....

Verder kom ik niet, want waar moet ik nu al mijn 10 variabelen kwijt voor functie 1 en 10 voor functie 2 ? (ben nog maar net begonnen met javascript dus de kennis schiet me ook tekort).

Alvast bedankt voor je reactie wederom!!
 
Bekijk onderstaand voorbeeld eens, en probeer er mee te begrijpen hoe parameters aan een functie door gegeven worden.

Ik zal ondertussen eens kijken of iets met jou concreet scriptje kan doen ;)

PHP:
<html>
  <head>
    <script type="text/javascript">
      function DoeHetVoorbeeld(waarde1, waarde2){
        alert("De eerste waarde is '" + waarde1 + "' en de tweede waarde is '" + waarde2 + "'.")
      }
    </script>
  </head>
  <body>
    <input type="button" value="Voorbeeld met cijfers" onclick="DoeHetVoorbeeld(14, 75);"><br>
    <input type="button" value="Voorbeeld met letters" onclick="DoeHetVoorbeeld('woord', 'tekst');"><br>
    <input type="button" value="Gemengd voorbeeld" onclick="DoeHetVoorbeeld('123', 'abc');"><br>
  </body>
</html>
 
Aaah ik snap het!

Als ik nu dus bij een onclick maak met bijvoorbeeld show('http://www.delink.nl', '18'), dan roept hij de functie aan met de variabelen die ik doorgeef; dus als ik dan heb function show(link, id) dan kan ik in de rest van het script gewoon link en id neerzetten..

Ik ga het maandag proberen, bedankt!! (zit nu op een laptop in een zomerhuisje, dat werkt niet echt lekker ;-P)

Weet je trouwens ook waarom hij na 1 keer show en hide, de tekst niet meer weghaald als ik daarna weer op hide druk?
 
Zo, het is gelukt, aan de hand van je voorbeeld!
De code die ik nu heb is:

PHP:
<script type="text/javascript">
<!-- Begin Hide / Show functie -

function show(id, link)
{
// Toon iFrame
tonen = document.getElementById('idnaam' + id).getElementsByTagName('iframe')[0];
tonen.setAttribute('src', link);
tonen.setAttribute('width', '100%');
tonen.setAttribute('height', '960');

// Voeg sluit link toe onderaan iFrame
link = document.getElementById('idnaam' + id);
newlink = document.createElement('a');
newlink.setAttribute('href', '#');
newlink.setAttribute('id', id);
newlink.onclick = function() {hide(id, link)};
newlink.appendChild(document.createTextNode('<-- Verberg'));
link.appendChild(newlink, link.lastChild);

// Verander toon naar verberg
change=document.getElementById(id).getElementsByTagName('a')[0].firstChild;
change.nodeValue = ('<-- Verberg');
change2=document.getElementById(id).getElementsByTagName('a')[0];
change2.onclick = function() {hide(id, link)};
}

function hide(id, link)
{
// Verberg iFrame
verberg = document.getElementById('idnaam' + id).getElementsByTagName('iframe')[0];
verberg.setAttribute('src', '');
verberg.setAttribute('width', '0');
verberg.setAttribute('height', '0');

// Verwijder links
changelink = document.getElementById(id).getElementsByTagName('a')[0].firstChild;
changelink.parentNode.removeChild(changelink);
hidelink = document.getElementById('idnaam' + id).getElementsByTagName('a')[0].firstChild;
hidelink.parentNode.removeChild(hidelink);
}

// - Einde Show / Hide functie -->
</script>

Het werkt allemaal! De 2e keer show en hide heb ik maar laten vervallen, moeten mensen de site maar reloaden ;-)

Nog commentaar op dit script? ik roep hem aan via:

PHP:
onclick="show('<?php echo $row->id ?>', '<?php echo $row->link ?>')"

In elk geval nog bedankt!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan