Range#
Range.setEndBefore()#
Metoda setEndBefore()
ustawia koniec w danym zakresie (czyli jego węzeł końcowy i przesunięcie końcowe) przed przekazanym węzłem.
Opis działania#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
range.setEndBefore(node);
gdzie poszczególne człony oznaczają:
- range - zakres będący obiektem kontekstu.
- node - referencja do węzła końcowego.
Algorytm wywołania metody setEndBefore(node)
nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:
- Niech parent będzie rodzicem w node.
- Jeśli parent ma wartość
null
, to zrzuć wyjątek"InvalidNodeTypeError"
. - Ustaw koniec w obiekcie kontekstu na punkt graniczny (parent, indeks w node).
Do metody setEndBefore()
nie można przekazywać węzłów, których rodzicem jest węzeł typu DocumentType
lub wartość null
, bo zrzucony zostanie błąd. Węzłem końcowym w zakresie zawsze zostanie rodzic przekazanego węzła natomiast przesunięcie końcowe zostanie dopasowane względem jego indeksu.
Punkty graniczne w zakresach można ustawiać na wiele różnych sposobów.
Prosty przykład:
<script>
// Tworzymy nowy zakres
var range = document.createRange();
// Zmieniamy początek i koniec zakresu
range.setStart(document, 0);
range.setEnd(document.documentElement, 1);
document.write(range.startContainer); // [object HTMLDocument]
document.write("<br>");
document.write(range.startOffset); // 0
document.write("<br>");
document.write(range.endContainer); // [object HTMLHtmlElement]
document.write("<br>");
document.write(range.endOffset); // 1
document.write("<br><br>");
// Zmieniamy koniec zakresu przed węzeł HTML
range.setEndAfter(document.documentElement);
document.write(range.startContainer); // [object HTMLDocument]
document.write("<br>");
document.write(range.startOffset); // 0
document.write("<br>");
document.write(range.endContainer); // [object HTMLDocument]
document.write("<br>");
document.write(range.endOffset); // 1
document.write("<br><br>");
try{ // Ustawiamy koniec zakresu przed węzeł Document
range.setEndBefore(document);
}
catch(e){
document.write("Przekazanie do metody setEndBefore() węzła bez rodzica 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>
Kolejny prosty przykład:
<!DOCTYPE html>
<html>
<head>
<script>
function deleteInternalRows(){
var info = document.getElementById("info");
var table = document.getElementById("table");
// Kiedy możliwe jest usunięcie wewnętrznych wierszy
if (table.rows.length > 1){
var firstRow = table.rows[0];
var lastRow = table.rows[table.rows.length - 1];
var range = document.createRange();
range.setStartAfter(firstRow);
range.setEndBefore(lastRow);
var result = "range.startContainer: " + range.startContainer
+ "<br>" + "range.startOffset: " + range.startOffset
+ "<br><br>" + "range.endContainer: " + range.endContainer
+ "<br>" + "range.endOffset: " + range.endOffset
+ "<br><br>" + "range.collapsed: " + range.collapsed;
info.innerHTML = result;
range.deleteContents(); // usuwamy aktualną zawartość zakresu
}
}
</script>
</head>
<body>
<table id="table" border="1">
<tr><td>Pierwszy wiersz</td></tr>
<tr><td>Drugi wiersz</td></tr>
<tr><td>Trzeci wiersz</td></tr>
<tr><td>Czwarty wiersz</td></tr>
</table>
<p>Kliknij przycisk by usunąć wewnętrzne wiersze w tabeli za pomocą zakresu.</p>
<input type="button" value="deleteInternalRows()" onclick="deleteInternalRows()">
<p style="color: blue;">Szczegółowe informacje dla zakresu:</p>
<p id="info"></p>
</body>
</html>
Składnia Web IDL#
interface Range { void setEndBefore(Node node); }