我正在开发一个移动应用程序,我正在尝试将jQuery UI的可拖动功能与jQuery Mobile的taphold事件相结合。这个想法是,当执行taphold时,元素变得可拖动。
正在对以下代码中的元素初始化Draggable:
$('div.rect', '#outerBox').draggable({
containment: "parent",
grid: [50, 50],
disabled: true,
stop: function(event, ui) {
$(this).draggable('disable');
$(this).removeClass('highlighted');
}
});
正如您所见,最初禁用了可拖动功能,因为我想在taphold事件后启用它。为实现这一目标,我目前正在使用以下代码:
// Bind long press event to rectangle elements
$('div.rect', '#outerBox').bind('taphold', function(event, ui) {
// Enable dragging on long press
$(this).addClass('highlighted');
$(this).draggable('enable');
});
这样可行,但问题是需要“释放并再次点击”事件才能拖动元素,而不是在taphold事件后直接拖动。
这可能是某种事件干扰问题吗?我尝试过类似event.preventDefault()
的东西,但我对jQuery事件的了解并不多,所以我不知道这是否会产生任何影响。
关于如何解决这个问题的任何想法?
答案 0 :(得分:1)
首先,jquery ui draggable不适用于触摸事件。我假设你做了必要的调整来解决这个问题。
即。见Jquery-ui sortable doesn't work on touch devices based on Android or IOS
接下来我会说touchstart事件没有流过,因为在jquery mobile中实现了taphold。
只有在获得touchstart / mousedown事件时才会启动可拖动。
之前我见过类似的东西,但是有一个双重打击和一个可拖动的。
您可能需要在taphold事件处理程序中手动触发touchstart事件,以便启动可拖动事件:
$('div.rect', '#outerBox').bind('taphold', function(event, ui) {
var offset = $(this).offset();
var type = $.mobile.touchEnabled ? 'touchstart' : 'mousedown';
var newevent = $.Event(type);
newevent.which = 1;
newevent.target = this;
newevent.pageX = event.pageX ? event.pageX : offset.left;
newevent.pageY = event.pageY ? event.pageX : offset.top;
$(this).trigger(newevent);
});
答案 1 :(得分:1)
虽然有点晚 - 我通过跳过taphold插件并使用它来实现这一点。 请务必添加Touch Punch!
$('#whatever').on('touchstart', function (event) {
var me = this;
if (!me.touching) {
if (me.touched) { clearTimeout(me.touched); };
me.touched = setTimeout(function () {
//console.log('taphold');
//Prevent context menu on mobile (IOS/ANDROID)
event.preventDefault();
//Enable draggable
$this.draggable('enable');
//Set internal flag
me.touching = true;
//Add optional styling for user
$(me).addClass('is-marked');
//trigger touchstart again to enable draggable through touch punch
$(me).trigger(event);
//Choose preferred duration for taphold
}, 500);
}
}).on('touchend', function () {
//console.log('touchend');
this.touching = false;
//Disable draggable to enable default behaviour
$(this).draggable('disable');
//Remove optional styling
$(this).removeClass('is-marked');
clearTimeout(this.touched);
}).on('touchmove', function () {
//console.log('touchmove');
clearTimeout(this.touched);
});