Selection: phương thức setBaseAndExtent()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2017.
Phương thức setBaseAndExtent() của giao diện Selection đặt vùng chọn thành một range bao gồm toàn bộ hoặc một phần của hai nút DOM đã chỉ định, cùng với mọi nội dung nằm giữa chúng.
Anchor và focus node có thể nằm trong một shadow tree, nếu trình duyệt hỗ trợ.
Cú pháp
setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset)
Tham số
anchorNode-
Nút ở đầu vùng chọn.
anchorOffset-
Số lượng nút con tính từ đầu anchor node sẽ bị loại khỏi vùng chọn. Ví dụ, nếu giá trị là 0 thì toàn bộ nút được bao gồm. Nếu giá trị là 1, toàn bộ nút trừ nút con đầu tiên sẽ được bao gồm. Và cứ tiếp tục như vậy.
Nếu
anchorNodelà nútText, độ lệch sẽ chỉ số lượng ký tự từ đầuNode.textContentsẽ bị loại khỏi vùng chọn. focusNode-
Nút ở cuối vùng chọn.
focusOffset-
Số lượng nút con tính từ đầu focus node sẽ được bao gồm trong vùng chọn. Ví dụ, nếu giá trị là 0 thì toàn bộ nút bị loại khỏi vùng chọn. Nếu giá trị là 1, nút con đầu tiên sẽ được bao gồm. Và cứ tiếp tục như vậy.
Nếu
focusNodelà nútText, độ lệch sẽ chỉ số lượng ký tự từ đầuNode.textContentsẽ được bao gồm trong vùng chọn.
Note: Nếu vị trí focus xuất hiện trước vị trí anchor trong tài liệu, hướng của vùng chọn sẽ bị đảo ngược — caret được đặt ở đầu văn bản thay vì cuối, điều này quan trọng với mọi lệnh bàn phím có thể theo sau. Ví dụ, Shift + ➡︎ sẽ làm vùng chọn thu hẹp từ đầu thay vì mở rộng ở cuối.
Giá trị trả về
Không có (undefined).
Ngoại lệ
IndexSizeErrorDOMException-
Được ném ra nếu
anchorOffsetlớn hơn số lượng nút con bên tronganchorNode, hoặc nếufocusOffsetlớn hơn số lượng nút con bên trongfocusNode.
Ví dụ
Trong ví dụ này, chúng ta có hai đoạn văn chứa các span, mỗi span chứa một từ.
Đoạn đầu tiên được đặt làm anchorNode và đoạn thứ hai được đặt làm focusNode.
Chúng ta cũng có một đoạn bổ sung nằm giữa hai nút.
Tiếp theo, chúng ta có hai ô nhập form cho phép đặt anchorOffset và focusOffset — cả hai đều có giá trị mặc định là 0.
Chúng ta cũng có một nút, khi được bấm sẽ gọi một hàm chạy phương thức setBaseAndExtent() với các độ lệch đã chỉ định, rồi sao chép vùng chọn vào đoạn đầu ra ở cuối HTML.
<h1>setBaseAndExtent example</h1>
<div>
<p class="one">
<span>Fish</span><span>Dog</span><span>Cat</span><span>Bird</span>
</p>
<p>MIDDLE</p>
<p class="two">
<span>Car</span><span>Bike</span><span>Boat</span><span>Plane</span>
</p>
</div>
<div>
<p>
<label for="aOffset">Anchor offset</label>
<input id="aOffset" name="aOffset" type="number" value="0" />
</p>
<p>
<label for="fOffset">Focus offset</label>
<input id="fOffset" name="fOffset" type="number" value="0" />
</p>
<p><button>Capture selection</button></p>
</div>
<p><strong>Output</strong>: <span class="output"></span></p>
Note:
Cố ý không có whitespace giữa các thẻ mở <p class="one"> và <p class="two"> cùng các thẻ <span> theo sau chúng — để tránh sự xuất hiện của text node làm ảnh hưởng số lượng nút con mong đợi. (Dù các text node đó chỉ chứa whitespace, chúng vẫn là các nút con bổ sung; xem thêm từ Node.firstChild example).
Mã JavaScript trông như sau:
const one = document.querySelector(".one");
const two = document.querySelector(".two");
const aOffset = document.getElementById("aOffset");
const fOffset = document.getElementById("fOffset");
const button = document.querySelector("button");
const output = document.querySelector(".output");
let selection;
button.onclick = () => {
try {
selection = document.getSelection();
selection.setBaseAndExtent(one, aOffset.value, two, fOffset.value);
const text = selection.toString();
output.textContent = text;
} catch (e) {
output.textContent = e.message;
}
};
Hãy thử ví dụ trực tiếp bên dưới, đặt các giá trị độ lệch khác nhau để xem điều này ảnh hưởng đến vùng chọn như thế nào.
Note: Bạn có thể tìm thấy ví dụ này trên GitHub (xem trực tiếp tại đây).
Thông số kỹ thuật
| Specification |
|---|
| Selection API> # dom-selection-setbaseandextent> |