Touch start event propagation fix
The trick is not to remove the target element, but to hide it.
by Alexander Shutov
HTML
<svg>
<circle r="20" cx="50" cy="20" cursor="move" />
<rect x="10" y="50" width="80" height="80" />
</svg>
JavaScript
var marker = document.querySelector('circle');
var onStart = function(startEvt) {
startEvt.preventDefault(); // Prevent scroll
marker.style.visibility = 'hidden'; // Hide target element
var rect = document.querySelector('rect');
var initial = {
x: +rect.getAttribute('x'),
y: +rect.getAttribute('y')
};
var onMove = function(moveEvt) {
rect.setAttribute('x', initial.x + moveEvt.touches[0].clientX - startEvt.touches[0].clientX);
rect.setAttribute('y', initial.y + moveEvt.touches[0].clientY - startEvt.touches[0].clientY);
};
var onEnd = function(endEvt) {
window.removeEventListener('touchmove', onMove);
window.removeEventListener('touchend', onEnd);
marker.removeEventListener('touchstart', onStart);
marker.parentElement.removeChild(marker); // Remove target element
};
window.addEventListener('touchmove', onMove);
window.addEventListener('touchend', onEnd);
};
marker.addEventListener('touchstart', onStart);