DOMTokenList#
DOMTokenList.toggle()#
Metoda toggle()
przełącza przekazane słowo w uporządkowanym zestawie słów skojarzonym z danym zestawem słów DOM. Pojęcie "przełączania" oznacza usunięcie słowa z uporządkowanego zestawu słów (jeśli występuje), lub dodanie słowa do uporządkowanego zestawu słów (jeśli nie występuje). Metoda zwraca także boolowską wartość true
jeśli po wykonaniu wszystkich czynności przekazane słowo znajduje się w uporządkowanym zestawie słów, w przeciwnym razie zwrócona zostanie wartość false
.
Opis działania#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
var toggled = domTokenList.toggle(token [, force]);
gdzie poszczególne człony oznaczają:
- toggled - boolowskie
true
kiedytoken
jest aktualnie obecny, w przeciwnym raziefalse
. - domTokenList - zestaw słów DOM będący obiektem kontekstu.
- token - łańcuch znakowy reprezentujący słowo, które będzie dodawane lub usuwane z uporządkowanego zestawu słów. Nie może być pusty ani zawierać znaków spacji. Wielkość znaków ma znaczenie.
- force - opcjonalny boolowski parametr determinujący akcję. Jeśli nie będzie podany następuje przełączanie. Jeśli jest wartością
true
dodaje token, analogicznie jak metodaDOMTokenList.add()
. Jeśli jest wartościąfalse
usuwa token, analogicznie jak metodaDOMTokenList.remove()
.
Algorytm wywołania metody toggle(token, force)
nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:
- Jeśli token jest pustym łańcuchem znakowym, to zrzuć wyjątek
"SyntaxError"
. - Jeśli token zawiera jakiekolwiek białe znaki ASCII, to zrzuć wyjątek
"InvalidCharacterError"
. Jeśli token znajduje się w uporządkowanym zestawie słów skojarzonym z obiektem kontekstu, to wykonają poniższe podkroki:
- Jeśli force nie został przekazany lub ma boolowską wartość
false
, to usuń token z uporządkowanego zestawu słów skojarzonego z obiektem kontekstu, uruchom kroki aktualizacji i zwróć boolowską wartośćfalse
. - W przeciwnym razie zwróć boolowską wartość
true
.
- Jeśli force nie został przekazany lub ma boolowską wartość
W przeciwnym razie wykonaj poniższe podkroki:
- Jeśli force został przekazany i ma boolowską wartość
false
, to zwróć boolowską wartośćfalse
. - W przeciwnym razie dołącz token do uporządkowanego zestawu słów skojarzonego z obiektem kontekstu, uruchom kroki aktualizacji i zwróć boolowską wartość
true
.
- Jeśli force został przekazany i ma boolowską wartość
Wywołanie metody toggle()
będzie automatycznie aktualizowało powiązany z zestawem atrybut, przez co jego oryginalna zawartość (łańcuch znakowy) może ulec zmianie.
Przełączanie stanu konkretnej klasy w elementach (X)HTML to bardzo często przeprowadzany zabieg. Zamiast kombinować na tekstowej wartości z właściwości Element.className
, ewentualnie używać dwóch poniższych metod usuwających/dodających klasę, zdecydowanie wygodniej zastosować jedynie metodę toggle()
. Pierwotnie czynność taka wprowadzona została w wielu popularnych bibliotekach dla DOM i JavaScriptu (np. jQuery).
Metoda toggle()
jest wygodniejszą postacią połączonych metod DOMTokenList.add()
i DOMTokenList.remove()
, aczkolwiek, w zależności od drugiego argumentu, pozwala zasymulować te metody. Jedyna zasadnicza różnica jest taka, że do toggle()
można przekazywać tylko jedno słowo.
Prosty przykład:
<script>
function showTokens(set){
return Array.prototype.slice.call(set).join(" ");
}
var html = document.documentElement; // referencja do elementu html
var toogled;
document.write(html.classList.constructor); // function DOMTokenList() { [native code] }
document.write("<br>");
document.write(html.classList.length); // 0
document.write("<br><br>");
html.className = "Test1 Test2 Test3"; // ustawiamy wartość atrybutu class
document.write(showTokens(html.classList)); // Test1 Test2 Test3
document.write("<br>");
document.write(html.classList.length); // 3
document.write("<br><br>");
toogled = html.classList.toggle("Test2"); // przełączamy słowo Test2
document.write(showTokens(html.classList)); // Test1 Test3
document.write("<br>");
document.write(html.classList.length); // 2
document.write("<br>");
document.write(toogled); // false
document.write("<br><br>");
toogled = html.classList.toggle("Test2"); // przełączamy słowo Test2
document.write(showTokens(html.classList)); // Test1 Test3 Test2
document.write("<br>");
document.write(html.classList.length); // 3
document.write("<br>");
document.write(toogled); // true
document.write("<br><br>");
toogled = html.classList.toggle("Test4", false); // usuwamy słowo Test4
document.write(showTokens(html.classList)); // Test1 Test3 Test2, w IE Test1 Test3 Test2 Test 4 - błąd
document.write("<br>");
document.write(html.classList.length); // 3, w IE 4 - błąd
document.write("<br>");
document.write(toogled); // false, w IE true - błąd
document.write("<br><br>");
try{ // Przełączamy pusty łańcuch znakowy w uporządkowanym zestawie słów
html.classList.toggle("");
}
catch(e){
document.write("Przekazanie do metody toggle() pustego łańcuch znakowego zrzuca błąd:" + "<br>");
document.write(e); // opis zależny od przeglądarki
document.write("<br>");
document.write(e.constructor); // function DOMException() { [native code] }
}
</script>
Na chwilę obecną jedynie przeglądarki Firefox i Chrome obsługują metodę toggle()
zgodnie z wymaganiami specyfikacji DOM4. Pozostałe programy nie zwracają uwagi na drugi opcjonalny argument i działają tak, jakby go wcale nie było. Szczerze mówiąc to w Chrome istnieje pewien subtelny problem z prawidłową obsługą opcjonalnej wartości undefined
przekazywanej jako drugi argument, ale dotyczy on wszystkich podobnych przypadków i wynika z błędnej implementacji Web IDL (DOM - Bug 64).
Metoda toggle()
pojawia się dopiero w specyfikacji DOM4.
Składnia Web IDL#
interface DOMTokenList { boolean toggle(DOMString token, optional boolean force); }