而不是使用tap
and taphold
(我尝试使用但遇到了同样的问题,这似乎是taphold
事件)你可以使用vmousedown
并设置一个标志,然后绑定到vmouseup
以确定它是否是tap
or a taphold
:
var tapTime = 0;
$('#my_item_'+items[idx].user_item_id).bind('vmousedown vmouseup', function (event) {
if (event.type == 'vmousedown') {
tapTime = new Date().getTime();
} else {
//event.type == 'vmouseup'
//here you can check how long the `tap` was to determine what do do
var duration = (new Date().getTime() - tapTime);
if (duration > 3000) {
//this is a tap-hold
ShowMyItemInfo(items[idx]);
} else {
//this is a tap
FitMyUpgradeItem(items[idx]);
}
}
});
为了使其正常工作,您必须在循环代码周围添加 IIFE 或更改ShowMyItemInfo(items[idx]);
无需引用更改循环每次迭代的变量即可工作。创建 IIFE 的一个简单方法就是使用$.each()
。否则你的循环将看起来像这样:
for(var idx in items)
{
(function (idx) {
...
})(idx);
}
IIFE = 立即调用函数表达式。它允许我们对传递到 IIFE 的变量的当前状态进行“快照”。所以当我们传入idx
(从技术上讲,第二个实例是传入的变量,第一个实例是 IIFE 内可用的变量,可以将其更改为类似ids_new
为了简单起见),传入的值被保存以供tap
事件处理程序触发。
Update
您还可以设置超时来确定taphold
而不是使用vmouseup
event:
//setup a timer and a flag variable
var tapTimer,
isTapHold = false;
$('#my_item_'+items[idx].user_item_id).bind('vmousedown vmouseup', function (event) {
if (event.type == 'vmousedown') {
//set the timer to run the `taphold` function in three seconds
//
tapTimer = setTimeout(function () {
isTapHold = true;
ShowMyItemInfo(items[idx]);
}, 3000);
} else {
//event.type == 'vmouseup'
//clear the timeout if it hasn't yet occured
clearTimeout(tapTimer);
//if the flag is set to false then this is a `tap` event
if (!isTapHold) {
//this is a tap, not a tap-hold
FitMyUpgradeItem(items[idx]);
}
//reset flag
isTapHold = false;
}
});
这样,该事件将在用户按住手指三秒钟后触发。然后tap
仅当这三秒没有发生时,事件处理程序才会触发。