Javascript: hur bäst expandera cascading script från 3 till ca 10 nivåer?

Permalänk
Medlem

Javascript: hur bäst expandera cascading script från 3 till ca 10 nivåer?

Jag försöker göra ett HTML-formulär, med 10-12 st dropdown menyer.
Innehållet i varje dropdown ska skifta, baserat på vad som valts i föregående dropdown meny. Så kallade cascading dropdowns. Jag använder Javascript i dokumentet för att åstadkomma det.

Jag har gjort grundfunktionaliteten/scriptet för detta. Se koden nedan.
Men jag har gjort bara 3 nivåer hittills, och jag ska upp till .. säg 12 nivåer (för å va på säkra sidan). Min scriptkunskap är 'lagom' och jag börjar få svårt att se hur jag bäst expanderar koden från 3 upp till 12 nivåer?

Det måste nog ske genom både formatering av data-arrayerna och "onchange"-funktionerna längre ner, i olika kombinationer? (och givetvis fler dropdownmenyer i HTMLen )

Jag tror det är relativt enkelt för de som kan mycket. Det handlar nog bara om att se/hitta mönstret.

Skulle gärna uppskatta lite tips och hjälp på vägen att se- och förstå detta?
Tack på förhand

<html> <head> <style> body { display: flex; justify-content: center; } #andra, #tredje { display: none; } </style> <script> var subjectObject = { "Front-End": { "HTML": ["Tags", "Links", "Images"], "CSS": ["padding", "Margins", "Borders"], "Bootstrap5": ['Accordion', 'Tooltips', 'Toasts', ], "JavaScript": ["Variables", "Operators", "Functions"], "React.JS": ['Components', 'JSX', 'State'] }, "Back-end": { "Express.js": ['Routing', 'Middleware', 'Cookies'], "Node.js": ['REPL', 'package manager', 'callbacks'] }, "Database": { "MongoDB": ['Documents', 'Collections', 'Compass'], "MySQL": ['Create TABLE', 'Insert Data Into Table', 'Select Query'], }, "Hybrid/Cross-Platform": { "Electron JS": ['Main and Renderer Process', 'Browser Window', 'Quote Widget'], "React-Native": ['React Native CLI', 'Ejecting Expo', 'State Hook'], "NativeScript": [] } } window.onload = function () { var forsta = document.getElementById('forsta') var andra = document.getElementById('andra') var tredje = document.getElementById('tredje') for (var x in subjectObject) { // console.log(x); forsta.options[forsta.options.length] = new Option(x) } forsta.onchange = function () { andra.length = 1 tredje.length = 1 andra.style.display = 'block' tredje.style.display = 'none' for (var y in subjectObject[this.value]) { // console.log(y); andra.options[andra.options.length] = new Option(y) } } andra.onchange = function () { tredje.length = 1 tredje.style.display = 'block' z = subjectObject[forsta.value][this.value] console.log(z); for (let i = 0; i < z.length; i++) { tredje.options[tredje.options.length] = new Option(z[i]) } } } </script> </head> <body> <select id="forsta"> <option value=""> Välj alternativ </option> </select> <select id="andra"> <option value=""> Välj alternativ </option> </select> <select id="tredje"> <option value=""> Välj alternativ </option> </select> </body> </html>

Permalänk

Jag tänkte på "Recursive Dropdown Menus" och googlade fram detta:

https://codepen.io/jasesnider/pen/QKLQgP

Titta i JS-koden där hur de gjort med for-loopen.

Dess underliggande dropdowns verkar definieras av sub:[{}] i JSON-datan.

Jag provade göra ytterligare två nivåer då vilket gick:

var JSON = { data: [ {title: 'Game', link: '/game', sub: null}, {title: 'Community', link: '/community', sub: null}, {title: 'Media', link: '/media', sub: null}, {title: 'Forums', link: '/forums', sub: [ {title: 'Gameplay', link: '/gameplay', sub: null}, {title: 'Classes', link: '/classes', sub: [ {title: 'Barbarian', link: '/barbarian', sub: null}, {title: 'Demon Hunter', link: '/demon-hunter', sub: [ {title: 'Test1', link: '/sheesh', sub: [{title: 'Test2', link: '/sheesh2', sub: null}]} ]}, {title: 'Monk', link: '/monk', sub: null}, {title: 'Witch Doctor', link: '/witch-doctor', sub: null}, {title: 'Wizard', link: '/wizard', sub: null} ]}, {title: 'Beta', link: '/beta', sub: null}, {title: 'Support', link: '/support', sub: null} ]}, {title: 'Services', link: '/services', sub: null} ] };

Däremot får du nöta med CSS:n så menyerna hamnar rätt!

Ja, du behöver också byta ut det till <select> och <options> än hur det är nu!

Mvh,
WKL.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"