• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Budowanie menu w js

Object Storage Arubacloud
0 głosów
223 wizyt
pytanie zadane 19 listopada 2017 w JavaScript przez darek_kce Gaduła (3,180 p.)
Cześć,

Ostatnio zatrzymałem się na problemie zrealizowania "menu buildera" w js. Ma on działać dokładnie tak samo jak ten z WordPressa, tylko nie wiem jak to za bardzo ugryźć. Otóż chciałem skorzystać z popularnego jQuery UI i interfejsu draggable + sortable, jednak sprawa komplikuje się kiedy chcę dodać drugi poziom tego menu. Nie wiem jak rozróżnić element "główny" menu, a jak element "submenu"?

Niestety nie mam jeszcze kodu bo dopiero teoretycznie rozważam ten problem. Robił ktoś coś kiedyś podobnego i mógłby pomóc/podsunąć jakiś pomysł?
komentarz 19 listopada 2017 przez jaca121212 Nałogowiec (40,760 p.)
przeniesione 19 listopada 2017 przez ScriptyChris
Jakbyś chciał to byś nawet w czystym JS bez biblioteki JQery napisał takie menu.
komentarz 19 listopada 2017 przez darek_kce Gaduła (3,180 p.)
Mógłbyś trochę rozwinąć? Nie za dużo to pomaga
komentarz 19 listopada 2017 przez jaca121212 Nałogowiec (40,760 p.)

W czystym js będzie kod wyglądał bardzo duży poczytaj o tym z lewej strony masz funkcje do Js .

Nie koniecznie musisz się sugerować czystym JS możesz połączyć  bibliotekę Jquery  czy też inną 

1 odpowiedź

0 głosów
odpowiedź 20 listopada 2017 przez Schizohatter Nałogowiec (39,600 p.)
edycja 20 listopada 2017 przez Schizohatter

Ogólnie najwięcej rozbiega się o strukturę menu w pamięci. Widzę dwie opcje.

Zacznijmy od jakichś konwencji:

Każde submenu to także menu.
Każde menu to zbiór linków.
Każde menu to obiekt.
Każde menu może zawierać submenu oraz linki jednocześnie.

Opcja A)

Tworzymy strukturę drzewa bezpośrednio:

{
    name: 'Menu 1',
    links: ['link-1', 'link-2', 'link-3'],
    submenus: [
        {
            name: 'Submenu 1',
            links: ['link-1'],
            submenus: [
                {
                    name: 'Subsubmenu 1',
                    links: []
                }
            ]
        }
    ]
}

Taka struktura jest bardzo wygodna do parsowania, natomiast jest w niej taki problem, że brak jest luźnego powiązania rodzic-dziecko. Elementy są ze sobą ściśle związane. Luźne powiązanie przyda nam się, skoro chcemy je zmieniać poprzez przenoszenie

Opcja B

{
    id: '1',
    name: 'Menu 1',
    links: ['link-1', 'link-2', 'link-3'],
}

{
    id: '2',
    name: 'submenu 2',
    links: ['link-1'],
    parent: '1' // Link do 'id' innego menu
}

Jest to struktura podobna do zapytań z bazy danych. Po pierwsze taką strukturę bardzo łatwo zapisać do bazy danych, po drugie bardzo łatwo przerzucać linki między menu, oraz submenu z menu do menu.

Jedyny problem to utrudnione parsowanie do HTMLa.

 

Teraz zakładając, że wybierzesz opcję B, bo jest lepsza do stworzenia luźnego menu, to kwestia przeciągania elementów jest prosta. Wystarczy, że do HTMLa menu w atrybucie data-id zapiszesz jego id. W momencie przeciągania musisz tylko znaleźć data-id elementu, na który został upuszczony dany element. Jeśli przeciągasz całe menu to musisz zmienić id przeciąganego menu na pobrane data-id, a jeśli przeciągasz pojedynczy link, to musisz jedynie przerzucić go do tablicy docelowego menu (id znasz). No i zrobić po tym re-rendrer.

Można pójść o krok dalej i zapisać również linki jako osobne obiekty i przypisać im tylko własność "parent".

To są oczywiście ogólne wskazówki. Szczegóły implementacji zależą od Ciebie. Ale jak widzisz nie jest to aż takie trudne.

Dość hardkorowe jest jedynie parsowanie tej struktury, bo parsowanie od dziecka do rodzica nigdy nie jest fajne xd W gruncie rzeczy musisz przeparsować opcję B do opcji A. Pierwsze, co przychodzi mi do głowy, to rekurencyjne parsowanie całości, aż nie zostanie żaden obiekt submenu (czyli takie menu, które posiada "parent").

No cóż, zawsze możesz zrobić to tak samo, ale zamiast trzymać referencje do rodzica w postaci własności "parent", to trzymać referencje do dzieci w postaci "submenus", ale to też niesie ze sobą konsekwencje.

Możesz też się pobawić w coś, co napisałem do mojego range'a:

https://github.com/mm-jsr/jsr/blob/master/src/assets/js/core/renderer.js#L33L70

https://github.com/mm-jsr/jsr/blob/master/src/assets/js/core/structureParser.js

Powyższy skrypt konwertuje drzewo z pliku renderer.js (to drzewo może być rozszerzane o elementy dodawane przez inne moduły) do formy drzewa HTML. Może coś z tego wyniesiesz. Ponieważ jest to skrypt rekurencyjny, to trzeba się wysilić, żeby go zinterpretować :P Zależności rodzic-dziecko budowane są bezpośrednio na poziomie HTML (appendChild), natomiast w zmiennej `body` znajdują się ogólnie wszystkie obiekty wrzucone razem, żeby można było się do nich odnosić.

Podobne pytania

0 głosów
1 odpowiedź 251 wizyt
pytanie zadane 25 sierpnia 2019 w JavaScript przez Pawel82 Użytkownik (740 p.)
0 głosów
1 odpowiedź 368 wizyt
0 głosów
1 odpowiedź 1,909 wizyt
pytanie zadane 18 lipca 2017 w JavaScript przez Alterwar Dyskutant (7,650 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...