JavaScript voor Joomla
Open een willekeurige Joomla-pagina en kijk eens achter de schermen: de menu’s die uitklappen, de mediabeheerder waarmee je bestanden kunt uploaden zonder dat de pagina opnieuw hoeft te laden, de editor waarmee je je tekst opmaakt, de tabbladen waarmee je tussen panelen kunt schakelen. Dat is allemaal geen PHP. Het is JavaScript, de taal die in de browser van de bezoeker wordt uitgevoerd. Joomla is op de server in PHP geschreven, maar bijna alles wat op het scherm beweegt, reageert of wordt bijgewerkt, is JavaScript aan de clientzijde.
In dit artikel wordt JavaScript uit het perspectief van Joomla uitgelegd. Het behandelt de basisbeginselen voor website-eigenaren, de manier waarop Joomla scripts laadt en beheert voor beheerders, en de ontwikkelaarstools (de Web Asset Manager, ES-modules, webcomponenten en het doorgeven van gegevens van PHP naar de browser) voor degenen die extensies en sjablonen bouwen.
PHP bouwt de pagina op de server; JavaScript brengt deze tot leven in de browser.
Het doel is simpel: je helpen begrijpen hoe Joomla JavaScript gebruikt, zodat je jouw eigen JavaScript kunt toevoegen, je website snel kunt houden en de veiligheid kunt waarborgen.
1. De basis
1.1 Wat is JavaScript?
JavaScript is een programmeertaal die draait in de webbrowser, op de eigen computer of telefoon van de bezoeker. Dit is het belangrijkste verschil met PHP: PHP draait op de server en bouwt de HTML, terwijl JavaScript draait nadat die HTML is aangekomen, aan de clientkant. De twee draaien nooit op dezelfde plek op hetzelfde moment.
Wanneer iemand een Joomla-pagina opent, stuurt de server kant-en-klare HTML, CSS en een set JavaScript-bestanden. De browser tekent de pagina en draait daarna de JavaScript. Vanaf dat moment kan JavaScript de pagina aanpassen zonder de server opnieuw iets te vragen: het kan elementen tonen en verbergen, een formulier valideren, of op de achtergrond een klein stukje nieuwe data ophalen.
1.2 Serverkant versus clientkant
Het helpt om de twee helften van een Joomla-verzoek goed uit elkaar te houden:
| Vraag | PHP (serverkant) | JavaScript (clientkant) |
|---|---|---|
| Waar draait het? | Op de webserver. | In de browser van de bezoeker. |
| Wanneer draait het? | Voordat de pagina wordt verstuurd. | Nadat de pagina is aangekomen. |
| Kan het bij de database? | Ja, direct. | Nee, alleen door de server aan te roepen. |
| Kan de bezoeker het lezen? | Nee, alleen de uitvoer. | Ja, het wordt als platte tekst geleverd. |
| Goed voor | Pagina's bouwen, beveiliging, data. | Interactiviteit, directe terugkoppeling. |
Die laatste regel is belangrijk voor beveiliging: iedereen kan de JavaScript die je verstuurt lezen en aanpassen. Een controle in JavaScript is dus een gemak voor de gebruiker, nooit een echte verdediging. De server moet alles opnieuw controleren.
1.3 Waar Joomla JavaScript gebruikt
Je hoeft geen regel JavaScript te schrijven om er profijt van te hebben. Joomla 6 gebruikt het al door de hele interface heen:
- Het beheermenu, de tabbladen en de modale dialoogvensters.
- De mediabeheerder, die uploadt en voorbeelden toont zonder paginaherlading.
- De editor (TinyMCE of CodeMirror), die een grote JavaScript-toepassing is.
- Formuliervelden zoals de tagkiezer, de kalender en kleurkiezers.
- Begeleide rondleidingen, de voortgangsbalk van Joomla Update en het Systeemdashboard.
Dit alles komt met Joomla mee en wordt door het project onderhouden. Jouw taak, als je je eigen JavaScript toevoegt, is om in te haken op datzelfde systeem in plaats van ertegen te vechten.
Naar boven2. Een korte geschiedenis: geen jQuery meer standaard
2.1 Van MooTools naar vanilla JavaScript
Oudere Joomla-versies leunden op JavaScript-bibliotheken. Joomla 1.5 tot 3 leverden MooTools, en Joomla 3 voegde jQuery en Bootstrap 2 toe. Elke pagina laadde een grote bibliotheek, of die nu nodig was of niet.
Joomla 4 brak daarmee. De Joomla core werd herschreven om gewone, moderne JavaScript te gebruiken (vaak "vanilla JS" genoemd) en de eigen standaarden van de browser, zodat de meeste pagina's helemaal geen jQuery meer laden. Joomla 6 zet dit voort: de kern levert schone, framework-vrije JavaScript en laadt alleen een zware bibliotheek wanneer een extensie daar echt om vraagt.
2.2 jQuery is nog beschikbaar, maar optioneel
jQuery is niet verdwenen; het werd een asset die je zelf kiest. Je ziet het terug in de meegeleverde bibliotheken:
media/vendor/jquery/
media/vendor/jquery-migrate/
media/vendor/bootstrap/
Als een oude extensie nog jQuery nodig heeft, kan Joomla het op verzoek laden via de Web Asset Manager (sectie 4). Maar voor nieuwe code is het advies helder: gebruik gewone JavaScript. De browser doet tegenwoordig bijna alles wat jQuery ooit deed, zonder extra download.
2.3 Waarom dit voor jou uitmaakt
Het praktische resultaat is snelheid. Een pagina die geen jQuery, MooTools en drie plugins laadt die elk hun eigen kopie meenemen, is kleiner en sneller. Wanneer je een extensie toevoegt, is het de moeite waard om te weten of die zijn eigen JavaScript-bibliotheek laadt, want meerdere extensies die elk jQuery laden is een veelvoorkomende, verborgen oorzaak van een trage site.
2.4 Scripts migreren vanaf Joomla 3
Als je een oude extensie onderhoudt, is de overstap naar Joomla 6 vooral een kwestie van gewoontes verruilen. Het patroon is voor elk hetzelfde: laat de oude framework-aanroep vallen en gebruik het moderne alternatief.
| Joomla 3-manier | Joomla 6-manier |
|---|---|
JHtml::_('jquery.framework') |
Gewone JavaScript, of useScript('jquery') alleen als het echt nodig is. |
$doc->addScript('path/to/file.js') |
Een benoemde asset die je laadt met useScript (sectie 4). |
Inline <script> in een layout |
addScriptOptions voor data, een extern bestand voor code. |
| jQuery-selectors en -effecten | document.querySelector en de eigen methoden van de browser. |
Je hoeft zelden alles in een keer te herschrijven. Begin met het verplaatsen van scripts naar de Web Asset Manager, en vervang daarna de jQuery-aanroepen stuk voor stuk door gewone JavaScript.
Naar boven3. Hoe de browser Joomla's JavaScript laadt
3.1 Scripts onderaan, eenmaal geladen
Wanneer Joomla een pagina rendert, verzamelt het alle JavaScript waar de pagina, de modules en de plugins om vroegen, verwijdert dubbele, sorteert ze op afhankelijkheid en schrijft de <script>-tags in de HTML. Je voegt nooit hetzelfde bestand twee keer toe; Joomla regelt dat voor je.
3.2 defer, async en module
Modern Joomla markeert zijn scripts zo dat ze het tekenen van de pagina niet blokkeren. Drie attributen sturen dit:
| Attribuut | Wat het doet |
|---|---|
defer |
Nu downloaden, draaien nadat de HTML is verwerkt. De veilige standaard. |
async |
Nu downloaden, draaien zodra klaar, in willekeurige volgorde. Voor onafhankelijke scripts. |
type="module" |
Behandel het bestand als een ES-module. Altijd uitgesteld, en kan andere modules importeren. |
nomodule |
Laad alleen in oude browsers die modules niet begrijpen. Een terugval. |
Joomla's script-renderer begrijpt al deze. Het punt voor jou is dat je geen gewone <script> bovenaan een template moet plakken; laat Joomla die toevoegen met de juiste attributen, zodat het de eerste weergave niet vertraagt.
3.3 ES-modules en de import map
Joomla 6 gebruikt ES-modules: moderne JavaScript verdeeld over bestanden die uit elkaar importeren, dezelfde standaard die je browser van nature gebruikt. Om de ene module de andere te laten vinden via een korte naam in plaats van een lang pad, schrijft Joomla een import map in de pagina:
<script type="importmap">
{
"imports": {
"editor-api": "/media/system/js/editors/editor-api.min.js",
"editor-decorator": "/media/system/js/editors/editor-decorator.min.js"
}
}
</script>
Een asset gemarkeerd met "importmap": true in Joomla's assetlijst wordt automatisch aan deze map toegevoegd. Voor heel oude browsers levert Joomla een kleine shim (es-module-shims), zodat dezelfde code blijft werken. Je bouwt de import map niet met de hand; je markeert een asset en Joomla genereert hem.
4. De Web Asset Manager
De Web Asset Manager (WAM) is de moderne, juiste manier om CSS en JavaScript toe te voegen in Joomla 4, 5 en 6. Het verving de oude gewoonte om $document->addScript() aan te roepen met een vast pad. Dit begrijpen is het nuttigste wat een Joomla-ontwikkelaar over front-end-assets kan leren.
4.1 Het probleem dat het oplost
Voor WAM voegde elke extensie zijn eigen scripts direct toe, vaak dezelfde bibliotheek meerdere keren, in de verkeerde volgorde, zonder gedeelde versie. WAM lost dit op door elk script of elke stijl te behandelen als een benoemde asset met opgegeven afhankelijkheden. Je vraagt om een asset op naam; Joomla bepaalt de bestanden, de volgorde en de duplicaten.
4.2 Het assetregister en joomla.asset.json
Assets worden opgegeven in een bestand met de naam joomla.asset.json. Joomla's eigen kern-assets staan in media/system/joomla.asset.json, en elke extensie of template kan zijn eigen bestand meeleveren. Elke regel heeft een naam, een type, een bestand en de afhankelijkheden:
{
"name": "myextension",
"version": "1.0.0",
"assets": [
{
"name": "myextension.main",
"type": "script",
"uri": "com_myextension/main.min.js",
"dependencies": ["core"],
"attributes": { "defer": true }
}
]
}
Omdat de asset "dependencies": ["core"] opgeeft, laadt Joomla eerst zijn eigen core-script en daarna dat van jou. Die volgorde beheer je nooit zelf.
4.3 Een asset gebruiken
Vanuit PHP (in een view-template, een module of een plugin) bereik je de manager via het document en roep je useScript() of useStyle() aan met de assetnaam:
use Joomla\CMS\Factory;
$wa = Factory::getApplication()
->getDocument()
->getWebAssetManager();
// Laad een kern-asset op naam:
$wa->useScript('core');
// Laad je eigen geregistreerde asset:
$wa->useScript('myextension.main');
Als je een enkel bestand hebt dat geen volledige joomla.asset.json-regel waard is, kun je het in een stap registreren en gebruiken:
$wa->registerAndUseScript(
'myextension.inline',
'com_myextension/extra.js',
[],
['defer' => true],
['core']
);
4.4 De belangrijkste methoden
| Methode | Wat het doet |
|---|---|
useScript('name') |
Een geregistreerd script inschakelen (en zijn afhankelijkheden). |
useStyle('name') |
Een geregistreerde stylesheet inschakelen. |
registerScript('name', 'uri', ...) |
Een script opgeven zonder het al in te schakelen. |
registerAndUseScript(...) |
Een script opgeven en inschakelen in een aanroep. |
addInlineScript('code') |
Een klein blok inline-JavaScript toevoegen. |
disableScript('name') |
Een asset uitzetten die een andere extensie inschakelde. |
Dezelfde methodenamen bestaan voor stijlen (useStyle, registerStyle, enzovoort). Dit is de API om te leren; daarmee hoef je zelden nog ruwe <script>-tags aan te raken.
4.5 Handige kern-assets die je kunt laden
Joomla registreert veel van zijn eigen scripts als benoemde assets in media/system/joomla.asset.json en media/vendor/joomla.asset.json. Je schakelt ze op naam in, en Joomla haalt op waar ze van afhangen. De assets die je het vaakst pakt zijn:
| Assetnaam | Wat het je geeft |
|---|---|
core |
Het Joomla-object en zijn helpers. Bijna alles hangt hiervan af. |
keepalive |
Pingt de server zodat een lange bewerksessie de gebruiker niet uitlogt. |
form.validate |
Validatie aan de clientkant voor Joomla-formulieren. |
messages |
Toont Joomla's systeemberichten (de meldingsbalk). |
bootstrap.modal |
Bootstrap 5 modale dialogen (ook .dropdown, .collapse, .toast, .offcanvas). |
Zo laad je, in plaats van je eigen kopie van een modaal venster of een validator mee te leveren, degene die Joomla al levert:
$wa->useScript('keepalive');
$wa->useScript('form.validate');
$wa->useScript('bootstrap.modal');
Naar boven5. Het Joomla JavaScript-object
Joomla levert een klein kern-JavaScript-bestand, media/system/js/core.js, dat bijna elke beheerpagina laadt. Het definieert een globaal Joomla-object met helpers die je eigen scripts kunnen gebruiken. Een handvol ervan kennen scheelt veel werk.
5.1 Joomla.getOptions: data uit PHP lezen
Joomla.getOptions leest configuratie die PHP in de pagina heeft gezet (zie sectie 6). Het is de nette manier om een instelling, een ID of een URL van de server naar je script door te geven:
// PHP zette opties onder de sleutel 'com_myextension'
const opts = Joomla.getOptions('com_myextension', {});
console.log(opts.apiUrl);
5.2 Joomla.request: veilig met de server praten
Joomla.request is een kleine omhulling rond de verzoekafhandeling van de browser die automatisch Joomla's beveiligingstoken toevoegt. Het is de eenvoudigste manier om de server vanuit je script aan te roepen:
Joomla.request({
url: 'index.php?option=com_ajax&plugin=hello&format=json',
method: 'GET',
onSuccess: (response) => {
const data = JSON.parse(response);
console.log(data.data);
},
});
Je kunt ook de eigen fetch van de browser direct gebruiken; beide zijn prima. Voor aanroepen die data lezen, werkt allebei. Voor aanroepen die data wijzigen, moet je het beveiligingstoken toevoegen, wat de volgende helper levert.
5.3 Joomla.Text: vertalen in JavaScript
Teksten die je vanuit JavaScript toont, moeten ook vertaalbaar blijven. Joomla spiegelt zijn taalsysteem naar de browser. In PHP markeer je een tekst voor de front-end met Text::script('MY_KEY'), en in JavaScript lees je de vertaling terug:
// In PHP, voordat de pagina rendert:
// \Joomla\CMS\Language\Text::script('COM_MYEXTENSION_SAVED');
// In JavaScript:
alert(Joomla.Text._('COM_MYEXTENSION_SAVED'));
5.4 De handigste helpers
| Helper | Wat het doet |
|---|---|
Joomla.getOptions(key) |
Lees data die PHP injecteerde met addScriptOptions. |
Joomla.request(options) |
Doe een verzoek met het CSRF-token erbij. |
Joomla.Text._('KEY') |
Haal een vertaalde tekst op in de browser. |
Joomla.submitform(task, form) |
Stuur een Joomla-beheerformulier naar een taak. |
Joomla.submitbutton(task) |
Voer de taak van een werkbalkknop uit, met formuliervalidatie indien gevraagd. |
Joomla.renderMessages(messages) |
Toon meldingen in Joomla-stijl. |
Om deze in je eigen script te gebruiken, geef je core op als afhankelijkheid (of roep je $wa->useScript('core') aan), zodat het Joomla-object bestaat voordat je code draait.
5.5 Luisteren naar gebeurtenissen
Het meeste van je JavaScript reageert op iets wat de gebruiker doet: een klik, een wijziging, een toetsaanslag. De moderne manier om te reageren is addEventListener. Vermijd de oude gewoonte om onclick rechtstreeks in de HTML te schrijven, want dat mengt gedrag door je opmaak en een Content Security Policy (sectie 12) zal het blokkeren.
// Goed: gedrag staat in het script, niet in de HTML.
document.querySelector('#save')
.addEventListener('click', (event) => {
event.preventDefault();
// doe het werk
});
Als je veel soortgelijke elementen hebt, zoals elke rij in een lange lijst, hang dan niet aan elk een listener. Hang een enkele listener aan het bovenliggende element en controleer waarop geklikt is. Dit patroon heet event delegation, en het blijft snel, ook als de lijst groeit of er later rijen worden toegevoegd:
document.querySelector('#list')
.addEventListener('click', (event) => {
const button = event.target.closest('.delete');
if (button) {
// handel het verwijderen voor deze rij af
}
});
Een listener op het bovenliggende element doet het werk van honderden op de kinderen, en blijft werken voor rijen die je script toevoegt nadat de pagina is geladen.
Naar boven6. Data doorgeven van PHP naar JavaScript
Een veelvoorkomende behoefte is om je script wat data te geven die de server kent: een artikel-ID, een basis-URL, een lijst met opties, een functievlag. Probeer dat nooit met de hand in een <script>-tag te printen, want dat is een klassieke bron van bugs en beveiligingsgaten. Joomla heeft een veilige, ingebouwde manier.
6.1 addScriptOptions op de server
Voeg in PHP je data toe met addScriptOptions. Joomla maakt er veilige, ge-escapete JSON van en schrijft die voor je in de pagina:
use Joomla\CMS\Factory;
$doc = Factory::getApplication()->getDocument();
$doc->addScriptOptions('com_myextension', [
'apiUrl' => 'index.php?option=com_ajax&plugin=stock&format=json',
'itemId' => 42,
'canEdit' => $user->authorise('core.edit', 'com_myextension'),
]);
6.2 Joomla.getOptions in de browser
Je script leest de data dan terug via dezelfde sleutel, zonder HTML te ontleden en zonder risico op kapotte aanhalingstekens:
const cfg = Joomla.getOptions('com_myextension', {});
if (cfg.canEdit) {
// toon de bewerkknop
}
fetch(cfg.apiUrl).then((r) => r.json()).then(render);
6.3 Waarom niet gewoon echo'en?
Een PHP-waarde rechtstreeks in JavaScript printen ziet er makkelijk uit, maar is gevaarlijk. Een aanhalingsteken of een </script> in de data kan de pagina breken of een aanvaller code laten injecteren (cross-site scripting). addScriptOptions codeert alles correct als JSON, zodat de waarde intact en veilig aankomt. Gebruik het altijd in plaats van zelf een scripttekst op te bouwen.
7. Web Components: Joomla's eigen elementen
In plaats van een zwaar framework bouwt Joomla herbruikbare interface-onderdelen als Web Components: eigen HTML-elementen die door de browserstandaard zijn gedefinieerd. Je gebruikt ze als gewone tags, en de browser draait de JavaScript erachter.
7.1 Hoe een Web Component eruitziet
Joomla levert er meerdere als eigen elementen in media/vendor/joomla-custom-elements/, zoals de melding en het tabblad. In je HTML lezen ze als gewone tags:
<joomla-alert type="warning" dismiss="true">
Sla je werk op voordat je weggaat.
</joomla-alert>
De browser ziet <joomla-alert>, laadt de bijbehorende JavaScript, en het element wordt een werkende, sluitbare melding. Er is geen jQuery en geen framework bij betrokken.
7.2 Waarom Joomla hiervoor koos
Web Components zijn onderdeel van de browser zelf, dus ze blijven werken terwijl browsers updaten en ze klinken Joomla niet vast aan een JavaScript-framework dat ooit kan verdwijnen. Ze zijn op zichzelf staand, herbruikbaar over templates heen, en laden alleen wanneer de bijbehorende tag op de pagina voorkomt. Voor jou als ontwikkelaar betekent het een stabiele, op standaarden gebaseerde set bouwstenen in plaats van een bewegend doel.
7.3 De meegeleverde bibliotheken
Naast zijn eigen componenten levert Joomla een zorgvuldig gekozen set externe JavaScript-bibliotheken mee in media/vendor/, alleen geladen wanneer nodig:
| Bibliotheek | Gebruikt voor |
|---|---|
tinymce / codemirror |
De tekst- en code-editors. |
choicesjs |
Doorzoekbare keuzelijsten (zoals het tagveld). |
cropperjs |
Afbeeldingen bijsnijden in de mediabeheerder. |
shepherdjs |
De functie Begeleide rondleidingen. |
bootstrap |
Modale vensters, dropdowns en ander interfacegedrag. |
Omdat deze gedeeld zijn, kunnen twee extensies die allebei een datumkiezer of een grafiek nodig hebben dezelfde meegeleverde kopie gebruiken in plaats van elk hun eigen mee te leveren.
7.4 Bootstrap 5 komt met Joomla mee
Een meegeleverde bibliotheek verdient een eigen vermelding: Joomla levert Bootstrap 5, en niet alleen de CSS. Ook het JavaScript-gedrag zit erbij, opgesplitst in benoemde assets zodat je alleen het stuk laadt dat je nodig hebt:
| Asset | Component |
|---|---|
bootstrap.modal |
Pop-updialogen. |
bootstrap.dropdown |
Dropdownmenu's. |
bootstrap.collapse |
Panelen tonen en verbergen (accordeons). |
bootstrap.toast |
Kleine meldingsberichten. |
bootstrap.offcanvas |
Inschuivende zijpanelen. |
Een modaal venster, een dropdown of een accordeon heeft dus geen extra download en geen ander framework nodig, alleen een enkele useScript-aanroep:
$wa->useScript('bootstrap.modal');
7.5 Je eigen bibliotheek toevoegen
Joomla levert niet elke bibliotheek mee. Als je Chart.js voor een grafiek nodig hebt, SortableJS voor slepen-en-neerzetten, of een klein framework zoals Alpine.js of Vue, voeg het dan op dezelfde manier toe als elke andere asset: registreer het in je joomla.asset.json (of met registerAndUseScript) en laat de Web Asset Manager het laden. Plak geen vaste <script src="/..."> in je template; registreer de bibliotheek zodat Joomla de volgorde, de versie en de duplicaten ervan net als al het andere regelt.
8. De server aanroepen: Ajax in Joomla
De meest voorkomende reden om JavaScript te schrijven is het ophalen of opslaan van een klein stukje data zonder de hele pagina te herladen. Aan de serverkant beantwoordt Joomla's component com_ajax deze aanroepen. Aan de browserkant stuur je het verzoek vanuit JavaScript.
8.1 Een eenvoudige leesaanroep met fetch
Voor een verzoek dat alleen data leest, is de ingebouwde fetch van de browser genoeg:
const url = 'index.php?option=com_ajax&plugin=hello&format=json&name=JUG';
fetch(url)
.then((response) => response.json())
.then((json) => {
console.log(json.data); // jouw resultaat staat in .data
});
8.2 Data wijzigen vereist het CSRF-token
Elk verzoek dat iets wijzigt (opslaan, verwijderen, stemmen) moet Joomla's eenmalige beveiligingstoken meedragen, zodat een andere site het verzoek niet kan vervalsen. Lees het token uit de pagina-opties en stuur het als een header mee:
const token = Joomla.getOptions('csrf.token', '');
fetch('index.php?option=com_ajax&plugin=cart&format=json', {
method: 'POST',
headers: { 'X-CSRF-Token': token },
body: new URLSearchParams({ productId: 42 }),
});
Op de server moet de afhandelaar het token controleren voordat hij iets doet. De regel is overal in Joomla hetzelfde: een leesactie mag GET gebruiken, maar een schrijfactie moet POST en een token gebruiken.
8.3 Waar je meer leert
De serverkant hiervan, inclusief hoe je de plugin bouwt die de aanroep beantwoordt en hoe je die beveiligt, staat in een eigen artikel over com_ajax. Vanuit JavaScript dekken de twee patronen hierboven (een gewone fetch voor lezen, een POST met token voor schrijven) bijna alles wat je gaat doen.
9. JavaScript bouwen en compileren
De JavaScript die Joomla levert, is niet dezelfde als de JavaScript die de ontwikkelaars schrijven. De bron is modern en verdeeld over veel bestanden; de versie die naar browsers gaat, is geminificeerd en gebundeld. Dit weten helpt je begrijpen wat je in media/ ziet.
9.1 Bron versus gebouwde bestanden
Joomla's kern-JavaScript-bron staat in een build/-map en wordt gecompileerd naar de media/-map. Je ziet paren bestanden:
core.js de leesbare bron (voor debuggen)
core.min.js de geminificeerde versie (kleiner, voor productie)
core.min.js.gz vooraf gecomprimeerd voor snellere levering
Joomla laadt op een live site de .min.js-versie en kan de leesbare .js laden wanneer Debug-modus aanstaat, zodat je de echte code kunt lezen tijdens het oplossen van problemen.
9.2 De bouwtools
Het compileren van deze bestanden gebruikt Node.js en npm, de standaard JavaScript-tooling, met een bouwscript in het project. Je hebt dit alleen nodig als je de kern ontwikkelt of een extensie met een eigen bouwstap. Voor een normale site staan de gebouwde bestanden al klaar en draai je nooit een build.
9.3 Voor eigen code heb je zelden een build nodig
Voor je eigen kleine scripts heb je helemaal geen bouwpijplijn nodig. Schrijf een gewoon, modern .js-bestand, registreer het bij de Web Asset Manager, en Joomla serveert het. Pak een bouwstap (bundelen, transpileren) pas wanneer je code groot genoeg wordt om het nodig te hebben, niet voor een paar regels interactiviteit.
10. Waar je je eigen JavaScript plaatst
Net als bij PHP is de gulden regel om nooit kernbestanden te bewerken. Joomla geeft je nette plekken om JavaScript toe te voegen die updates overleven.
10.1 De juiste plekken
| Je wilt... | Plaats het script in... |
|---|---|
| Gedrag toevoegen aan de pagina's van een template | Je template (of child-template) en een joomla.asset.json. |
| Wijzigen hoe een view eruit komt | Een template-override, die het script daarvandaan laadt. |
| Een functie site-breed toevoegen | Een plugin die de Web Asset Manager aanroept. |
| Een op zichzelf staande functie leveren | Een component of module met eigen assets. |
10.2 Een script laden vanuit een plugin
Een systeemplugin is een nette manier om een script aan elke pagina toe te voegen. Het luistert naar een paginagebeurtenis en schakelt de asset in:
public function onBeforeCompileHead(): void
{
$wa = $this->getApplication()
->getDocument()
->getWebAssetManager();
$wa->registerAndUseScript(
'myplugin.widget',
'plg_system_myplugin/widget.min.js',
[],
['defer' => true],
['core']
);
}
10.3 Vermijd inline-scripts in inhoud
Het is verleidelijk om een <script> in een artikel te plakken. Standaard kunnen Joomla's editor en tekstfilters het verwijderen, en zelfs als het blijft staan, is het moeilijk te onderhouden en makkelijk te breken. Houd je JavaScript in een echt .js-bestand, geladen via het assetsysteem, en laat het artikel alleen inhoud bevatten.
11. Prestaties: houd JavaScript snel
JavaScript is krachtig, maar elk script dat de browser downloadt, ontleedt en draait, kost tijd. Op een telefoon met een zwakke verbinding is zware JavaScript een van de grootste redenen dat een site traag aanvoelt.
11.1 Laad minder, en laad het laat
- Gebruik
defer(de standaard van de Web Asset Manager) zodat scripts de eerste weergave niet blokkeren. - Schakel een asset alleen in op de pagina's die hem nodig hebben, niet site-breed uit gewoonte.
- Let op extensies die elk hun eigen kopie van jQuery of een grafiekbibliotheek laden; deel in plaats daarvan de meegeleverde versie.
11.2 Combineren en minificeren
Joomla kan hier op twee niveaus geholpen worden. De gebouwde kernbestanden zijn al geminificeerd. Voor de rest kan een goede cache- of optimalisatie-extensie meerdere kleine scripts combineren tot een verzoek en ze minificeren. Minder, kleinere bestanden betekenen minder heen-en-weer en snellere pagina's, vooral op HTTP/1.1-hosts.
11.3 Debounce en cache verzoeken
Wanneer je script de server aanroept terwijl de gebruiker typt (een live zoekopdracht bijvoorbeeld), stuur dan niet bij elke toetsaanslag een verzoek. Debounce de invoer: wacht tot de gebruiker pauzeert, en stuur dan een verzoek. En cache resultaten die zelden veranderen, zoals een lijst met landen, zodat je de server niet twee keer om hetzelfde antwoord vraagt.
11.4 Meten, niet gokken
Gebruik de ontwikkelaarstools van de browser (de tabbladen Network en Performance) om te zien welke scripts laden en hoe lang ze duren. Een tool zoals Lighthouse wijst direct op weergave-blokkerende of te grote JavaScript. Optimaliseer wat de meting laat zien, niet wat je aanneemt.
Naar boven12. Beveiliging en JavaScript
JavaScript draait op de machine van de bezoeker en is volledig zichtbaar, dus het verandert hoe je over beveiliging denkt. De twee grote uitgangspunten zijn dat je de client nooit kunt vertrouwen, en dat ingespoten scripts de belangrijkste dreiging zijn.
12.1 Vertrouw de client nooit
Elke controle die je in JavaScript doet, kan de bezoeker overslaan, wijzigen of vervalsen. Formuliervalidatie, een verborgen "is admin"-vlag, een uitgeschakelde knop: het is allemaal een gemak, geen bescherming. De server moet elk verzoek opnieuw valideren en autoriseren, precies alsof de JavaScript er niet was.
12.2 Cross-site scripting (XSS)
De meest voorkomende JavaScript-gerelateerde aanval is XSS: een aanvaller krijgt zijn script aan de praat binnen je pagina, in de browser van je bezoeker, waar het sessies kan stelen of inhoud kan wijzigen. Het gebeurt meestal wanneer gebruikersinvoer zonder escapen wordt geprint. Twee gewoontes voorkomen het meeste ervan:
- Escape op de server data voordat je die print (
$this->escape($value)in templates). - Zet in JavaScript tekst met
element.textContent, nietelement.innerHTML, wanneer je door gebruikers aangeleverde data invoegt.
// Veilig: behandeld als tekst, nooit als HTML.
node.textContent = userValue;
// Riskant: als userValue <script> bevat, kan het draaien.
node.innerHTML = userValue;
12.3 Geef data veilig door
Daarom is sectie 6 belangrijk: gebruik addScriptOptions en Joomla.getOptions om data van PHP naar JavaScript te verplaatsen. Ze coderen de waarde als JSON, zodat die nooit kan uitbreken en uitvoerbare code kan worden, wat een zelfgebouwde scripttekst wel kan.
12.4 Content Security Policy
Een Content Security Policy (CSP) is een HTTP-header die de browser vertelt welke scripts hij mag draaien, bijvoorbeeld "alleen scripts van mijn eigen domein". Een goede CSP maakt van veel XSS-pogingen onschadelijke, geblokkeerde verzoeken. Joomla kan beveiligingsheaders instellen via zijn systeemplugin HTTP Headers; een CSP is een van de sterkste verdedigingen die je kunt toevoegen, en het past goed bij het vermijden van inline-scripts.
Naar boven13. SEO en metadata
JavaScript en zoekresultaten komen op twee plekken samen: snelheid en zichtbaarheid van inhoud. Beide kunnen helpen of schaden, afhankelijk van hoe je scripts gebruikt.
- Weergave-blokkerende scripts vertragen de eerste weergave en schaden de Core Web Vitals. Stel je JavaScript uit (defer) zodat de pagina tekent voordat de scripts draaien.
- Zware JavaScript verhoogt de tijd voordat een pagina bruikbaar wordt. Kleinere, minder scripts geven betere scores.
- Inhoud die alleen door JavaScript wordt gebouwd wordt niet door elke crawler betrouwbaar gezien. Belangrijke tekst hoort in de HTML te staan die Joomla stuurt, met JavaScript die haar verrijkt, niet aanmaakt.
- Progressive enhancement is het veilige patroon: de pagina werkt zonder JavaScript, en scripts voegen daarbovenop gemak toe. Zoekmachines en gebruikers met scripts uit zien nog steeds de kerninhoud.
Kort gezegd: behandel JavaScript als een verrijkingslaag voor SEO. Laat Joomla en PHP de inhoud en de structuur leveren; laat JavaScript het mooier maken, snel en zonder te blokkeren.
Naar boven14. Veelgemaakte fouten en valkuilen
14.1 Scripts op de oude manier toevoegen
Symptoom: een script laadt twee keer, in de verkeerde volgorde, of voor core.js, en je code geeft "Joomla is not defined".
Oplossing: gebruik de Web Asset Manager (useScript, registerAndUseScript) en geef core op als afhankelijkheid, in plaats van een handgeschreven <script>-tag.
14.2 PHP-data in een script echo'en
Symptoom: de pagina breekt wanneer een waarde een aanhalingsteken bevat, of een beveiligingsscan markeert een XSS-gat.
Oplossing: geef data door met addScriptOptions in PHP en lees die met Joomla.getOptions in JavaScript. Bouw nooit met de hand een scripttekst.
14.3 Een JavaScript-controle vertrouwen
Symptoom: een formulier komt door de validatie in de browser, maar slechte of niet-geautoriseerde data bereikt toch de database.
Oplossing: valideer en autoriseer ook op de server. Controles aan de clientkant zijn alleen voor gebruikersgemak.
14.4 Het CSRF-token vergeten
Symptoom: een opslaan- of verwijderaanroep werkt tijdens het testen, maar is onveilig, of faalt zodra er tokencontroles op de server worden toegevoegd.
Oplossing: stuur het token (header X-CSRF-Token) mee bij elk verzoek dat data wijzigt, en verifieer het aan de serverkant.
14.5 jQuery meerdere keren laden
Symptoom: de site is traag en het Network-tabblad toont jQuery meer dan een keer gedownload.
Oplossing: laat extensies Joomla's meegeleverde bibliotheken delen via het assetsysteem, en verwijder extensies die hun eigen dubbele kopie meeleveren.
14.6 Een script in een artikel plaatsen
Symptoom: het script verdwijnt na opslaan, of werkt voor een beheerder maar niet voor een redacteur.
Oplossing: Joomla's tekstfilter verwijdert scripts uit inhoud voor de meeste gebruikers. Laad JavaScript in plaats daarvan vanuit een template, override of plugin.
Naar boven15. Best practices
Als je maar een paar dingen uit dit artikel onthoudt, onthoud dan deze:
- Gebruik de Web Asset Manager voor elk script en elke stijl; geef afhankelijkheden op in plaats van de volgorde te gokken.
- Schrijf gewone, moderne JavaScript; pak jQuery of een framework alleen wanneer het echt moet.
- Geef data van PHP naar JavaScript door met
addScriptOptionsen lees die metJoomla.getOptions. - Gebruik
Joomla.Text::scriptenJoomla.Text._()zodat scriptberichten vertaalbaar blijven. - Stel scripts uit (defer), laad ze alleen waar nodig, en deel meegeleverde bibliotheken om pagina's snel te houden.
- Stuur en verifieer een CSRF-token voor alles wat data wijzigt; houd leesacties op GET.
- Vertrouw de client nooit: valideer en autoriseer elk verzoek opnieuw op de server.
- Bescherm tegen XSS: escape bij uitvoer, geef de voorkeur aan
textContent, en overweeg een Content Security Policy. - Bewerk nooit kernbestanden; voeg JavaScript toe via templates, overrides, plugins of je eigen extensie.
- Houd inhoud in de HTML en laat JavaScript haar verrijken, zodat SEO en gebruikers zonder script veilig zijn.
16. In het kort
WAT HET IS JavaScript draait in de browser; PHP draait op de server
KERNBESTAND media/system/js/core.js definieert het globale Joomla-object
SCRIPT ERBIJ $wa = $doc->getWebAssetManager(); $wa->useScript('core');
REGISTER+USE $wa->registerAndUseScript('name', 'path.js', [], ['defer'=>true], ['core'])
ASSETBESTAND joomla.asset.json (name, type, uri, dependencies, attributes)
PHP -> JS $doc->addScriptOptions('key', $data)
JS LEEST DATA Joomla.getOptions('key', {})
VERTALEN PHP Text::script('KEY') -> JS Joomla.Text._('KEY')
VERZOEK fetch(url) voor lezen; Joomla.request(...) voegt het token toe
VEILIG SCHRIJVEN header X-CSRF-Token = Joomla.getOptions('csrf.token')
MODULES type="module" + importmap (markeer asset "importmap": true)
ATTRIBUTEN defer (standaard), async, type=module, nomodule
WEB COMPONENT <joomla-alert>, <joomla-tab> in media/vendor/joomla-custom-elements
BIBLIOTHEKEN media/vendor/ (tinymce, codemirror, choicesjs, bootstrap, jquery)
GEBOUWD *.js bron, *.min.js productie, *.min.js.gz vooraf gecomprimeerd
GEEN JQUERY Kern is vanilla JS sinds Joomla 4; jQuery is optioneel
BEVEILIGING Vertrouw de client nooit; escape uitvoer; CSP; textContent boven innerHTML
EIGEN CODE Template, override, plugin of component - nooit kern hacken
Naar boven17. Samenvatting
JavaScript is de helft van Joomla die in de browser draait. PHP bouwt de pagina op de server; JavaScript maakt haar interactief zodra ze aankomt. Joomla 6 pakt het modern en op standaarden gebaseerd aan:
- Gewone JavaScript: de kern liet MooTools vallen en maakte jQuery optioneel; nieuwe code gebruikt de eigen mogelijkheden van de browser.
- De Web Asset Manager: de juiste manier om scripts en stijlen toe te voegen, met benoemde assets en opgegeven afhankelijkheden, zodat niets twee keer of in de verkeerde volgorde laadt.
- Het Joomla-object: helpers zoals
getOptions,requestenTextverbinden je script met Joomla's data, beveiligingstoken en vertalingen. - Web Components en ES-modules: herbruikbare, op standaarden gebaseerde bouwstenen in plaats van een zwaar framework.
- Beveiliging en snelheid: vertrouw de client nooit, escape uitvoer, stuur tokens bij schrijfacties, en stel scripts uit zodat pagina's snel blijven.
De meeste JavaScript-problemen op een Joomla-site zijn geen diepe codeerfouten. Het zijn scripts die op de verkeerde manier zijn toegevoegd, een bibliotheek die meerdere keren is geladen, data die onveilig in een pagina is geprint, of een controle die op de client wordt vertrouwd terwijl die op de server had moeten draaien. Elk ervan is snel op te lossen zodra je weet hoe Joomla verwacht dat JavaScript wordt geladen en beveiligd.
Als je site traag aanvoelt, "is not defined"-fouten geeft, of je interactiviteit zoals live zoeken of opslaan-zonder-herladen op de juiste manier wilt toevoegen, dan zitten de oorzaak en de oplossing meestal in hoe de JavaScript wordt geladen en hoe die met de server praat. Dat is precies het soort front-end- en Joomla-integratiewerk waar ik bij help, zodat een site jarenlang snel, veilig en makkelijk te onderhouden blijft.
Naar boven

Peter is Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.
Veelgestelde vragen
JavaScript is de programmeertaal die Joomla-websites interactief maakt. Terwijl PHP de pagina op de server genereert, wordt JavaScript in de browser van de bezoeker uitgevoerd om menu’s, modale vensters, tabbladen, formuliervalidatie, AJAX-verzoeken, het uploaden van media en andere dynamische functies af te handelen. In de moderne versie van Joomla wordt JavaScript op grote schaal gebruikt, zowel in de frontend als in de beheerdersinterface.
Joomla laadt JavaScript via de Web Asset Manager (WAM). In plaats van <script>-tags handmatig toe te voegen, registreren ontwikkelaars assets in joomla.asset.json en laden ze deze met PHP. De Web Asset Manager lost afhankelijkheden automatisch op, voorkomt dubbele scripts, verbetert de caching en zorgt ervoor dat bestanden in de juiste volgorde worden geladen.
Ja. Joomla ondersteunt moderne JavaScript-functies, waaronder ES-modules (ESM) en Web Components. Met ES-modules kunnen ontwikkelaars code opsplitsen in herbruikbare bestanden, terwijl Web Components het mogelijk maken om ingekapselde, herbruikbare HTML-elementen te maken. Deze technologieën helpen ontwikkelaars om snellere en beter onderhoudbare Joomla-extensies en -sjablonen te bouwen.
Joomla biedt verschillende veilige manieren om gegevens aan de serverzijde door te geven aan JavaScript. Ontwikkelaars kunnen gebruikmaken van de Document API, HTML-gegevensattributen, JSON-responsen of het JavaScript-optiesysteem van Joomla. Deze methoden voorkomen dat PHP rechtstreeks in JavaScript-bestanden wordt verwerkt en dragen bij aan de veiligheid en onderhoudbaarheid van applicaties.
Absoluut. De moderne versie van Joomla is voor de meeste functionaliteiten niet langer afhankelijk van jQuery. De ingebouwde JavaScript-API’s bieden alles wat nodig is voor DOM-manipulatie, gebeurtenisafhandeling, AJAX-verzoeken en animaties. Het gebruik van ‘vanilla’ JavaScript leidt tot kleinere paginagroottes, betere prestaties en minder externe afhankelijkheden.
Vanilla JavaScript is puur JavaScript zonder externe bibliotheken of frameworks zoals jQuery, React of Vue. Het maakt uitsluitend gebruik van de functies die in moderne webbrowsers zijn ingebouwd.
De term “vanilla” is afgeleid van het idee van vanille-ijs, de basisversie zonder smaak die als uitgangspunt dient voor vele andere smaken. Op dezelfde manier verwijst Vanilla JavaScript naar de oorspronkelijke, standaard JavaScript-taal, voordat er extra tools of frameworks aan worden toegevoegd.
De belangrijkste best practices zijn:
- het gebruik van de Web Asset Manager
- het schrijven van ES-modules
- het vermijden van inline JavaScript
- het opschonen van alle gebruikersinvoer
- het tot een minimum beperken van DOM-manipulatie
- het laden van alleen de benodigde scripts
- en het gebruik van de API’s van Joomla in plaats van zelfgemaakte workarounds.
Het volgen van deze praktijken verbetert de beveiliging, de prestaties en de compatibiliteit op lange termijn met toekomstige versies van Joomla.
De eenvoudigste manier om JavaScript in Joomla te debuggen, is door gebruik te maken van de Ontwikkelaarstools van je browser. Open de Console om fouten en waarschuwingen te bekijken, variabelen te inspecteren en JavaScript-code uit te voeren. Het tabblad Netwerk helpt bij het opsporen van ontbrekende of geblokkeerde JavaScript-bestanden, terwijl je via het tabblad Bronnen breekpunten kunt instellen en je code regel voor regel kunt doorlopen.
Als een script niet wordt geladen, controleer dan eerst of het correct is geregistreerd in de Web Asset Manager van Joomla en of alle vereiste afhankelijkheden beschikbaar zijn. Een ontbrekend bestand of een onjuiste laadvolgorde is een veelvoorkomende oorzaak van JavaScript-fouten.
Controleer bij AJAX-verzoeken het verzoek en het antwoord in het tabblad Netwerk om te verifiëren of de server de verwachte gegevens retourneert. Als u ES-modules gebruikt, zorg er dan voor dat de browser de module correct laadt en dat de importpaden geldig zijn.
Gebruik bij het debuggen console.log(), console.error() en breakpoints in de browser om inzicht te krijgen in wat je code doet. Zodra je het probleem hebt gevonden, verwijder je de tijdelijke debug-instructies voordat je je code implementeert.
Een systematische aanpak, waarbij je de Console, het Netwerk, de Bronnen en het laden van assets controleert, brengt JavaScript-problemen meestal snel aan het licht.


