Вернуть или выполнить функцию в jQuery UI
Я пытаюсь вернуть элемент в исходное положение, если он не был перемещен более чем на определенное расстояние. Если элемент был перетащен более чем на заданное расстояние по оси X, я хочу выполнить функцию, которая вытащит перетаскиваемый элемент из области просмотра и задвинет его обратно. Я получил его для отслеживания расстояния, но теперь он как-то не будет вернуть функцию как true или false, если условие не выполнено... Я получаю ошибку с D undefined. Кто-нибудь знает, что может быть не так?
Я пробовал разные решения, но не смог заставить ни одно из них работать, и не смог найти ответ в Интернете.
Это то, что я сделал до сих пор: http://jsfiddle.net/DzEu2/4/
$(".video").draggable({
revert: $("#video").mousedown(function (e) {
$(this).data('p0', {
x: e.pageX,
y: e.pageY
});
}).mouseup(function (e) {
p0 = $(this).data('p0'),
p1 = {
x: e.pageX,
y: e.pageY
},
d = Math.sqrt(Math.pow(p1.x - p0.x, 2) + Math.pow(p1.y - p0.y, 2));
});
if (d > 100) {
return false;
} else {
return true;
}
start: function (event) {
x = event.originalEvent.pageX;
y = event.originalEvent.pageY;
console.log(x, y);
},
drag: function (event) {
if (x && y) {
axis = Math.abs(event.originalEvent.pageX - x) > Math.abs(event.originalEvent.pageY - y) ? 'x' : 'y';
$(".video").draggable('option', 'axis', axis);
x = y = null;
}
},
stop: function () {
x = y = null;
$(".video").draggable('option', 'axis', false);
},
distance: 20,
});
1 ответ
Вы массово переусердствовали. Измерение пройденного расстояния по одной оси довольно тривиально:
revert: function() {
var orig = $(this).data("uiDraggable").originalPosition.left;
var curr = $(this).data("uiDraggable").position.left;
return curr - orig > 100;
}
Смотрите рабочее обновление на вашей скрипке
Обратите внимание, что название data
Объект отличается для разных версий jQueryUI. Для того, кого вы выбрали в скрипке, это draggable
для новых это uiDraggable
,
В вашем коде есть ряд других ошибок, которые я прокомментировал в скрипте:
- Вы на самом деле не окружили код, который вы хотели поместить в
revert
вfunction(){}
- Связыватели событий и асинхронные обратные вызовы не работают так, как вы предполагаете в
mousedown
а такжеmouseup
,d
переменная в вашемd>100
состояние всегда будетundefined
- Это вообще плохая форма, чтобы использовать селектор (
".video"
) внутри обработчика событий, когда вы можете получить тот же объект сthis
или жеevent.currentTarget
, - Не заканчивайте последнее свойство в объекте запятой. Интернет-исследователь случайно решает ненавидеть это.
Резюме? Проверка кода - ваш друг, не забывайте о нем!:)