JavaScript - wykład 3 Document Object Model (Obiektowy Model

Transkrypt

JavaScript - wykład 3 Document Object Model (Obiektowy Model
DOM W3C
http://kurs.browsehappy.pl/Definicja/DOM
JavaScript - wykład 3
Document Object Model
(Obiektowy Model Dokumentu)
Obiekty stron WWW
Beata Pańczyk
• słuŜy do przedstawienia dokumentów HTML i
XML (XHTML)
• CSS i Javascript uŜywają go do operowania na
dokumentach
• wg W3C DOM: dokument to drzewiasty zbiór
węzłów
• węzeł moŜe być elementem, ciągiem tekstu,
komentarzem, itp.
• kaŜdy węzeł moŜe mieć jednego rodzica, dowolną
ilość braci (lub sąsiadów) i, jeśli jest elementem,
dowolną ilość dzieci.
1
2
Metody DOM
DOM W3C
Węzeł
3
Metody DOM
Selektor CSS
JavaScript DOM
Korzeń (Root)
:root, html
element.ownerDocument.documentElement
Rodzic (Parent)
brak
element.parentNode
Przodek (Ancestor)
brak
element.parentNode.parentNode...
Poprzedni sąsiad
(Previous sibling)
brak
element.previousSibling
Następny sąsiad
(Next sibling)
element + sąsiad
element.nextSibling
Pierwsze dziecko
(First child)
element >
element.firstChild
dziecko:first-child
Ostatnie dziecko
(Last child)
element >
dziecko:last-child
element.lastChild
Wszystkie dzieci
(Children)
element > *
element.childNodes
Potomkowie
(Descendants)
element *
element.getElementsByTagName('*')4
Wcześniejsze modele dokumentu
• DOM Netscape (DOM0) - znacznie róŜniący się
od W3C DOM, był częścią pierwotnego języka
Javascript wprowadzonego przez Netscape.
Dzielił dokument na kolekcje obrazków, linków,
fomularzy, itp. Część z tych rozwiązań została
zachowana w W3C DOM dla kompatybilności
wstecz
• DOM Microsoft (DHTML) document.all był
zbiorem wszystkich elementów posortowanym wg
ich identyfikatora, kolejności w dokumencie lub
nazwy tagu. Microsoft porzucił swój DOM na
rzecz tego z W3C
• selektory CSS nie dają moŜliwości
wybrania przodków ani poprzedników aby
ułatwić przeglądarkom wyświetlanie
progresywne (element występujący później
w dokumencie nie powinien
mieć wpływu na wcześniejsze) oraz
uniemoŜliwić zrobienie kombinacji
selektorów dających błędne koło
5
6
1
DOM dla JavaScript
Podstawowe obiekty
• DOM - sposób przedstawienia dokumentu; zestaw metod i pól,
które umoŜliwiają odnajdywanie, zmienianie, usuwanie i dodawanie
elementów
• DOM W3C (dwie części):
– podstawowy (ang. core) - ogólny sposób reprezentowania
dokumentów XML; przedstawia dokument jako drzewo
zawierające węzły (ang. node). KaŜdy węzeł moŜe być
elementem, fragmentem tekstu, komentarzem, instrukcją
preprocesora (np. dołączonym fragmentem PHP) albo encją
– DOM HTML (typowy dla przeglądarek) - to zestaw metod
ułatwiających tworzenie dynamicznych stron oraz
zapewniających kompatybilność wstecz z wcześniejszym
prostym DOM Netscape. DOM HTML przedstawia dokument
jako kilka kolekcji obiektów określonych typów (np. formularze,
obrazki) oraz dodaje pola/metody ułatwiające dostęp do
funkcjonalności specyficznej dla HTML, jak np. odczyt pól 7
formularza.
• window - główny, globalny obiekt w
DOM; w nim przechowywane są
wszystkie globalne zmienne i funkcje; w
nim jest takŜe obiekt document, który
reprezentuje całą stronę HTML/XHTML
• document.documentElement główny element dokumentu (korzeń), czyli
<html>
• document.body - obiekt reprezentujący
<body> dokumentu.
8
Skakanie po węzłach (elementach)
Odnajdywanie elementów (1)
• getElementById(id) - po identyfikatorze
var elid = document.getElementById('elid')
if (!elid) alert('nie ma elementu o tym id!')
• getElementsByTagName(nazwa) - po nazwie (name)
elementu; zwraca kolekcję wszystkich elementów, które mają
określoną nazwę; * zamiast nazwy - wszystkie elementy;
wywołanie metody na dowolnym elemencie – zwraca tylko
elementy w nim zawarte, np.:
var tab = elid.getElementsByTagName('nazwa')
for(i=0;i<tab.length;i++) tab[i]
tab - kolekcja (tablica) wszystkich elementów o nazwie nazwa
wewnątrz elementu reprezentowanego przez obiekt elid; kolekcje
reagują na zmiany w dokumencie - jeśli element zostanie usunięty z
dokumentu, to zniknie takŜe ze wszystkich kolekcji
KaŜdy węzeł (czyli element, fragment tekstu, komentarz) posiada
pola wskazujące na jego sąsiednie węzły
Nazwa pola
Element
First child
Pierwszy węzeł zawarty w tym elemencie
Last child
Ostatni węzeł zawarty w tym elemencie
Previous sibling Sąsiedni węzeł przed tym elementem
Next sibling
Sąsiedni węzeł za tym elementem
ParentNode
Element, w którym zawarty jest ten element
ChildNodes
Kolekcja wszystkich węzłów zawartych w tym
elemencie
9
Wyszukiwanie tylko elementów
• Domyślnie pola wskazują na dowolne węzły, łącznie z
tekstem i komentarzami w dokumencie
• Elementy od innych węzłów moŜna odróŜnić za pomocą
pola nodeTyp:
if (element.nextSibling &&
element.nextSibling.nodeType == 1)
alert('sąsiedni węzeł jest elementem')
Stała
Wartość
Znaczenie
ELEMENT_NODE
1
Element
TEXT_NODE
3
Tekst
ENTITY_NODE
6
Encja
COMMENT_NODE
8
Komentarz
11
10
Atrybuty
• getAttribute(nazwa) – odczyt, zwraca null jeŜeli atrybut nie
istnieje
• setAttribute(nazwa,wartość) – ustawianie
• removeAttribute(nazwa) – usuwanie
• hasAttribute(nazwa) - sprawdzenie czy dany atrybut istnieje
Np.:
<a href="http://kurs.browsehappy.pl/" rel="archive" id="kurs">
Kurs BrowseHappy</a>
anchor = document.getElementById('kurs');
var anchorRel = anchor.getAttribute('rel');
alert(anchorRel);
//zwróci wartość atrybutu rel
if(anchor.hasAttribute('class'))
var anchorClassName = anchor.getAttribute('class');
alert(anchorClassName);
//jeŜeli istnieje class, to zwróci jego wartość
anchor.setAttribute("rel", "kurs");
//nadpisze rel
anchor.setAttribute("lang", "pl");
//stworzy nowy atrybut i
// przypisze mu wartość
12
2
Usuwanie, tworzenie i dodawanie
elementów
•
• removeChild - metoda pozwalającą (kaŜdemu
elementowi) usunąć jeden z węzłów w nim zawartych
element.parentNode.removeChild(element)
• element usunięty z dokumentu nie jest całkowicie
niszczony i moŜe zostać ponownie dołączony do
dokumentu
• document.createElement(nazwa) – tworzy
element, który nie jest połączony z dokumentem - trzeba
go dodać za pomocą appendChild lub insertBefore
• document.createTextNode("tekst") - tworzy
węzeł tekstowy; podobnie jak elementy, Ŝeby stał się
widoczny, trzeba go wstawić do dokumentu
13
Przykład 1 – JavaScript i DOM
<head>
<meta http-equiv="Content-type"
content="application/xhtml+xml;
charset=iso-8859-2" />
<title> DOM i JavaScript </title>
<script type="text/javascript"
src="js_dom.js"> </script>
</head>
<body onload="utworz_liste1()">
<p>Lista kolorów:</p>
<div id="lista_kol"></div>
</body>
15
Przykład 1 – JavaScript i DOM
Plik js1_dom.js
function utworz_liste2()
{// tworzy pierwszy węzeł tekstowy
oHello = document.createTextNode ("Lista kolorów:");
// tworzy element <ul>
oUl = document.createElement("ul")
// tworzy pierwszy element <ui> i dodaje do niego węzeł tekst.
oLiBlack = document.createElement("li");
oBlack = document.createTextNode("Czarny");
oLiBlack.appendChild(oBlack);
// tworzy drugi element <ui> i dodaje do niego węzeł tekstowy
oLiOrange = document.createElement("li");
oOrange = document.createTextNode("Pomarańczowy");
oLiOrange.appendChild(oOrange);
17
Tworzenie, dodawanie i przenoszenie
elementów - przykład
Np.
var p = document.createElement('p');
document.body.appendChild(p);
var h1 = document.createElement('h1');
document.body.insertBefore(p,document.body.fi
rstChild)
• Komentarz:
– element <p> podany jako argument metody appendChild(p)
dołączany jest jako dziecko na koniec elementu <body>, z
którego metoda została wywołana
– metoda insertBefore przyjmuje dwa argumenty — element
do wstawienia oraz element, przed którym ma wstawić nowy.
Jeśli jako drugi argument poda się null, to zadziała tak samo jak
appendChild
– wykonanie appendChild lub insertBefore na
elementach, które są juŜ w dokumencie przeniesie je w nowe
14
miejsce
Przykład 1 – JavaScript i DOM
Plik js_dom.js
function utworz_liste1()
{ // tworzenie kodu HTML
var lista;
lista = "<ul>" + "<li>Czarny</li>"
+ "<li>Pomarańczowy</li>"+ "<li>RóŜowy</li>"
+ "</ul>";
// pobranie odwołania do elementu <div> na stronie
myDiv = document.getElementById("lista_kol");
// dodanie zawartości do elementu <div>
myDiv.innerHTML = lista;
}
16
Przykład 1 – JavaScript i DOM
Plik js1_dom.js
// tworzy trzeci element <ui> i dodaje do niego węzeł tekstowy
oLiPink = document.createElement("li");
oPink = document.createTextNode("RóŜowy");
oLiPink.appendChild(oPink);
// dodaje elementy <ui> do elementu <ul> jako jego potomstwo
oUl.appendChild(oLiBlack);
oUl.appendChild(oLiOrange);
oUl.appendChild(oLiPink);
// pobiera odwołanie do elementu <div> na stronie
myDiv = document.getElementById("lista_kol");
// dodaje zawartość do elementu <div>
myDiv.appendChild(oHello);
myDiv.appendChild(oUl);
}
18
3
Przykład 2 – DOM, JS i CSS
Przykład 2 – csstest.js
<head>
<script type="text/javascript" src="csstest.js"></script>
<link href="styles.css" type="text/css" rel="stylesheet"/>
</head>
<body>
<table id="table">
<tr><th id="tableHead">Technologie internetowe</th> </tr>
<tr><td id="tableFirstLine"> XHTML/CSS </td> </tr>
<tr><td id="tableSecondLine">JavaScript </td> </tr>
</table> <br />
<input type="button" value="Ustaw Styl 1" onclick="setStyle1();" />
<input type="button" value="Ustaw Styl 2" onclick="setStyle2();" />
19
</body> </html>
// Zmiana stylu tabeli na styl 1
function setStyle1() {
// pobranie odwołań do elementów HTML
oTable = document.getElementById("table");
oTableHead = document.getElementById("tableHead");
oTableFirstLine = document.getElementById("tableFirstLine");
oTableSecondLine = document.getElementById("tableSecondLine");
// ustawienie styli
oTable.className = "Table1";
oTableHead.className = "TableHead1";
oTableFirstLine.className = "TableContent1";
oTableSecondLine.className = "TableContent1";
}
Przykład 2 – csstest.js
20
Przykład 2 – styles.css
.Table1 {
border: DarkGreen 1px solid;
background-color:LightGreen;}
.TableHead1 { font-family: Verdana, Arial; font-weight: bold;
font-size: 10pt; }
.TableContent1{ font-family: Verdana, Arial; font-size: 10pt; }
// Zmiana stylu tabeli na styl 2
function setStyle2() {
// pobranie odwołań do elementów HTML
oTable = document.getElementById("table");
oTableHead = document.getElementById("tableHead");
oTableFirstLine = document.getElementById("tableFirstLine");
oTableSecondLine = document.getElementById("tableSecondLine");
// ustawienie styli
oTable.className = "Table2";
oTableHead.className = "TableHead2";
oTableFirstLine.className = "TableContent2";
oTableSecondLine.className = "TableContent2";
}
.Table2 {
border: DarkBlue 1px solid;
background-color:LightBlue;}
.TableHead2 { font-family: Verdana, Arial; font-weight: bold;
font-size: 10pt; }
.TableContent2{ font-family: Verdana, Arial; font-size: 10pt; }
21
22
Przykład 3 - DOM, JS i CSS
Przykład 2 – wynik działania
23
...
<link rel="stylesheet" href="p3.css" type="text/css" />
<script type="text/javascript">
<!-- Ukrycie JavaScriptu
function pokaz()
{ document.getElementById("wr1").style.visibility = "visible"; }
function ukryj()
{ document.getElementById("wr1").style.visibility = "hidden";}
//Koniec kodu JavaScript -->
</script></head>
<body onload="start();">
<div id="wr1" ></div>
<div> <input type="radio" name="rd1" onclick="pokaz();"
checked="checked" />PokaŜ
<input type="radio" name="rd1" onclick="ukryj();" />Ukryj</div>
</body></html>
24
4
Przykład 3 – p3.css
Uproszczona struktura DOM
#wr1 {position:absolute; left:100px; top:50px; width:100px;
height:100px; background-color:yellow; visibility:visible;}
http://republika.onet.pl/13965,15324,1,05,kursy.html#15324
25
26
Obiekt window
Obiekty stron WWW
Obiekty kaŜdej strony:
• window
bieŜące okno przeglądarki
• document
bieŜący dokument HTML
• history
lista historyczna przeglądarki
• location
bieŜący adres URL
• navigator informacje o przeglądarce
27
Składowe obiektu window dla
danej przegladarki
• Reprezentuje widoczne okno przeglądarki
• Jest tworzony automatycznie w chwili otwarcia okna
przeglądarki
• Stoi na czele hierarchii obiektów JavaScript
• W odwołaniu do właściwości i metod okna bieŜącego nazwa window niekonieczna, np.:
alert("Uwaga!");
window.alert("Uwaga!");
• Skrypt wyświetli składowe window dla danej przeglądarki:
<script type="text/javascript">
for(index in window)
{ document.write(index +" = " +
window[index] + "<br />");
}
</script>
28
Metody obiektu window
29
• alert("komunikat")
wyświetla komunikat w okienku dialogowym
z przyciskiem OK
• zmienna=window.prompt("komunikat",
"wartość_domyślna")
wyświetla okienko dialogowe prompt o treści
komunikat i zwracająca dane wprowadzone przez
uŜytkownika
• confirm("komunikat")
wyświetla komunikat w okienku dialogowym
z przyciskiem OK i Cancel; metoda zwraca wartość
true, gdy uŜytkownik wybierze przycisk OK i false w
przeciwnym razie
• Status - wyświetla komunikat na pasku stanu 30
5
Własności otwieranego okna
Metody obiektu window
• open("URL", "nazwa okna", cecha1,
cecha2,...) - otwiera nowe okno przeglądarki z podanymi
cechami, zakrywające poprzednie, np.
window.open("URL_dokumentu",
"nazwa_okna","cecha1,cecha2,...");
• otwarcie nowego, pustego okna
open("about:blank") lub open("")
• opener - nazwa okna wywołującego aktualne okno
• zmiana właściwości opener – utrata powiązań z oknem
wywołującym; przypisanie opener=null - zamknięcie
okien potomnych, np.
window.opener.document.bgColor="blue";
• closed - zmienna logiczna: okno otwarte (false),
zamknięte (true)
• close() - likwiduje okno, w którym metoda występuje lub
31
na rzecz którego jest wywołana np. ok1.close()
pasek narzędzi
toolbar=yes/no
lokalizator URL
location=yes/no
directories=yes/no pasek katalogów
pasek stanu
status=yes/no
pasek menu
menubar=yes/no
scrollbars=yes/no paski przewijania
width=n [pikseli] szerokość okna
height=n [pikseli] wysokość okna
resizable=yes/no czy uŜytkownik moŜe zmieniać
rozmiar okna
• copyhistory=yes/no czy okno dziedziczy historię sesji
okna nadrzędnego
• dependent=yes/no czy ma być zamykane z oknem
nadrzędnym (v.1.2)
•
•
•
•
•
•
•
•
•
32
Przykład
Tworzenie okna
Zasady określania cech okna
• Brak wyszczególnienia cech wymagających włączenia automatyczne włączenie wszystkich
• Wyszczególnienie choć jednej cechy - automatyczne
wyłączenie pozostałych
• Podanie wymiarów okna - równoznaczne
określeniu resizable=no
• Np.:
open("hello.html","noweOkno","toolbar");
open("","okno1","toolbar,menubar=yes");
<html><head>
<script type="text/javascript">
function noweokno()
{ ok1=window.open('muszla.gif','okno',
'width=100,height=200'); }
</script>
</head>
<body>
<h1>Wspomnienie lata:</h1>
<a href="noweokno()">Morze</a>
</body></html>
33
34
Obiekt document
• Tworzony automatycznie przez znacznik <body>
• Zawiera
– wszystkie informacje na temat aktualnie
wyświetlanego dokumentu HTML
– wszystkie elementy składowe dokumentu
• Elementy składowe - w tablicach, które zawierają
wszystkie zdefiniowane w obiekcie znaczniki
danego typu; indeksy pól tablic - nadawane
według kolejności definiowania danego rodzaju
znaczników, np. - określenie liczby formularzy w
oknie: forms.length
35
Wybrane własności obiektu
document
•
•
•
•
•
•
•
•
•
•
•
•
linkcolor
alinkColor
bgcolor
fgcolor
title
styleSheets
url
anchors
links
images
frames
forms
definiuje kolor odnośnika
kolor aktywnego odnośnika
kolor tła dokument
kolor tekstu dokumentu
tytuł strony
zawiera style zdefiniowane w dokumencie
adres URL dokumentu
tablica obiektów typu anchor
tablica obiektów typu link
tablica obiektów typu image
tablica obiektów typu frame
36
tablica obiektów typu form
6
Metody i zdarzenia dla obiektu
document
• Metody:
– document.clear() - czyszczenie bieŜącego okna
– document.write("tekst") - wyświetla tekst w
oknie np.
document.write("<h1>Dziękujemy</h1>")
– document.writeln("tekst")
• Zdarzenia:
– onLoad - wyzwala skrypty, które powinny zostać
uruchomione bezpośrednio po zakończeniu ładowania
dokumentu HTML do przeglądarki
– onUnload - wyzwala skrypty, które powinny zostać
uruchomione bezpośrednio po wyjściu z dokumentu
37
HTML
Dokument
HTML
images[0]
images[1]
links[0]
elements[0]
elements[1]
forms[0]
elements[2]
elements[3]
links[1]
39
Przykład – właściwości obiektu
document
ZaleŜności hierarchiczne tablic
• Hierarchia obiektów strony WWW
document
links[0]
images[0]
forms[0] links[1]
elements[0] elements[1] elements[2] elements[3]
• Odwołanie do wartości pola formularza
document.forms[0].elements[1].value
38
Przykład – właściwości obiektu
document
<script type="text/javascript">
document.write("Kolor tła dokumentu: " + document.bgColor);
document.write("<br />Kolor tekstu dokumentu: " + document.fgColor);
document.write("<br />Tytuł dokumentu: " + document.title);
document.write("<br />Data ostatniej modyfikacji dokumentu: " +
document.lastModified);
document.write("<br />Liczba obrazów w dokumencie: " +
document.images.length);
document.write("<br />Liczba odnośników w dokumencie: " +
document.links.length);
document.write("<br />Liczba formularzy w dokumencie: " +
document.forms.length);
</script>
40
Obiekt history
• przechowuje historię odwiedzin stron dokonanych
przez uŜytkownika podczas danej sesji
przeglądarki
• nie jest częścią specyfikacji W3C, ale jest
obsługiwany przez praktycznie wszystkie
popularne przeglądarki
• jego właściwości i metody pozwalają na
przemieszczanie się pomiędzy juŜ odwiedzonymi
stronami
• adresy URL - przechowywane w formie
łańcuchów tekstowych
41
42
7
Właściwości obiektu history
Metody obiektu history
• back() - wczytuje poprzedni dokument
• forward() - wczytuje następny dokument
• go(param) - wczytuje dokument wskazywany
przez argument param; jeŜeli argument jest
wartością całkowitą, oznacza ona pozycję
(względem bieŜącego dokumentu) na liście
przechowywanej przez obiekt history, jeŜeli zaś
parametrem jest ciąg znaków, jest on traktowany
jako URL dokumentu znajdującego się na liście
obiektu history, np.:
window.history.go(-1); cofnięcie się o
jedną pozycję wstecz - to samo realizuje:
window.history.back();
• current - zawiera URL aktualnego
dokumentu
• length - zawiera liczbę elementów
przechowywanych przez obiekt history
• next - zawiera URL kolejnego elementu
obiektu history
• previous - zawiera URL poprzedniego
elementu obiektu history.
43
44
Obiekt location
Przykład - obiekt history
• zawiera informacje dotyczące adresu URL aktualnie
załadowanego dokumentu oraz metody pozwalające na
manipulację tym adresem
• pełna postać adresu URL
protocol://host:port/pathname#hash?search
• Własności:
hash - część adresu URL znajdująca się za znakiem #
host - część URL zawierająca nazwę hosta oraz numer portu
hostname - część URL zawierająca nazwę hosta
href - pełny adres URL
pathname - część URL ze ścieŜkę dostępu i nazwą pliku
port - część adresu URL zawierająca numer portu
protocol - część URL z nazwą protokołu (np. http, ftp)
search - część URL znajdująca się za znakiem zapytania
<html> <body>
<!-- ewentualna zawartość strony -->
<form ...>
<p>
<input type="button" value="wstecz" onclick="history.back();"/>
<input type="button" value="dalej" onclick="history.forward();"/>
</p></form>
</body>
</html>
45
Przykład - właściwości location
<script
type="text/javascript">
for(i in location)
{ document.write(i + " " +
location[i] + "<br/>");
}
</script>
46
Obiekt navigator
• przechowuje informacje dotyczące
przeglądarki, jej nazwy, wersji, języka,
systemu operacyjnego, na którym została
uruchomiona itp.
• nie jest częścią specyfikacji W3C, ale
większość produktów obsługuje pewien
standardowy zestaw właściwości
47
48
8
Własności obiektu navigator
•
•
•
•
•
•
•
•
appCodeName - nazwa kodowa przeglądarki.
appName - oficjalna nazwa przeglądarki
appVersion - wersja kodowa przeglądarki.
cookieEnabled - określa, czy w przeglądarce jest
włączona obsługa cookies (true/false)
language - kod języka przeglądarki
mimetypes - tablica zawierająca listę typów mime
obsługiwanych przez przeglądarkę
platform - określa platformę systemową, dla której
jest przeznaczona przeglądarka
userAgent - ciąg wysyłany przez przeglądarkę do
serwera jako nagłówek HTTP_USER_AGENT. Z
49
reguły pozwala na dokładną identyfikację przeglądarki
Przykład właściwości
navigator
<script type=
"text/javascript">
for(i in navigator)
{ document.write( i
+ " " + navigator[i]
+ "<br/>");
}
</script>
50
Przykład - informacja
o przeglądarce
<script type="text/javascript">
ff=navigator['userAgent'];
//ff=navigator.userAgent;
document.write("<p>Korzystasz z przeglądarki: " +ff + "</p>");
</script>
51
9

Podobne dokumenty