Range#
Range.intersectsNode()#
Metoda intersectsNode() zwraca boolowską wartość true jeśli przekazany węzeł krzyżuje się z danym zakresem, 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 is_intersects = range.intersectsNode(node);gdzie poszczególne człony oznaczają:
- is_intersects - boolowskie
truelubfalse. - range - zakres będący obiektem kontekstu.
- node - referencja do porównywanego węzła.
Algorytm wywołania metody intersectsNode(node) nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:
- Jeśli korzeń w node jest inny od korzenia w obiekcie kontekstu, to zwróć boolowską wartość
false. - Niech parent będzie rodzicem w node.
- Jeśli parent ma wartość
null, to zwróć boolowską wartośćtrue. - Niech offset będzie indeksem w node.
- Jeśli (parent, offset) jest przed końcem w obiekcie kontekstu i (parent, offset +
1) jest za początkiem w obiekcie kontekstu, to zwróć boolowską wartośćtrue. - Zwróć boolowską wartość
false.
W uproszczeniu można powiedzieć, że węzeł przekazany do metody intersectsNode() krzyżuje się z danym zakresem kiedy jest w nim zawarty lub częściowo zawarty, lub kiedy jest przodkiem obejmującym dla jego węzła początkowego i węzła końcowego.
Prosty przykład:
<script>
var newP = document.createElement("p");
// Tworzymy nowy zakres
var range = document.createRange();
document.write(range.intersectsNode(document.firstChild)); // false, w Chrome true (błąd)
document.write("<br>");
document.write(range.intersectsNode(newP)); // false
document.write("<br>");
document.write(range.intersectsNode(document)); // true, w Chrome zrzucany jest wyjątek (błąd)
document.write("<br><br>");
// Zmieniamy koniec zakresu na węzeł HEAD
range.setEnd(document.firstChild.firstChild, 0);
document.write(range.intersectsNode(document)); // true
document.write("<br>");
document.write(range.intersectsNode(document.firstChild)); // true
document.write("<br>");
document.write(range.intersectsNode(document.firstChild.firstChild)); // true
document.write("<br>");
document.write(range.intersectsNode(document.firstChild.lastChild.lastChild)); // false
document.write("<br>");
document.write(range.intersectsNode(document.firstChild.lastChild)); // false
document.write("<br>");
document.write(range.intersectsNode(newP)); // false
</script>Na chwilę obecną jedynie przeglądarki Firefox i Opera (Presto) obsługują metodę intersectsNode() zgodnie z wymaganiami specyfikacji DOM4. W Chrome zwracane są nieprawidłowe wartości i w niektórych sytuacjach niepotrzebnie zrzucane są błędy, co widać w powyższym przykładzie, natomiast IE11 kompletnie nie wspiera tej metody.
Metoda intersectsNode() pojawia się dopiero w specyfikacji DOM4.
Składnia Web IDL#
interface Range { boolean intersectsNode(Node node); }