Drag&Drop Сортировка
Здравствуйте, товарищи! У меня есть жесткая необходимость в Drag&Drop сортировке списков, вот таким образом http://tool-man.org/examples/sorting.html (Часть под заголовком "Example: Add Some Style" и список под ней тот, что длинный вертикальный)
Скачать-то я его скачал. Теперь копирую ту часть которая мне нужна. И она не работает. Думал, может не захватил какую-то часть скриптов... Взял всю страницу целиком, и в исходном коде постепенно убирал ненужные мне способы сортировки, чтоб оставить один единственный. И, вдруг выяснилось, что одна без другой работать не может. А нахрена мне весь набор? В общем, мне не хватает опыта, чтоб разобраться во всем этом деле. Может у вас где-нибудь запылился старый добрый простой подобный скрипт. На jQuery видел уже, но там они все сделаны так что после каждого перетаскивания идет обновление ячеек базы данных. А мне такой подход не нужен. Я хочу отсортировать, нажать на кнопку и весь результат получить в виде строки который потом отправлю в PHP файл, где разберу и сделаю с ним ужасные вещи. Заранее спасибо. |
Цитата:
|
Вот раздобыл я такой скрипт, который проделвывает все что нужно
var cof=false; var absoluting = 0;
function down(){ // Действия при клике
distance = 0; // Для дальнейшего подсчёта высот пройденных объектов, чтобы поставить передвигаемый ровно
offsetY=parseInt(window.event.offsetY); // Разница между курсором и верхней границей объекта
act_obj = window.event.srcElement.id; // ID передвигаемого объекта
dragObjects = document.getElementById('drag123').getElementsByTagName('*'); // Все элементы внутри указанной
for(var i=0; i<dragObjects.length; i++) { // Придача каждому его высоты и начальных координат
if(dragObjects[i].id == act_obj) act_obj = i; // Обозначить номер передвигаемого объекта
dragObjects[i].start = dragObjects[i].offsetTop; // Начальная расположение
dragObjects[i].height = dragObjects[i].clientHeight+2; // Высота объекта с рамкой
}
if(absoluting==0) { // Сделать все объекты абсолютно позиционированными (только в первый раз)
for(var i=0; i<dragObjects.length; i++){
dragObjects[i].style.position = 'absolute';
dragObjects[i].style.top = dragObjects[i].start;
}
absoluting = 1;
}
cof=true;
}
function move(){ // Действия при зажатой кнопке
if(cof==true){
distance = 0; // При изменении координат мыши сбить счётчик пройденного
mouseY=parseInt(window.event.y); // Координаты мышки при движении
dragObjects[act_obj].style.top=mouseY-offsetY-5+document.body.scrollTop; // Динамичное передвижение объекта за мышкой
dragObjects[act_obj].className = 'dragging'; // Придаём визуальные свойства передвигаемому объекту (CSS)
dragObjects[act_obj].style.zIndex=2; // Чтобы работало везде
for(var i=0; i<dragObjects.length; i++) {
if(i != act_obj){ // Проверить расположение всех объектов, кроме перетаскиваемого
var center_act_now = dragObjects[act_obj].offsetTop + dragObjects[act_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[act_obj].start){
// То поднять проверяемый на высоту перетаскиваемого
dragObjects[i].style.top = dragObjects[i].start - dragObjects[act_obj].height;
distance += dragObjects[i].height;}
// И наоборот - если сейчас выше, а в начале была ниже
else if(center_act_now < center_cur_now && center_cur < dragObjects[act_obj].start){
// То опустить
dragObjects[i].style.top = dragObjects[i].start + dragObjects[act_obj].height;
distance -= dragObjects[i].height;}
// Во всех противных случаях вернуть затронутые объекты их на начальные расположения
else dragObjects[i].style.top = dragObjects[i].start;
}
}
}
return false; // Против выделения тескта при выдедении
}
function up(){ // Действия после отпускания кнопки
dragObjects[act_obj].style.top = dragObjects[act_obj].start + distance; // Передвигаем ровно на высоту пройденных объекстов
dragObjects[act_obj].innerHTML += ' *'; // Кому не надо - можно убрать строчку
dragObjects[act_obj].className = 'draggingReset' // Возвращаем начальные визуальные настройки
dragObjects[act_obj].style.zIndex=1; // Для всех браузеров
save(); // Вычислить порядок элементов
cof=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;
}
document.onmousedown = down;
document.onmousemove = move;
document.onmouseup = up;
<style>
#drag123 *{
cursor:move;
border: 1px solid #ccc;
background-color: #eee;
width:200px;
height:30px;
z-index:1;
margin:3px 0;
}
.dragging{
z-index:2;
}
.draggingReset {
z-index:1;
}
</style>
<div id="drag123">
<div id="div1">div1</div>
<div 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">
Он работает, когда кроме этого на странице ничего нет. Но когда встраиваю его в страничку с парой других скриптов, работает некорректно. Может тут есть какой-то подводный камень? |
Здесь логика нарушена, что-то с расчетами, они слезают прыгают и тп.. да и стиль может в блоки обернуть и отступы убрать?
|
http://jsfiddle.net/qTuaU/
правда фраймворки я их не люблю http://dev.sencha.com/deploy/ext-3.3...al/portal.html не знаю но мне кажется, что если это не твоих рук дело проще взять что ни будь за основу типа этого
window.onload = function() {
var foo,
offsetX,
offsetY;
// so it exists
foo = document.createElement("div");
document.body.appendChild(foo);
// so we can see it:
foo.style.width = "100px";
foo.style.height = "100px";
foo.style.backgroundColor = "blue";
// so we can move it where we want:
foo.style.position = "absolute";
// so it looks like something we should click on
foo.style.cursor = "pointer";
foo.onmousedown = function(event) {
// where is the mouse in relation to the div?
offsetX = event.clientX - parseInt(foo.style.left || 0);
offsetY = event.clientY - parseInt(foo.style.top || 0);
// add listeners
document.onmousemove = onMouseMove;
document.onmouseup = onMouseUp;
// prevent event propagation
event.preventDefault();
return false;
}
function onMouseMove(event) {
// move the div in relation to the mouse
foo.style.left = event.clientX - offsetX;
foo.style.top = event.clientY - offsetY;
}
function onMouseUp(event) {
// remove listeners
document.onmousemove = null;
document.onmouseup = null;
}
}
|
Совсем забыл про http://tool-man.org/examples/sorting.html
довольно приятный фраймворк, к сожалению он уже давно не поддерживается и существование серьезных багов вынудило меня отвернуться |
| Часовой пояс GMT +3, время: 13:48. |