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

Zabawa z Wisielcem [refaktoryzacja]

Object Storage Arubacloud
0 głosów
312 wizyt
pytanie zadane 29 maja 2016 w JavaScript przez Monster Początkujący (430 p.)
function getAlphabet() {
    div_alphabet_content = "";
    table_letters = new Array
    (
        "A", "Ą", "B", "C", "Ć", 
        "D", "E", "Ę", "F", "G", 
        "H", "I", "J", "K", "L", 
        "Ł", "M", "N", "Ń", "O", 
        "Ó", "P", "Q", "R", "S", 
        "Ś", "T", "U", "V", "W", 
        "X", "Y", "Z", "Ż", "Ź"
    );
    /*tablica liter 7x5*/
    var number_letter = "";
    for(i=0; i<=34; i++) {
        number_letter = "lett" + i;
        
        div_alphabet_content = div_alphabet_content + '<div class="letter" onclick="gameInferface('+i+')" id="'+ number_letter + '">' 
        + table_letters[i] + '</div>' + '\n'; // zmienna zawiera ciąg znaków !
        if ((i+1) % 7 === 0) 
        {
            div_alphabet_content = div_alphabet_content 
            + '<div id="corector"></div>\n';
        }
    }
    
    alphabet.innerHTML = div_alphabet_content;
}

Funkcja zainspirowana filmem Pana Mirosława, wyjadacze połapią się szybko (gra wisielec). Chciałbym jakoś pozbyć się:

div_alphabet_content = div_alphabet_content + '<div class="letter" onclick="gameInferface('+i+')" id="'+ number_letter + '">' 
        + table_letters[i] + '</div>' + '\n';

W końcu drzewo html można budować z pomocą funkcji, a takie mega ciągi znaków są mało estetyczne :)

3 odpowiedzi

0 głosów
odpowiedź 29 maja 2016 przez Comandeer Guru (601,590 p.)
No można… Tylko po co się męczyć z tworzeniem każdego węzła osobno? Zaproponowane rozwiązanie jest przyjaźniejsze.
komentarz 29 maja 2016 przez Monster Początkujący (430 p.)
Tylko po co się męczyć?... po to, że można :)
komentarz 29 maja 2016 przez Comandeer Guru (601,590 p.)

Ja tam masochistą nie jestem… element.innerHTML wciąż jest najprostszym sposobem ustalania treści elementu i raczej się to już nie zmieni ;)

komentarz 6 czerwca 2016 przez ScriptyChris Mędrzec (190,190 p.)

@Comandeer, czyli nie twierdzisz, że element.innerHTML jest gorszym wyborem jeśli chodzi o tworzenie elementów, niż document.createElement() node.appendChild() ?

komentarz 6 czerwca 2016 przez Comandeer Guru (601,590 p.)
Oczywiście, że nie jest. Powiem więcej: jest wygodniejszy i całkiem możliwe, że wydajniejszy.
komentarz 6 czerwca 2016 przez ScriptyChris Mędrzec (190,190 p.)

Czy innerHTML jest wygodniejszy, to nie wiem. Dla mnie jest mniej czytelny.

A co jeśli chodzi o "czystość" kodu? Mógłbyś podać źródła, że innerHTML nie jest w tym gorszy? 

http://stackoverflow.com/a/2305677/4983840

The latter (appendChild) does not cause a complete rebuild of the DOM or even all of the elements/nodes within the target.

vs

The former (setting innerHTML) does cause a complete rebuild of the content of the target element, which if you're appending is unnecessary.

Czyli appendChild() - w przeciwieństwie do innerHTML - nie powoduje przebudowy drzewka DOM docelowego elementu ani elementów/węzłów (dzieci) wewnątrz tego elementu.

Mogę się mylić, ale wg mnie przebudowa struktury DOM trwa, a zatem appendChild powinno być szybsze, bo tego nie robi. Mam rację?

Tutaj appendChild() jest szybszy: https://gist.github.com/oliverfernandez/5619180

1
komentarz 6 czerwca 2016 przez Comandeer Guru (601,590 p.)

Created 3 years ago

Zrobiłbym jakieś nowsze testy, bo mam wrażenie, że coś mogło się zmienić. Inna rzecz: ciekawi mnie jak duża musi być skala, żeby to odczuć ;)

 A co jeśli chodzi o "czystość" kodu? Mógłbyś podać źródła, że innerHTML nie jest w tym gorszy? 

Polecam stworzyć tabelę przy pomocy metod DOM-owych i innerHTML – tylko tyle ;) Co do czystości – nie wiem, czy coś się znajdzie.

Natomiast problem z przebudową całego DOM elementu: jeśli operujemy na żywym drzewku DOM i musimy je zmodyfikować przy zachowaniu obecnego stanu, to tak – wówczas innerHTML. Ale jeśli chcemy po prostu wstawić nowy element do pustego rodzica albo coś wygenerować, nie widzę powodu, aby nie użyć innerHTML

komentarz 6 czerwca 2016 przez ScriptyChris Mędrzec (190,190 p.)

Ja tam masochistą nie jestem… element.innerHTML wciąż jest najprostszym sposobem ustalania treści elementu i raczej się to już nie zmieni ;)

Domyślam się, że osobiście częściej korzystasz z innerHTML

A, czy w ogóle korzystasz z appendChild()?

1
komentarz 6 czerwca 2016 przez Comandeer Guru (601,590 p.)
Korzystam – wtedy, gdy nie mogę pozwolić sobie na odświeżenie całego drzewka elementu (np. w przypadku dodawania komunikatu o błędzie koło pola formularza).
komentarz 6 czerwca 2016 przez ScriptyChris Mędrzec (190,190 p.)

Czyli appendChild jest bardziej precyzyjne?

1
komentarz 6 czerwca 2016 przez Comandeer Guru (601,590 p.)

Nie, po prostu operuje na drzewie DOM, a innerHTML na stringu.

0 głosów
odpowiedź 29 maja 2016 przez Magicone Nałogowiec (45,100 p.)

Generalnie każdy odcinek z kursu Mirka ma swoje tematy, gdzie umieszcza się uwagi, bądź CR. Pierwszy odcinek był już omawiany tutaj. Takie tematy dodawane są regularnie, więc wkrótce przyjdzie czas i na ten z wisielcem. ;)

Ale mimo wszystko, do operacji, które chcesz wykonać będą potrzebne takie metody jak createElement, createTextNode, appendChild.

komentarz 29 maja 2016 przez Monster Początkujący (430 p.)
"Takie tematy dodawane są regularnie, więc wkrótce przyjdzie czas i na ten z wisielcem"

wkrótce, hmmm...
0 głosów
odpowiedź 6 czerwca 2016 przez Monster Początkujący (430 p.)
edycja 6 czerwca 2016 przez Monster

I prawie mi się udaje tylko czemu funkcja wywołuje się x2 razy ?

function getAlphabet() {

    table_letters = new Array
    (
        "A", "Ą", "B", "C", "Ć", 
        "D", "E", "Ę", "F", "G", 
        "H", "I", "J", "K", "L", 
        "Ł", "M", "N", "Ń", "O", 
        "Ó", "P", "Q", "R", "S", 
        "Ś", "T", "U", "V", "W", 
        "X", "Y", "Z", "Ż", "Ź"
    );
    var number_letter = "";
    for(var i=0; i<=34; i++) {
        number_letter = "lett" + i;
        var alphabet_div = new Array(34);
        alphabet_div[i] = document.createElement("div");
        textNode = document.createTextNode(table_letters[i]);
        alphabet_div[i].setAttribute("id", number_letter);
        alphabet_div[i].setAttribute("class", "letter");
alphabet_div[i].setAttribute("onclick", "gameInferface("+i+")"); 

        alphabet_div[i].appendChild(textNode);
        alphabet.appendChild(alphabet_div[i]);
        if ((i+1) % 7 === 0) 
        {
            var corector = document.createElement("div");
            corector.setAttribute("id", "corector");
            alphabet.appendChild(corector);
            
        }
    }   
}

 

Podobne pytania

0 głosów
1 odpowiedź 357 wizyt
pytanie zadane 12 lipca 2020 w JavaScript przez Arcywojak Początkujący (370 p.)
0 głosów
3 odpowiedzi 614 wizyt
pytanie zadane 28 września 2017 w JavaScript przez niezalogowany
+1 głos
2 odpowiedzi 374 wizyt

92,584 zapytań

141,434 odpowiedzi

319,669 komentarzy

61,967 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!

...