Dieses Verhalten tritt auf, weil das Ereignis dbclick
immer noch ausgelöst wird, nachdem das Element angehängt wurde.
Mit anderen Worten, wenn Sie auf ein Element in der zweiten Liste klicken, wird das zweite Klick-Ereignis ungefähr zur gleichen Zeit wie das dbclick
Ereignis ausgelöst. Um dies zu umgehen, könnten Sie die Ereigniszeitstempel vergleichen, um festzustellen, ob das zweite Ereignis click
nach dem Anhängen ein Ereignis dbclick
ausgelöst hat. Im folgenden Beispiel wird die Variable lastClickTimeStamp
jedes Mal aktualisiert, wenn das Ereignis click
ausgelöst wird. Um das seltsame Verhalten zu verhindern, das Sie sehen, wird eine Überprüfung durchgeführt, um festzustellen, ob der letzte Klick ausgelöst wurde, bevor das Ereignis dbclick
ausgelöst wird.
Updated Example
var lastClickTimeStamp = 0;
$('#list1').on('dblclick', '.item', function(event) {
if (event.timeStamp > lastClickTimeStamp) {
$('#list2').append(this);
}
});
$('#list2').on('click', '.item', function(event) {
lastClickTimeStamp = event.timeStamp + 100;
$('#list1').append(this);
});
Side Hinweise:
- habe ich
100ms
für potenzielle Zeitstempel Annäherungen zu berücksichtigen. Es ist möglich, dass die Ereigniszeitstempel um so wenig wie 1ms
variieren.
- Ich verwendete Ereignisdelegierung, um die verschachtelten Ereignislistener zu vermeiden (obwohl Sie das bereits wussten).
- Da Sie jQuery Version 1.6.4 verwenden, würden Sie die
.delegate()
Methode anstelle der .on()
Methode verwenden.
Wie ich in den Kommentaren darauf hingewiesen, könnten Sie alternativ das Element in der ersten Liste mit einer Verzögerung hängen. Das delegierte Ereignis dbclick
wird dabei nicht ausgelöst.
Updated Example
$('#list1').on('dblclick', '.item', function(event) {
$('#list2').append(this);
});
$('#list2').on('click', '.item', function(event) {
setTimeout(function() {
$('#list1').append(this);
}.bind(this), 5);
});
Ich mag beide dieser Lösungen fühlen, sind relativ hackish, aber dennoch scheinen sie zu arbeiten.
Ein weiterer Fehler, den ich gefunden habe: Klicken Sie auf ein Element in Ihrer ersten Liste und Ihre Listenelemente durchlaufen wie ein Laufband. –
Überprüfen Sie, dass es hilfreich sein könnte http://www.quirksmode.org/js/events_mouse.html –
@Drew Kennedy, alles, was in der ersten Liste passiert, ist nicht wichtig :-) Ich bin mir dessen bewusst. Das Problem ist nur, dass Doppelklick-Ereignisse ausgelöst werden, selbst wenn Sie auf zwei verschiedene DOM-Elemente klicken. – JREN