課程
/前端開發(fā)
/JavaScript
/可調(diào)大小面板實現(xiàn)(Resizeable Panel)
防不住猛托猛拽怎么辦。。。 ?拖住猛一動, ?事件mouseup就沒反應(yīng)了
2014-10-06
源自:可調(diào)大小面板實現(xiàn)(Resizeable Panel) 4-1
正在回答
根本原因是因為沒有設(shè)置鼠標(biāo)捕捉。
當(dāng)鼠標(biāo)按下的時候,應(yīng)當(dāng)為 拖拽元素增加 capture
????????if(m_ctrl.setCapture){ ????????????m_ctrl.setCapture(); ????????}else?if(window.captureEvents){ ????????????window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP); ????????}
鼠標(biāo)彈起的時候
????????????if(m_ctrl.releaseCapture){ ????????????????m_ctrl.releaseCapture(); ????????????}else?if(window.captureEvents){ ????????????????window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP); ????????????}
整個代碼修改后如下:
//??設(shè)置某個面板支持調(diào)整大小 function?Resizable(panelId)?{ ????if?(!window.__resizable_var)?{ ????????with?(window)?{ ????????????//??ctrl?:控制元素,panel?:面板?,?type?類型 ????????????m_panel?=?1,?m_ctrl?=?1?,?m_type?=?1 ????????????//??move:???????是否偵聽鼠標(biāo)移動,? ????????????//??m_start_x:??鼠標(biāo)相對ctrl元素的left、right? ????????????//??m_to_x:?鼠標(biāo)的新位置 ????????????moving?=?0?,?m_start_x?=?0?,?m_start_y?=?0?,?m_to_x?=?0?,?m_to_y?=?0; ????????????//??面板最小尺寸 ????????????m_min_w?=?100,?m_min_h?=?40; ????????} ????} ????var?panel?=?document.getElementById(panelId); ????//??插入調(diào)整控制元素 ????var?r?=?document.createElement("div"); ????var?b?=?document.createElement("div"); ????var?rb?=?document.createElement("div"); ????r.class?=?r.className?=?'ui-Resizable-r??ui-Resizable-ctrl'; ????b.class?=?b.className?=?'ui-Resizable-b??ui-Resizable-ctrl'; ????rb.class?=?rb.className?=?'ui-Resizable-rb?ui-Resizable-ctrl'; ????panel.appendChild(r); ????panel.appendChild(b); ????panel.appendChild(rb); ????//??鼠標(biāo)移動處理 ????function?on_move()?{ ????????if?(moving)?{ ????????????//??計算最小的?left?和?top?(使panel的新大小不能小于自身的位置) ????????????var?min_left?=?0 ????????????var?min_top?=?0 ????????????var?to_x?=?Math.max(min_left?+?m_min_w,?m_to_x?-?m_start_x); ????????????var?to_y?=?Math.max(min_top?+?m_min_h,?m_to_y?-?m_start_y); ????????????//??元素的新位置?=?鼠標(biāo)新位置?-?鼠標(biāo)相對元素的位置s ????????????switch?(m_type)?{ ????????????????case?'r'?: ????????????????????m_ctrl.style.left?=?to_x?+?"px"; ????????????????????m_panel.style.width?=?to_x?+?10?+?'px'; ????????????????????break; ????????????????case?'b'?: ????????????????????m_ctrl.style.top?=?to_y?+?"px"; ????????????????????m_panel.style.height?=?to_y?+?10?+?'px'; ????????????????????break; ????????????????case?'rb'?: ????????????????????m_ctrl.style.left?=?to_x?+?"px"; ????????????????????m_ctrl.style.top?=?to_y?+?"px"; ????????????????????m_panel.style.width?=?to_x?+?20?+?'px'; ????????????????????m_panel.style.height?=?to_y?+?20?+?'px'; ????????????????????break; ????????????} ????????} ????} ????//???在控制元素中按下 ????function?on_mousedown(e,?panel,?ctrl,?type)?{ ????????var?e?=?e?||?window.event; ????????//??計算出鼠標(biāo)頁面位置?和?當(dāng)前元素位置的差?=?鼠標(biāo)相對元素的位置 ????????m_start_x?=?e.pageX?-?ctrl.offsetLeft; ????????m_start_y?=?e.pageY?-?ctrl.offsetTop; ????????m_panel?=?panel; ????????m_ctrl?=?ctrl; ????????m_type?=?type; ????????if(m_ctrl.setCapture){ ????????????m_ctrl.setCapture(); ????????}else?if(window.captureEvents){ ????????????window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP); ????????}? ????????//??開始處理移動事件 ????????moving?=?setInterval(on_move,?10); ????} ????//??為調(diào)整控制元素設(shè)置拖拽處理 ????r.addEventListener('mousedown',?function?(e)?{ ????????on_mousedown(e,?panel,?r,?'r'); ????}) ????b.addEventListener('mousedown',?function?(e)?{ ????????on_mousedown(e,?panel,?b,?'b'); ????}) ????rb.addEventListener('mousedown',?function?(e)?{ ????????on_mousedown(e,?panel,?rb,?'rb'); ????}); ????if?(!window.__resizable_var)?{ ????????//??頁面鼠標(biāo)移動偵聽處理 ????????document.addEventListener('mousemove',?function?(e)?{ ????????????var?e?=?window.event?||?e; ????????????m_to_x?=?e.pageX; ????????????m_to_y?=?e.pageY; ????????}) ????????//??鼠標(biāo)彈起處理 ????????document.addEventListener('mouseup',?function?(e)?{ ????????????if(m_ctrl.releaseCapture){ ????????????????m_ctrl.releaseCapture(); ????????????}else?if(window.captureEvents){ ????????????????window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP); ????????????}??? ????????????clearInterval(moving); ????????????var?cls?=?document.getElementsByClassName('ui-Resizable-ctrl'); ????????????for?(var?i?=?0;?i?<?cls.length;?i++)?{ ????????????????cls[i].style.left?=?''; ????????????????cls[i].style.top?=?''; ????????????} ????????}) ????????window.__resizable_var?=?true; ????} }
LUGY
舉報
前端UI組件倉庫必備,先從分析實現(xiàn)原理到步驟分解,走完全過程
3 回答
2 回答
1 回答
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2014-10-10
根本原因是因為沒有設(shè)置鼠標(biāo)捕捉。
當(dāng)鼠標(biāo)按下的時候,應(yīng)當(dāng)為 拖拽元素增加 capture
鼠標(biāo)彈起的時候
整個代碼修改后如下: