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
true
lubfalse
. - 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); }