2013-04-17 7 views
11

Ich habe die hammer.js-Bibliothek für meine Veranstaltungen implementiert. Das Problem ist, dass mehrere Ereignisse gleichzeitig ausgelöst werden.Hammer.js Ereignispriorität

Kann ich eine Ereignispriorität festlegen? Nehmen wir an, wenn die Umwandlung durchgeführt wird, werden alle anderen Ereignisse ignoriert. Wenn die Transformation stoppt, können andere Ereignisse ausgeführt werden.

hammertime.on("transform", function(evt) { 
     //transform 
    } 

    hammertime.on("drag", function(ev) { 
     //drag 
    } 

Ich habe bereits versucht, so etwas wie dieses: Drag Disabiling wenn wir

hammertime.on("transform", function(evt) { 
      //transform 
      hammertime.options.drag="false"; 
} 

Umwandlung beginnen und enabeling es zurück, wenn Transformation beendet ist

hammertime.on("transformend", function(evt) { 
      //transformend 
      hammertime.options.drag="true"; 
} 

Dieser Ansatz funktioniert gut, außer manchmal wird der Widerstand nicht wieder auf wahr gesetzt. Ich möchte eine 100% ige Arbeitslösung. Bitte helfen ...

+1

Können Sie bitte statt gibt minuse kommentieren? Vielen Dank! – Jacob

+0

Haben Sie versucht, 'evt.stopPropagation()' oder 'evt.preventDefault()' aufzurufen? Ich weiß nicht, ob sie auf Hammer.JS vorhanden sind, aber ich denke schon, da es jQuery-Unterstützung hat ... – gustavohenke

Antwort

7

Eine billige Art und Weise, dies zu tun ist Ihre Event-Handler zusammenarbeiten haben:

var transforming = false; 
hammertime.on("transformstart", function (ev) { transforming = true; ... }); 
hammertime.on("transformend", function (ev) { transforming = false; }); 
hammertime.on("drag", function (ev) { if (!transforming) { ... } }); 

Wenn Hammer nicht immer Ihre transformend anrufen, dann leider alles, was Sie tun können, um den Fehler zu arbeiten Verwenden Sie eine Art Timer, der Ihre Transformation beendet, wenn eine bestimmte Zeit verstreicht. Es ist nicht perfekt, aber es können Sie von der möglichen Fehler in Hammer erholen:

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) { ... } }); 
+0

Ich werde es versuchen ... – Jacob

+0

Die Lösung funktioniert genau wie meine oben. Funktioniert im Allgemeinen, aber manchmal gelingt es nicht, die Transformation wieder auf "false" zu setzen und so bleibt der "Drag" -Button deaktiviert ... – Jacob

+0

Ah Ich habe den Code so geändert, dass er "transformstart" anstelle von "transform" verwendet. Es ist möglich, dass es Bugs im Hammer gibt, entweder ruft es 'transform' nach' transmend_' manchmal auf (was diese Änderung umgeht), oder es ruft nicht immer'transformend' auf, was ein Fehler in Hammer wäre, der behoben werden muss. Versuchen Sie einige 'console.log' Anweisungen zu' transformstart' und 'transformem' hinzuzufügen, um zu sehen, ob Sie für jeden' ​​start' ein 'end' erhalten. – Brandon

2

Ich habe gerade diesen Fehler behoben.

  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; 
      } 

     } 

Der wichtige Teil hier ist, dass, während Sie ‚Transform‘ gesetzt tun immer transforming = true;

Verwandte Themen