Неправильно работает скрипт
Я не специалист по javascript, но уж очень нужно...
Вот скрипт, которым поделился один человечек. Скрипт работал только в Opera, я чуть подправил, тперь он работает и в IE и в Firefox =) Но есть одна проблема, в Firefox, как-то неправильно: <SCRIPT language="JavaScript"> var ua = navigator.userAgent.toLowerCase(); isIE = (ua.indexOf("msie") != -1 && ua.indexOf("opera") == -1); isOpera = (ua.indexOf("opera") != -1); isGecko = (ua.indexOf("gecko") != -1); isSafari = (ua.indexOf("safari") != -1); isKonqueror = (ua.indexOf("konqueror") != -1); document.onmousedown = OnMouseDown; document.onmousemove = OnMouseMove; document.onmouseup = OnMouseUp; var stating = 0; var DRAG=false; function OnMouseDown(event) { if (event == null) { event = event||window.event; } target = event.target||event.srcElement; action_obj = target.id; if (isIE) { offsetY = event.offsetY; } else { offsetY = event.pageY - target.offsetTop; } distance = 0; dragObjects = document.getElementById('drag').getElementsByTagName('*'); for (var i = 0; i < dragObjects.length; i++) { if(dragObjects[i].id == action_obj) { action_obj = i; } dragObjects[i].start = dragObjects[i].offsetTop; // Начальная расположение dragObjects[i].height = dragObjects[i].clientHeight + 2; // Высота объекта с рамкой } if(stating == 0) { for(var i=0; i < dragObjects.length; i++) { dragObjects[i].style.position = 'absolute'; dragObjects[i].style.top = dragObjects[i].start; } stating = 1; } DRAG=true; } function OnMouseMove(event) { if(DRAG==true) { if (event == null) { event = event||window.event; } distance = 0; // При изменении координат мыши сбить счётчик пройденного Y = event.clientY+document.body.scrollTop || event.clientY || event.pageY || event.y; mouseY=parseInt(Y); // Координаты мышки при движении dragObjects[action_obj].style.top = mouseY - offsetY - 5 + document.body.scrollTop; // Динамичное передвижение объекта за мышкой dragObjects[action_obj].style.zIndex=2; // Чтобы работало везде for(var i=0; i<dragObjects.length; i++) { if(i != action_obj) { var center_act_now = dragObjects[action_obj].offsetTop + dragObjects[action_obj].height/2; // Динамичное (постоянно меняющееся) расположение середны проверяемого var center_cur = dragObjects[i].start + dragObjects[i].height/2; // Начальное расположение середны проверяемого var center_cur_now = dragObjects[i].offsetTop + dragObjects[i].height/2; // Динамичное расположение середны проверяемого // Если середина перетаскиваемого объекта сейчас ниже середины проверяемого И изначально была выше if(center_act_now > center_cur_now && center_cur > dragObjects[action_obj].start) { // То поднять проверяемый на высоту перетаскиваемого dragObjects[i].style.top = dragObjects[i].start - dragObjects[action_obj].height; distance += dragObjects[i].height; } // И наоборот - если сейчас выше, а в начале была ниже else if(center_act_now < center_cur_now && center_cur < dragObjects[action_obj].start) { // То опустить dragObjects[i].style.top = dragObjects[i].start + dragObjects[action_obj].height; distance -= dragObjects[i].height; } // Во всех противных случаях вернуть затронутые объекты их на начальные расположения else { dragObjects[i].style.top = dragObjects[i].start; } } } } return false; // Против выделения тескта при выдедении } function OnMouseUp(event) { // Действия после отпускания кнопки dragObjects[action_obj].style.top = dragObjects[action_obj].start + distance; // Передвигаем ровно на высоту пройденных объекстов dragObjects[action_obj].style.zIndex=1; // Для всех браузеров save(); // Вычислить порядок элементов DRAG=false; } function save() { // Сортировка элементов по их расположению и результат записываем в input var dragSort = new Array(); var saveOutput = ""; for(var i=0; i<dragObjects.length; i++) dragSort[i] = Array(dragObjects[i].id, dragObjects[i].offsetTop); dragSort.sort(function(i,ii){if (i[1] > ii[1]) return 1; else if (i[1] < ii[1]) return -1; else return 0;}); for(var i=0; i<dragObjects.length; i++) saveOutput += dragSort[i][0]+"|"; document.getElementById('save').value = saveOutput; } </script> <style> #drag *{cursor:move; border: 1px solid #ccc; background-color: #eee; width:200; height:20; z-index:1;} .dragging {z-index:2; opacity:0.8; FILTER: Alpha(opacity=80);} .draggingReset {z-index:1; opacity:1.0; FILTER: none;} </style> <BODY> <div id=drag> <div id=div1>div1</div> <div style=height:50 id=div2>div2</div> <div id=div3>div3</div> <div id=div4>div4</div> </div> <input style=position:absolute;top:10;left:300 id=save value=result> Проверял, проблема, вроде как возникает тут: if(center_act_now > center_cur_now && center_cur > dragObjects[action_obj].start) { // То поднять проверяемый на высоту перетаскиваемого dragObjects[i].style.top = dragObjects[i].start - dragObjects[action_obj].height; distance += dragObjects[i].height; } // И наоборот - если сейчас выше, а в начале была ниже else if(center_act_now < center_cur_now && center_cur < dragObjects[action_obj].start) { // То опустить dragObjects[i].style.top = dragObjects[i].start + dragObjects[action_obj].height; distance -= dragObjects[i].height; } // Во всех противных случаях вернуть затронутые объекты их на начальные расположения else { dragObjects[i].style.top = dragObjects[i].start; } В Firefox почему-то страбатывает только условие ELSE :blink: |
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [js] ... ваш код... [/js] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
попробуй для начала во все style.top добавить +'px'
width и height в CSS тоже пишуться с пикселами (px), дюймами (in), пункттами (pt) и др. |
Не помогло( Я же говорю, что проблема при проверке условий возникает((((( Если убрать ELSE заработает лучше, но не без косяков, но ELSE тоже необходим
|
Цитата:
есть куча инструментов для отладки. отлажитвайте сами |
Да в том-то и дело, что ни один Debug не видит ошибки, даже Firefox'овский!!!
P.S.: если бы я сам мог отладить, то не обратился сюда! |
Удалось обнаружить, что все условия проверяются нормально, но при перемещении он увеличивает top, а потом сразу возвращает его исходное значение, т.е. сначала срабатывает ELSE IF, а потом ELSE
|
в чём выражаеться глюк я так и непонял...можно мне на пальцах обьяснить? )))
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <style type="text/css"> body{margin:0px;} #drag * {cursor:move; border: 1px solid #CCCCCC; background-color: #EEEEEE; width:200px; height:20px; z-index:1;} .dragging {z-index:2; opacity:0.8; FILTER: Alpha(opacity=80);} .draggingReset {z-index:1; opacity:1.0; FILTER: none;} </style> <script language="JavaScript" type="text/javascript"> var ua = navigator.userAgent.toLowerCase(); isIE = ua.indexOf("msie") != -1 && ua.indexOf("opera") == -1; isOpera = ua.indexOf("opera") != -1; isGecko = ua.indexOf("gecko") != -1; isSafari = ua.indexOf("safari") != -1; isKonqueror = ua.indexOf("konqueror") != -1; document.onmousedown = OnMouseDown; document.onmousemove = OnMouseMove; document.onmouseup = OnMouseUp; var stating = 0, DRAG = false; function OnMouseDown(a) { if (a == null) a = a || window.event; target = a.target || a.srcElement; action_obj = target.id; offsetY = isIE ? a.offsetY : a.pageY - target.offsetTop; distance = 0; dragObjects = document.getElementById("drag").getElementsByTagName("*"); for (a = 0; a < dragObjects.length; a++) { if (dragObjects[a].id == action_obj) action_obj = a; dragObjects[a].start = dragObjects[a].offsetTop; dragObjects[a].height = dragObjects[a].clientHeight + 2 } if (stating == 0) { for (a = 0; a < dragObjects.length; a++) { dragObjects[a].style.position = "absolute"; dragObjects[a].style.top = dragObjects[a].start+"px" } stating = 1 } DRAG = true } function OnMouseMove(a) { if (DRAG == true) { if (a == null) a = a || window.event; distance = 0; Y = a.clientY + document.body.scrollTop || a.clientY || a.pageY || a.y; mouseY = parseInt(Y); dragObjects[action_obj].style.top = mouseY - offsetY - 5 + document.body.scrollTop+"px"; dragObjects[action_obj].style.zIndex = 2; for (a = 0; a < dragObjects.length; a++) if (a != action_obj) { var c = dragObjects[action_obj].offsetTop + dragObjects[action_obj].height / 2, b = dragObjects[a].start + dragObjects[a].height / 2, d = dragObjects[a].offsetTop + dragObjects[a].height / 2; if (c > d && b > dragObjects[action_obj].start) { dragObjects[a].style.top = dragObjects[a].start - dragObjects[action_obj].height+"px"; distance += dragObjects[a].height } else if (c < d && b < dragObjects[action_obj].start) { dragObjects[a].style.top = dragObjects[a].start + dragObjects[action_obj].height+"px"; distance -= dragObjects[a].height } else dragObjects[a].style.top = dragObjects[a].start+"px" } } return false } function OnMouseUp() { dragObjects[action_obj].style.top = dragObjects[action_obj].start + distance+"px"; dragObjects[action_obj].style.zIndex = 1; save(); DRAG = false } function save() { for (var a = [], c = "", b = 0; b < dragObjects.length; b++) a[b] = Array(dragObjects[b].id, dragObjects[b].offsetTop); a.sort(function (d, e) { return d[1] > e[1] ? 1 : d[1] < e[1] ? -1 : 0 }); for (b = 0; b < dragObjects.length; b++) c += a[b][0] + "|"; document.getElementById("save").value = c }; </script> </head> <body> <div id="drag"> <div id="div1"> div1 </div> <div style="height:50px" id="div2"> div2 </div> <div id="div3"> div3 </div> <div id="div4"> div4 </div> </div> <form> <input style="position:absolute;top:10px;left:300px" id="save" value="result"> </form> </body> </html> |
Все, работает, спасибо огромно!!! )))))))))))))))))))))))))))))
P.S.: Но я все равно так и не понял, что у меня было не так О.о |
Часовой пояс GMT +3, время: 00:15. |