পার্সিস্টেন্ট টপ লেয়ার UI

ওয়েব ফিচার: moveBefore()

appendChild() বা insertBefore()-এর মতো চিরাচরিত পদ্ধতি ব্যবহার করে DOM-এ খোলা <dialog>, popover বা ফুলস্ক্রিন এলিমেন্ট সরানোর সময়, ব্রাউজার অন্তর্নিহিতভাবে 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();
  }
}