jQuery-aufrufende click-Ereignis nach taphold Veranstaltung
Ich bin die Entwicklung einer PhoneGap-app für Android-mit Jquery und Jquery Mobile.
Habe ich eine Liste der Artikel, die zwei Ereignisse gebunden, um jedes Element in der Liste. Ich brauche eine "taphold" - Ereignis und ein "click" Ereignis. Das problem das ich habe ist, wenn ich eine "taphold", die richtige "taphold" - Ereignis ausgelöst wird. Jedoch, sobald ich die Freigabe, das click-Ereignis wird auch ausgelöst. Wie kann ich verhindern, dass das click-Ereignis von Brand nach einem taphold?
Code:
function LoadMyItems(items) {
for(var idx in items)
{
var itemLine = '<div class="my_item" id="my_item_'+items[idx].user_item_id+'">' +
'<img class="item_icon_32" src=./images/graphicFiles/Icon48/'+items[idx].item.graphic.graphicFiles.Icon48.filename+' />' +
items[idx].item.name+
'</div>';
$('#my_list').append('<li>'+itemLine+'</li>');
$('#my_item_'+items[idx].user_item_id).bind('taphold', {userItem:items[idx]},ShowMyItemInfo);
$('#my_item_'+items[idx].user_item_id).bind('click tap', {userItem:items[idx]},FitMyUpgradeItem);
console.log('UserItem '+items[idx].user_item_id+' loaded and events bound');
}
$('#my_items_loader').hide();
myScroll.refresh();
}
Nachdem Sie die Ratschläge unten, Hier ist was ich landete mit. Dies funktioniert innerhalb der iScroll Objekt.
function LoadMyItems(items) {
for(var idx in items)
{
var itemLine = '<div class="my_item" id="my_item_'+items[idx].user_item_id+'">' +
'<img class="item_icon_32" src=./images/graphicFiles/Icon48/'+items[idx].item.graphic.graphicFiles.Icon48.filename+' />' +
items[idx].item.name+
'</div>';
$('#my_list').append('<li>'+itemLine+'</li>');
(function(index) {
var tapTime = 0;
var xPos = 0;
var yPos = 0;
$('#my_item_'+items[index].user_item_id).bind('vmousedown vmouseup', function (event) {
if (event.type == 'vmousedown') {
tapTime = new Date().getTime();
xPos = event.pageX;
yPos = event.pageY;
var timer = setTimeout(function() {
var duration = (new Date().getTime() - tapTime);
var xDiff = Math.abs(mouseXPos - xPos);
var yDiff = Math.abs(mouseYPos - yPos);
if(duration >= 700 && (yDiff <= 40 || mouseXPos == 0))
ShowItemInfo(items[index].item);
},750);
} else {
//event.type == 'vmouseup'
var duration = (new Date().getTime() - tapTime);
var xDiff = Math.abs(event.pageX - xPos);
var yDiff = Math.abs(event.pageY - yPos);
tapTime = new Date().getTime();
if (duration < 699 && yDiff <= 40) {
//this is a tap
FitMyUpgradeItem(items[index]);
}
}
});
$('#my_item_'+items[index].user_item_id).bind('touchmove',function(event) {
event.preventDefault();
});
})(idx);
console.log('UserItem '+items[idx].user_item_id+' loaded and events bound');
}
$('#my_items_loader').hide();
myScroll.refresh();
}
- Bewährte schnelle Lösung: stackoverflow.com/a/11941654/1386781
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eher als
tap
undtaphold
(das habe ich versucht zu nutzen, aber die lief in das gleiche Probleme, es scheint, um eine inhärente Problem mit dertaphold
Veranstaltung), die Sie verwenden könnenvmousedown
und ein flag setzen, dann bindenvmouseup
um festzustellen, ob es war eintap
oder einetaphold
:Damit das richtig funktioniert müssen Sie eine IIFE um den loop-code oder ändern
ShowMyItemInfo(items[idx]);
zu arbeiten, ohne Bezug auf die variable, die ändert sich bei jeder iteration der Schleife. Ein einfach zu erstellen Sie eine IIFE ist, um Sie nur$.each()
. Ansonsten ist die Schleife würde etwa so Aussehen:IIFE = Sofort-Aufgerufen-Funktion-Ausdruck. Es ermöglicht uns, einen "Schnappschuss" des aktuellen Status von Variablen wir gehen in die IIFE. So passieren wir in
idx
(technisch die zweite Instanz ist die variable, die übergeben, und die erste Instanz wird die variable innerhalb des IIFE, was könnte geändert werden, um so etwas wieids_new
Einfachheit halber), und der Wert der übergeben wird, wird gespeichert, wenn dietap
event-handler feuert.Update
Können Sie auch ein Zeitlimit, um zu bestimmen
taphold
anstatt mit denvmouseup
Veranstaltung:Diese Weise das Ereignis wird ausgelöst, nachdem der Benutzer nach unten hält, den finger für drei Sekunden. Dann die
tap
event-handler wird nur ausgelöst, wenn, die drei Sekunden nicht auftreten.vmouseup
Ereignisses, das ausgelöst wird, auf diedocument
element, wie gut?touchstart
/touchend
/touchmove
Veranstaltungen, da Sie weniger seltsame Nebenwirkungen. Wenn Sie beginnen, diese Ereignisse verwenden, müssen Sie, um herauszufinden, die besten Möglichkeiten, in Ihrem eigenen code arbeiten, touch/non-touch-Geräte in Ihre Projekte, aber die standard-Ereignisse sind viel stabiler und viel mehr nützliche (zum Beispiel mittouchstart
können Sie sagen, wie viele Finger den Bildschirm berühren).Einfach setzen Sie dieses auf den oberen Rand des Dokuments oder irgendwo vorher definieren Sie Ihre selbst:
Dann können Sie es verwenden, wie diese:
Persönlich, ich dachte, die Antworten hier stark über-kompliziert das Thema. Wenn Sie wollen einfach nur eine einfache Möglichkeit, um in der Lage sein, auch weiterhin mit den taphold Ereignis und ignorieren das click-Ereignis, das ausgelöst wird, wenn Sie release eine taphold, ist hier, wie ich gelöst habe das gleiche problem in meinem Projekt:
Verwenden, Tippen Sie auf\vclick und taphold statt-Tippen Sie auf ein Ereignis gefeuert wird zweimal nach einem taphold.
In diesem Beispiel klicken, wird tatsächlich nicht genannt, nach der taphold .. Check es hier: http://jsfiddle.net/YL8hj/43/
Edit:
auch http://appcropolis.com/blog/jquery-wrapper-for-iscroll/
Kredit https://stackoverflow.com/a/9408567/643500