Touch Move-Ereignis wird nicht ausgelöst, nachdem das Touch Start-Ziel entfernt wurde

Ich versuche, eine Drag-like-Funktionalität mit dem nächsten Muster zu implementieren:

Subscribe to marker Pointer Down event.Wenn ein Down-Ereignis ausgelöst wird, abonnieren Sie Window Pointer Move- und Up-Ereignisse und entfernen Sie die Markierung.Führe einige Aktionen aus, während du dich bewegst.Wenn ein Up-Ereignis ausgelöst wird, können Sie Move and Up abbestellen.

Dies funktioniert für Mausereignisse, jedoch nicht für Touch-Ereignisse. Sie werden nicht ausgelöst, nachdem das Touch Start-Zielelement entfernt wurde. Ich habe versucht, @ zu verwendPointer Events Polyfill aber es funktioniert auch nicht.

Ich verwende Chrome Dev Tools, um Berührungsereignisse zu emulieren. Siehe das Beispiel:

initTestBlock('mouse', {
  start: 'mousedown',
  move: 'mousemove',
  end: 'mouseup'
});
initTestBlock('touch', {
  start: 'touchstart',
  move: 'touchmove',
  end: 'touchend'
});
initTestBlock('touch-no-remove', {
  start: 'touchstart',
  move: 'touchmove',
  end: 'touchend'
}, true);

function initTestBlock(id, events, noRemove) {
  var block = document.getElementById(id);
  var parent = block.querySelector('.parent');
  var target = block.querySelector('.target');
  target.addEventListener(events.start, function(e) {
    console.log(e.type);
    if (!noRemove) {
      setTimeout(function() {
        // Remove target
        target.parentElement.removeChild(target);
      }, 1000);
    }

    function onMove(e) {
      console.log(e.type);
      var pt = getCoords(e);
      parent.style.left = pt.x + 'px';
      parent.style.top = pt.y + 'px';
    }

    function onEnd(e) {
      console.log(e.type);
      window.removeEventListener(events.move, onMove);
      window.removeEventListener(events.end, onEnd);
    }

    window.addEventListener(events.move, onMove);
    window.addEventListener(events.end, onEnd);

  });
}

// Returns pointer coordinates
function getCoords(e) {
  if (e instanceof TouchEvent) {
    return {
      x: e.touches[0].pageX,
      y: e.touches[0].pageY
    };
  }
  return {
    x: e.pageX,
    y: e.pageY
  };
}

window.addEventListener('selectstart', function() {
  return false;
}, true);
.parent {
  background: darkred;
  color: white;
  width: 10em;
  height: 10em;
  position: absolute;
}
.target {
  background: orange;
  width: 4em;
  height: 4em;
}
#mouse .parent {
  left: 0em;
}
#touch .parent {
  left: 11em;
}
#touch-no-remove .parent {
  left: 22em;
}
<div id="mouse">
  <div class="parent">Mouse events
    <div class="target">Drag here</div>
  </div>
</div>
<div id="touch">
  <div class="parent">Touch events
    <div class="target">Drag here</div>
  </div>
</div>
<div id="touch-no-remove">
  <div class="parent">Touch (no remove)
    <div class="target">Drag here</div>
  </div>
</div>

Antworten auf die Frage(4)

Ihre Antwort auf die Frage