外部圖片透過 ZTree 拖拽放入 OpenLayers 地圖生成圖標。滑鼠未進入地圖時拖拽正常,一進入地圖區域即被攔截、卡住、難以移動。
div 後,瀏覽器事件流先到達地圖容器,OpenLayers 的事件監聽器 攔截並消費了事件(或 preventDefault/stopPropagation)**,導致 ZTree 拖拽邏輯收不到 mousemove/mouseup,拖拽狀態機卡死。在拖拽開始時,**動態建立一個覆蓋全螢幕(或覆蓋地圖區域)的透明 div,z-index 高於地圖容器**,讓後續滑鼠事件落在遮罩層而非地圖上,避開 OpenLayers 事件攔截。
// 全域遮罩層(初始隱藏)
const dragOverlay = document.createElement('div');
dragOverlay.style.cssText = `
position: fixed; top: 0; left: 0; width: 100%; height: 100%;
z-index: 9999; background: transparent; display: none;
pointer-events: auto; /* 關鍵:接收滑鼠事件 */
`;
document.body.appendChild(dragOverlay);
// ZTree 拖拽開始回調
function onDragStart(event, treeId, treeNode) {
dragOverlay.style.display = 'block'; // 顯示遮罩
}
// ZTree 拖拽結束回調
function onDragEnd(event, treeId, treeNode) {
dragOverlay.style.display = 'none'; // 隱藏遮罩
// 此處計算滑鼠在地圖上的座標,轉換為地理座標,添加 Feature
}
ol-viewport z-index 約 0~10)。map.getEventPixel(event) 取得像素座標 → map.getCoordinateFromPixel() 轉經緯度 → 建立 ol.Feature 加入 Vector Source。若拖拽來源也是地圖內部圖層,可用 ol.interaction.DragAndDrop。但本案來源是外部 DOM (ZTree),浮層法最簡單通用。
touchstart/move/end,遮罩層同樣有效。**OpenLayers 搶走滑鼠事件是地圖庫的正常行為**,不是 Bug。用**一個全螢幕透明遮罩層在拖拽期間覆蓋地圖**,讓事件落在遮罩上繞過地圖事件系統,是最乾淨、零侵入的解法。幾行 CSS + 兩行 JS 切換顯示,徹底解決「進地圖即卡死」的拖拽衝突。