php variabele in js
Quote:
<body onload="initAll()">
($value wordt aangemaakt in een php-script in de head-sectie)
En hier het js-deel waar het om gaat:
Quote:
function initAll(theValue) {
var valToVar = theValue;
showBlock1(valToVar);
document.getElementById("object2").onclick = showBlock2;
document.getElementById("object1").onclick = showBlock1(valToVar);
}
function showBlock1(valForB1) {
document.getElementById("testObject").innerHTML = valForB1;
}
var valToVar = theValue;
showBlock1(valToVar);
document.getElementById("object2").onclick = showBlock2;
document.getElementById("object1").onclick = showBlock1(valToVar);
}
function showBlock1(valForB1) {
document.getElementById("testObject").innerHTML = valForB1;
}
De php-variabele wil ik via body onload laden omdat ik hem in meerdere js-functies wil gebruiken. Ik zet dus deze parameter(theValue) in een variabele die ik weer als parameter in een andere functie stop. De functie(showBlock1) wil ik zowel onload oproepen als bij het klikken op de link "object1".
In Firefox(4.0.1) werkt het en in IE8 ook, maar ik gebruik daarnaast ook het programma IETester om de webpagina in verschillende IE's te testen. Daar krijg ik in alle geteste IE's(6, 7 en gek genoeg ook 8) een javascript error met de fout: "Niet geimplementeerd", verwijzend naar de regel met object1.onclick. Verwijder ik die regel dan krijg ik geen error. Dus in de functie initAll() accepteert hij deze regel wel:
Quote:
showBlock1(valToVar);
En dus ook de functie showBlock2, zonder parameter, werkt. Op één of andere manier accepteren de browsers in IETester de ingevoerde parameter niet in combinatie met een onclick. Iemand enig idee of- en wat ik hier fout doe?
Verder heb ik in mijn (php)script nog een soortgelijke onclick-functie:
Quote:
<a onclick=\"thisToMainItem($id)...
Dit werkt wel in alle eerder genoemde browsers zonder fouten, ik kom er maar niet uit waarom ik de errors krijg in IETester. Iemand die mij verder kan helpen?
Gewijzigd op 29/04/2011 19:00:12 door Script Dude
document.getElementById("object1").onclick = showBlock1(valToVar);
wijst niet de functie showBlock1 toe aan het onclick event, maar het resultaat van showBlock1(valToVar). Maw: de functie wordt meteen uitgevoerd, terwijl jij 'm alleen wilt toewijzen aan het onclick event. Wat je kunt doen is de aanroep wrappen in een anonymous function:
document.getElementById("object1").onclick = function() { showBlock1(valToVar); };
Gewijzigd op 29/04/2011 19:29:30 door Daniel O
@ Daniel: Bedankt! Dat is inderdaad de oplossing. Ik vindt de javascript-logica in deze wat vreemd maar ben al lang blij dat het nu goed werkt, nogmaals bedankt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
// Als de browser AddEventListener accepteerd
if( document.addEventListener ) {
// Pak een element en maak daar een click event op
document.body.addEventListener('click', geKlikt, false);
} // Als de browser attachEvent accepteerd
else if( document.attachEvent ) {
// Pak een element en maak daar een click event op
document.body.attachEvent('onclick', geKlikt);
}
// We hebben nu de functie geKlikt aangesproken dus moeten we die maken
function() {
document.write('iets');
}
if( document.addEventListener ) {
// Pak een element en maak daar een click event op
document.body.addEventListener('click', geKlikt, false);
} // Als de browser attachEvent accepteerd
else if( document.attachEvent ) {
// Pak een element en maak daar een click event op
document.body.attachEvent('onclick', geKlikt);
}
// We hebben nu de functie geKlikt aangesproken dus moeten we die maken
function() {
document.write('iets');
}
@Wouter om het helemaal naar 2011 te brengen pak je gewoon jQuery en dan
$(element).bind('click', clickHandler);
Dan heb je ook de if/else constructie niet nodig... Ben er overigens helemaal voor dat men eerst javascript leert alvorens jQuery te gebruiken :) dat zul jij ook met me eens zijn.
Daniel O op 30/04/2011 13:54:23:
om het helemaal naar 2011 te brengen pak je gewoon jQuery en dan
$(element).bind('click', clickHandler);
$(element).bind('click', clickHandler);
Ik vind niet dat je de hele tijd naar jQuery moet grijpen. Het kost laad tijd en is in 75% van de gevallen bij beginners totaal niet nodig om jQ te gebruiken. Daarnaast zou ik als ik jQuery gebruikte gewoon gebruik maken van .click()
Daniel O:
Dan heb je ook de if/else constructie niet nodig... Ben er overigens helemaal voor dat men eerst javascript leert alvorens jQuery te gebruiken :) dat zul jij ook met me eens zijn.
Die if else constructie zit dan in de source code van jQuery, maar de rest ben ik het inderdaad helemaal mee eens.
Het gebruik van de bind() heeft mijn persoonlijke voorkeur, omdat je daar alle soorten events mee kunt attachen (ook custom events), en jQuery onderwater altijd de bind() aanroept.