Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Требуется совет в реализации. (https://javascript.ru/forum/dom-window/3448-trebuetsya-sovet-v-realizacii.html)

Riim 23.04.2009 15:08

Цитата:

Сообщение от AzriMan
это из серии "Ниже IE6 жизни нет"?

Ну и отлично :)

Цитата:

Сообщение от AzriMan
Только вот обнаружил, что при перетаскивании моего дива по окну броузера иногда в броузере происходит выделение текста

if (e.preventDefault) {
	e.preventDefault();
	e.stopPropagation();
} else {
	e.returnValue = false;
	e.cancelBubble = true;
}

cker 27.04.2009 00:28

if (e.preventDefault) {
	e.preventDefault();
	e.stopPropagation();
} else {
	e.returnValue = false;
	e.cancelBubble = true;
}


А куда это?

Riim 27.04.2009 00:48

В начало обработчика.

cker 27.04.2009 16:36

не получается :(

Артем Шалхаков 27.04.2009 18:35

Чтобы замутить drag'n'drop, самый простой способ это реализовать конечный автомат о трех состояниях:
- начальное (ничего не перетаскивается)
- перетаскиваем (поступило событие mousedown, теперь перехватываем все события mousemove)
- "бросаем" (поступило событие mouseup)

Реализацию этой идеи можешь посмотреть на сайте Flapjax. Другие библиотеки тоже предоставляют такую функциональность, но там все плохо с точки зрения комбинирования этого кода с твоим (compositionality).

Полупрозрачный div это div с CSS-свойством opacity < 1.0 (для IE хаки нужны).

ADD: блин, ответил на вопросы с первой страницы %)

Kolyaj 27.04.2009 18:44

Цитата:

Сообщение от Артем Шалхаков
Чтобы замутить drag'n'drop, самый простой способ это реализовать конечный автомат о трех состояниях

Делать автомат с двумя состояниями и с элементарными переходами между ними лишнее, не находите?

Артем Шалхаков 27.04.2009 19:11

Цитата:

Сообщение от Kolyaj (Сообщение 17722)
Делать автомат с двумя состояниями и с элементарными переходами между ними лишнее, не находите?

Нет, не нахожу, потому что реализация должна следовать за спецификацией, а не наоборот. Кстати, результирующий код не обязательно будет именно реализовывать конечный автомат, там может быть что-то другое, но именно что эквивалентное.

Kolyaj 27.04.2009 19:22

Для чего реализовывать автомат, если обработка mousemove зависит только от того, нажата в данный момент кнопка мыши или нет, и больше ни от чего?

Илья Кантор 27.04.2009 20:29

Прошу - сегодня выложил http://javascript.ru/ui/draganddrop

Ответы на все ваши вопросы в ней есть.

Артем Шалхаков 28.04.2009 08:00

Цитата:

Сообщение от Kolyaj (Сообщение 17724)
Для чего реализовывать автомат, если обработка mousemove зависит только от того, нажата в данный момент кнопка мыши или нет, и больше ни от чего?

Так это... конечный автомат и будет зависеть только от этих событий (скопипасчено с flapjax-lang.org/demos/drag.html и заботливо откомментировано):

// dragE(element) -> EventStream { left: int, top: int }
function dragE(target) {
  // начинаем в состоянии покоя

  // moveEe :: EventStream (EventStream { left: int, top: int })
  var moveEe = extractEventE(target,'mousedown').mapE(function(md) {
    // переходим из начального состояния в состояние переноса
    var startX = md.layerX;
    var startY = md.layerY;
    // в состоянии переноса отлавливаем все события mousemove
    // и сохраняем в особый объект
    return extractEventE(document,'mousemove').mapE(function(mm) {
      mm.preventDefault(); // отменяем выделение текста

      return { element: target, // ради удобства
               left: mm.clientX - startX,  
               top: mm.clientY - startY };
    });
  });
  // терминирующее состояние
  // dropEe :: EventStream (EventStream 'a)
  var dropEe = extractEventE(document,'mouseup').mapE(function() {
    return zeroE();
  });
  // switchE "смешивает" перемещение и окончание, то есть,
  // когда поступает mouseup, то mousemove нас уже не интересуют,
  // и мы на этом заканчиваем
  return switchE(mergeE(moveEe,dropEe));
}


(беспроблемно расширяется до http://flapjax-lang.org/try/index.ht...=listdrag.html)

Этот подход таки лучше указанного в статье, потому что callback'ов нету, а есть потоки событий, с которыми можно обращаться также, как и с переменными (передавать в функции, возвращать из функций, "изменять", etc.).

Еще раз повторю: сначала спецификация, затем код. Иначе не будет четкого понимания, что и зачем делаем, лапша получится.


Часовой пояс GMT +3, время: 17:16.