Perfection or Vanity

Project: Terminated

Blog nie jest już dalej prowadzony ani aktualizowany. Mimo tego, wpisy i komentarze są dalej dostępne. Możesz przeczytać pożegnalny wpis albo przejść do archiwum.

W poprzednim odcinku opisu DOM-u skupiliśmy się na sposobie odnajdywania elementów. Jest to przydatna umiejętność, umożliwiająca przechadzanie się po drzewie dokumentu i późniejsze operowanie na jego gałęziach. O wiele jednak ciekawiej będzie, gdy połączymy to z możliwością zmieniania i dodawania elementów jak i całych gałęzi. O tym dzisiaj.

Zanim jednak zaczniemy, musimy posiąść wiedzę na temat typu węzłów. Drzewo DOM składa się z kilku typów takich węzłów i musimy umieć je rozpoznawać. Węzły różnych typów mają przyporządkowane różne wartości liczbowe. Możemy poznać je przez właściwość nodeType.

Najczęściej spotykanym jest węzeł elementu - nodeType zwróci dla niego wartość 1. Węzeł atrybutu zwraca 2, natomiast węzeł tekstowy 3. Istnieje jeszcze 9 typów, z ważniejszych to 4 określająca sekcję CDATA oraz 8 odpowiadająca węzłowi komentarza.

Jeśli okaże się, że aktualny węzeł jest elementem (nodeType dla niego to 1) możemy skorzystać z właściwości nodeName i pobrać jego nazwę (div, p, a, i tak dalej). Jeśli będzie to węzeł atrybutu dostaniemy nazwę atrybutu. Natomiast jeśli odnosimy się do węzła tekstowego nodeName zwraca "#text". Zaznacza się, że nodeType jak i nodeName są właściwościami tylko do odczytu.

Jest jeszcze nodeValue. Ta właściwość zwraca tekst węzła tekstowego oraz wartość atrybutu. Dla elementu zwraca null, czyli nic. Właśnie gdy mamy do czynienia z węzłem elementu nie możemy nadpisać tej wartości (null), w pozostałych przypadkach możemy - zmienić wartość atrybutu albo tekst.

Powiązana jest z tym pewna pułapka. Początkujący koderzy DOM zwykle chcąc zmienić tekst elementu na stronie, pobierają jego uchwyt, na przykład za pomocą getElementById

  1. var uchwyt = document.getElementById("jakisdiv");

a potem robią tak:

  1. uchwyt.nodeValue = "tego nie robi się tak";

Uważni obserwatorzy zauważyli już, że próbowano przyporządkować nową wartość elementowi, a nie tekstowi w nim zawartemu, który jest kolejnym węzłem. Należy sięgnąć do węzła pod elementem i jemu przypisać nową nodeValue. Skorzystamy tutaj z firstChild połączonej ze sprawdzeniem czy na pewno docelowy węzeł jest tekstowy - za pomocą nodeType.

  1. if (uchwyt.firstChild.nodeType == 3) {
  2. uchwyt.firstChild.nodeValue = "bo robi się właśnie tak"
  3. }

Tworzenie elementów umożliwia metoda createElement(nazwa). Metoda ta zwraca odwołanie do stworzonego elementu. Element nie jest dodawany do drzewa DOM - wisi sobie w przestrzeni czekając aż coś mu każe do niego się przyczepić ;) = nie ma właściwości parentNode. Przykładowo aby stworzyć cytat blokowy należy napisać tak:

  1. var cytat = document.createElement("blockquote");

Teraz aby doczepić nowo stworzony cytat należy skorzystać z appendChild. Jest to metoda dodająca dany węzeł na koniec węzłów potomnych (childNodes mówiąc w DOM) tego z którego go wywołano.

  1. document.body.appendChild(cytat);

W ten sposób korzystając z skrótu dla body (zamiast getElementsByTagName("body")[0]) dokumentu umieściliśmy cytat na samym jego końcu. W kolejnej części dowiemy się jak podczepiać elementy w innych miejsach, na razie starczy tyle.

Z appendChild wiąże się kolejna podstawowa metoda - tworzenie tekstu (węzła o nodeType równym 3).

  1. var tekst = document.createTextNode("przykładowy cytat");

Podobnie jak w przypadku createElement otrzymanego tekstu nigdzie nie widać w dokumencie i używając odwołania należy go podczepić elementowi. Powiedzmy że będzie to nasz cytat.

  1. cytat.appendChild(tekst);
  2. document.body.appendChild(cytat);

Teraz dopiero zobaczymy w przeglądarce wynik naszych działań - na końcu dokumentu pojawi się (zazwyczaj) wcięty tekst "przykładowy cytat".

Informacje i hiperłącza

Blog o projektowaniu zgodnych ze standardami stron internetowych.

Praktyczne przykłady, sztuczki CSS, sposoby obchodzenia błędów przeglądarek, lekki i nieinwazyjny JavaScript, użyteczny design, dostępność i skrypty użytkownika.

RSS

Informacje o wpisie

Napisał riddle 04 kwietnia 2006 o 04:40

Kategorie: JavaScript & DOM, Standardy sieciowe

Dodaj do:

Wpisy archiwalne

Archiwum miesięczne

Dzięki!

Dodaj bloga do Technorati Favorites Dodaj bloga do Del.icio.us Blog należy do sieci 10przykazań.com

  1. 1) Dla formalności: „artrybutu”, a „do czynienia” rozłącznie.
    2) A mógłbyś powiedzieć mi coś na temat dodawania węzłów w środku? Bo coś tam Googlałem, ale nic konkretnego nie znalazłem.

  2. Paweł Knapik napisał do tego fajnego wrappera: http://pawel.saikko.com/examples/dom-inner.html

  3. firstChild to nie jest metoda.

  4. Node.insertBefore(newChild, refChild);

  5. Geez, będzie i o insertBefore i custom funkcji insertAfter. Tak samo mam zamiar nawiązać do domEl Pawła.

  6. Ta funkcja którą udostępniłem jest bardzo użyteczna, ale należy mieć dość dobre pojęcie o podstawach DOM - inaczej można się pokaleczyć ;) To skrót, umożliwiający uproszczenie zapisu i znacznie usprawniający działanie na zbiorach elementów, ale wiedza o tym, co dzieje się "pod spodem" jest ważniejsza niż umiejętność korzystania z uproszczeń.
    BTW, skoro artykuł traktuje o węzłach: pod poprzednim wpisem z serii wspomniałem o pustych węzłach w drzewie DOM - napisałem funkcję, która je usuwa http://pawel.saikko.com/dealing-with-empty-nodes,20060326

  7. Czy jak zrobię:
    var cytat = document.createElement("blockquote");
    document.body.appendChild(cytat);

    to majstrowanie przy elemencie "cytat" będzie się odbywać na dzewie DOM, czy też wisi to sobie dalej w przestrzeni?

  8. W sumie powinienem to dopisać - będzie działać to „majstrowanie” nadal.

  9. eee... "będzie działać na drzewie" czy "będzie działać w przestrzeni"? :)

  10. W DOM, zarówno przed jak i po podłączeniu. Uchwyt do elementu na niego wskazuje, podpięcie następuje za pomocą uchwytu ale nadal jest z nim związany.

  11. I ta odpowiedź mnie w pełni satysfakcjonuje. Dzięki.

  12. Właściciwie to wszystko już jest tutaj:
    http://free.of.pl/n/nux/index.php?str=DOM-dodawanie-elementow-i-style
    :-)

    A tak nawaisem mówiąc, to dodałbyś alty do obrazków, bo nie wiedziałem gdzie klinąć, żeby dodać komentarz ;)

  13. Miło, że się podzieliłeś linkiem, ale mogłeś po prostu napisać że stworzyłeś kompendium wiedzy. Bo takto wyszło jakbyś krytykował i kwestionował przydatność mojego wpisu. ;-)

    Alty… nie rozumiem o czym mówisz, przyciski input[type="image"] mają alt, zarówno jak img na stronie głownej.

  14. mootools - element.js

    Przed przejściem do lektury na temat pliku element.js polecam osobom, które o DOM maja małe pojęcie przeczytać trochę materiałów na ten temat. Osobiście polecam ten artykuł o obiektach DOM oraz wpisy Riddle'a na ten temat:

    Document Object[...]

  15. Riddle: A rzeczywiście alty są – to Firefox zawala… Zwracam honor i zgłaszam błąd :).

  16. a ja mam takie pytanie: czy da sie zeby firstChild.nodeValue czytało zawartość pliku np z długim cytatem? Będę mocno wdzięczny za odpowiedz.

  17. Jeśli chcesz pobierać zawartość pliku w tej samej domenie, zainteresuj się Ajaksem (google: Ajax, xmlHttpRequest).

Dodaj komentarz

Do formatowania komentarzy używaj Textile (HTML nie działa). Szczególnie jeśli wklejasz większe fragmenty kodu. W razie niepewności użyj podglądu komentarza.

Wypowiedzi obraźliwe, infantylne oraz nie na temat będą moderowane – pisząc postaraj się zwiększyć wartość dyskusji.

Komentarze nie służą do wysyłania wiadomości albo informowania o błędach, itd. Chcesz coś mi napisać – skontaktuj się.