هنگام جابهجایی عنصر باز <dialog>، popover، یا تمامصفحه در DOM بااستفاده از روشهای سنتی مانند appendChild() یا insertBefore()، مرورگر بهطور ضمنی عنصر را از DOM حذف میکند و دوباره آن را درج میکند. این حذف وضعیت را بازنشانی میکند و باعث میشود پنجرههای باز، پاپاورها، و عناصر تمامصفحه بهطور ناگهانی بسته شوند.
برای تغییر والد عناصر لایه بالایی بدون قطع کردن تجربه کاربری یا بستن آنها، از moveBefore() API اتمی استفاده کنید.
درحال بازوالدیندهی عناصر لایه بالایی باز
moveBefore() دو آرگومان میگیرد: گرهای که باید منتقل شود، و گره مرجعی که باید قبلاز آن درج شود (یا null برای افزودن به انتهای والد جدید).
const newParent = document.getElementById('new-container');
const dialogElement = document.getElementById('my-dialog');
// MANDATORY: Use moveBefore to ensure the <dialog> or popover stays open.
// Passing null appends it to the end of newParent.
newParent.moveBefore(dialogElement, null);
راهبردهای جایگزین
ازآنجاییکه moveBefore() یک ارتقای پیشرو است، باید قبلاز فراخوانی آن از تشخیص ویژگی استفاده کنید. برای مرورگرهای قدیمیتر، باید به بازوالدینی سنتی برگردید.
اجباری: برای عناصر <dialog> در مرورگرهای پشتیبانینشده، حرکت سنتی کادر گفتگو را میبندد. اگر لازم است باز بماند، باید پساز انتقال آن را بهطور دستی دوباره باز کنید.
const targetParent = document.getElementById('target-container');
const popoverOrDialog = document.getElementById('my-top-layer-element');
// Check if moveBefore is supported
if ('moveBefore' in Element.prototype) {
targetParent.moveBefore(popoverOrDialog, null);
} else {
// Fallback: traditional move.
// Note: This WILL close <dialog>, popover, and fullscreen elements.
const wasOpen = popoverOrDialog.hasAttribute('open') || popoverOrDialog.matches(':popover-open');
targetParent.insertBefore(popoverOrDialog, null);
// Manually restore state if possible
if (wasOpen && typeof popoverOrDialog.showModal === 'function') {
popoverOrDialog.showModal();
} else if (wasOpen && typeof popoverOrDialog.showPopover === 'function') {
popoverOrDialog.showPopover();
}
}