DocumentFragment: phương thức moveBefore()
Khả dụng hạn chế
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Phương thức moveBefore() của giao diện DocumentFragment di chuyển một Node đã cho vào bên trong DocumentFragment gọi phương thức như một phần tử con trực tiếp, trước một nút tham chiếu đã cho.
Cú pháp
moveBefore(movedNode, referenceNode)
Tham số
movedNode-
Một
Nodeđại diện cho nút cần di chuyển. Lưu ý rằng đây phải là một nútElementhoặcCharacterData. referenceNode-
Một
NodemàmovedNodesẽ được di chuyển đến trước đó, hoặcnull. Nếu giá trị lànull,movedNodeđược chèn vào cuối danh sách các nút con củaDocumentFragmentgọi phương thức.
Giá trị trả về
Không có (undefined).
Ngoại lệ
HierarchyRequestErrorTypeError-
Được ném trong bất kỳ tình huống nào sau đây:
movedNodeđã chỉ định đã được thêm vào DOM và bạn đang cố di chuyển nó vào bên trong mộtDocumentFragment.- Bạn đang cố di chuyển
movedNodegiữa hai phân đoạn tài liệu khác nhau. movedNodeđã chỉ định không phải là một nútElementhoặcCharacterData.
NotFoundErrorTypeError-
referenceNodeđã chỉ định không phải là một nút con củaDocumentFragmentmà bạn đang gọimoveBefore(), nghĩa là phân đoạn mà bạn đang cố di chuyểnmovedNodevào. TypeErrorTypeError-
Đối số thứ hai không được cung cấp.
Mô tả
Phương thức moveBefore() di chuyển một nút đã cho đến một vị trí mới trong DocumentFragment. Nó cung cấp chức năng tương tự như phương thức Node.insertBefore(), ngoại trừ việc nó không xóa rồi chèn lại nút. Điều này có nghĩa là trạng thái của nút (sẽ bị đặt lại nếu di chuyển nó bằng insertBefore() và các cơ chế tương tự) được bảo toàn sau khi di chuyển. Điều này bao gồm:
- Trạng thái Animation và transition.
- Trạng thái tải của
<iframe>. - Các trạng thái tương tác (ví dụ:
:focusvà:active). - Trạng thái phần tử Fullscreen.
- Trạng thái mở/đóng của popovers.
- Trạng thái modal của các phần tử
<dialog>(các hộp thoại modal sẽ không bị đóng).
Trạng thái phát của các phần tử <video> và <audio> không được bao gồm trong danh sách trên, vì các phần tử này giữ nguyên trạng thái khi bị xóa và chèn lại, bất kể cơ chế được sử dụng.
Khi quan sát các thay đổi của DOM bằng MutationObserver, các nút được di chuyển bằng moveBefore() sẽ được ghi lại với một nút bị xóa và một nút được thêm.
Các ràng buộc của moveBefore()
Có một số ràng buộc cần lưu ý khi sử dụng moveBefore():
- Nó chỉ hoạt động khi di chuyển một nút trong cùng một phân đoạn tài liệu.
- Nó sẽ không hoạt động nếu bạn cố di chuyển một nút đã được thêm vào DOM vào bên trong một
DocumentFragment.
Trong những trường hợp như vậy, moveBefore() sẽ thất bại với ngoại lệ HierarchyRequestError. Nếu các ràng buộc trên là yêu cầu cho trường hợp sử dụng cụ thể của bạn, bạn nên sử dụng Node.insertBefore() thay thế, hoặc sử dụng try...catch để xử lý các lỗi phát sinh từ những trường hợp như vậy.
Ví dụ
>Sử dụng moveBefore() cơ bản
Trong bản minh họa này, chúng ta minh họa cách sử dụng cơ bản của moveBefore().
HTML
HTML có ba phần tử <button> và một phần tử <article>. Chúng ta sẽ sử dụng các nút để kiểm soát việc chèn các thực thể DocumentFragment vào <article> và làm trống nó.
<button id="insert1">Insert fragment</button>
<button id="insert2">Insert modified fragment</button>
<button id="clear">Clear</button>
<article id="wrapper"></article>
CSS
Chúng ta cung cấp một số kiểu dáng cơ bản cho giao diện và cảm giác cũng như khoảng cách của các phần tử sau này sẽ được chèn vào trang dưới dạng phần tử con của các DocumentFragment được tạo bởi JavaScript.
#section1,
#section2,
#mover {
display: inline-block;
width: 200px;
height: 30px;
border: 5px solid rgb(0 0 0 / 0.25);
margin-top: 10px;
}
#section1,
#section2 {
background-color: hotpink;
}
#mover {
background-color: orange;
}
JavaScript
Trong tập lệnh của chúng ta, chúng ta định nghĩa một hàm createFragment(), hàm này tạo một DocumentFragment chứa một phần tử <div> và hai phần tử <section> làm phần tử con trực tiếp.
Sau đó, chúng ta gắn một trình lắng nghe sự kiện nhấp chuột vào mỗi <button> thông qua addEventListener():
- Nút đầu tiên nối
DocumentFragmentvào phần tử<article>#wrapper, không sửa đổi. - Nút thứ hai nối
DocumentFragmentvào phần tử<article>#wrapper, nhưng trước tiên sử dụngmoveBefore()để di chuyển<div>thành phần tử con thứ hai củaDocumentFragmentthay vì thứ nhất. - Nút thứ ba làm trống phần tử
<article>#wrapperbằng cách sử dụnginnerHTML.
const wrapper = document.getElementById("wrapper");
const insertBtn1 = document.getElementById("insert1");
const insertBtn2 = document.getElementById("insert2");
const clearBtn = document.getElementById("clear");
function createFragment() {
const fragment = new DocumentFragment();
const divElem = document.createElement("div");
const section1 = document.createElement("section");
const section2 = document.createElement("section");
divElem.id = "mover";
section1.id = "section1";
section2.id = "section2";
fragment.appendChild(divElem);
fragment.appendChild(section1);
fragment.appendChild(section2);
return fragment;
}
insertBtn1.addEventListener("click", () => {
const fragment = createFragment();
wrapper.appendChild(fragment);
});
insertBtn2.addEventListener("click", () => {
const fragment = createFragment();
fragment.moveBefore(
fragment.querySelector("#mover"),
fragment.querySelector("#section2"),
);
wrapper.appendChild(fragment);
});
clearBtn.addEventListener("click", () => {
wrapper.innerHTML = "";
});
Kết quả
Ví dụ được hiển thị trông như thế này:
Hãy thử nhấp vào hai nút đầu tiên vài lần và lưu ý cách cấu trúc DocumentFragment được sửa đổi bởi nút thứ hai.
Đặc điểm kỹ thuật
| Thông số kỹ thuật |
|---|
| DOM> # dom-parentnode-movebefore> |