Приоритет событий Hammer.js
Я реализовал библиотеку hammer.js для своих событий. Проблема в том, что одновременно запускаются несколько событий.
Могу ли я установить somekind приоритета события. Пусть говорят, что при трансформации все остальные события игнорируются. Когда трансформация останавливается, другие события могут быть выполнены.
hammertime.on("transform", function(evt) {
//transform
}
hammertime.on("drag", function(ev) {
//drag
}
Я уже пробовал что-то вроде этого:
Disabiling drag, когда мы начинаем трансформировать
hammertime.on("transform", function(evt) {
//transform
hammertime.options.drag="false";
}
И добавление его обратно при завершении преобразования
hammertime.on("transformend", function(evt) {
//transformend
hammertime.options.drag="true";
}
Этот подход работает отлично, за исключением того, что сопротивление не возвращается к true. Я хочу 100% рабочего раствора. Пожалуйста, помогите...
Ответы
Ответ 1
Один дешевый способ сделать это: чтобы ваши обработчики событий взаимодействовали:
var transforming = false;
hammertime.on("transformstart", function (ev) { transforming = true; ... });
hammertime.on("transformend", function (ev) { transforming = false; });
hammertime.on("drag", function (ev) { if (!transforming) { ... } });
Если Hammer не всегда вызывает ваш transformend
, то, к сожалению, все, что вы можете сделать, чтобы обойти ошибку, это использовать какой-то таймер, который заканчивает ваше преобразование, если пройдет определенное количество времени. Это не идеально, но это может помочь вам оправиться от возможной ошибки в Hammer:
var transformTimer = undefined,
transforming = false;
hammertime.on("transform", function (ev) {
transforming = true;
if (transformTimer !== undefined) clearTimeout(transformTimer);
transformTimer = setTimeout(function () {
transformTimer = undefined;
transforming = false;
}, 1000); // end the transform after 1s of idle time.
// your transform code goes here
});
hammertime.on("transformend", function () {
if (transformTimer !== undefined) {
clearTimeout(transformTimer);
transformTimer = undefined;
}
transforming = false;
});
hammertime.on("drag", function (ev) { if (!transforming) { ... } });
Ответ 2
попробуйте ev.gesture.stopDetect();
см. вики Hammer для некоторых подробностей об этом!
https://github.com/EightMedia/hammer.js/wiki/Event-delegation-and-how-to-stopPropagation---preventDefaults
Ответ 3
Мне только удалось исправить эту ошибку.
var transforming = false;
var transformTimer = null;
hammertime2.on('touch drag dragend transform', function(ev) {
manageMultitouch(ev);
});
hammertime2.on("transformstart", function(evt) {
transforming = true;
});
hammertime2.on("transformend", function(evt) {
setTimeout(function () {
transforming = false;
}, 1000);
});
function manageMultitouch(ev){
if (transforming && (ev.type == 'drag' || ev.type =='dragend') ) return;
switch(ev.type) {
case 'touch':
break;
case 'drag':
break;
case 'transform':
transforming = true;
break;
case 'dragend':
break;
}
}
Важная часть здесь заключается в том, что, когда вы делаете "Transform", всегда устанавливайте transforming = true;