Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Test touch events when element is removed</title>
</head>
<body>
  <p>Test touch events when element is removed.</p>
  <input id=capture type=checkbox> Explicit capture<br>
  <input id=logtouch type=checkbox checked> Log touchevents<br>
  <input id=logpointer type=checkbox checked> Log pointerevents<br>
  <div id="container">
    Container
    <div id="target">Target</div>
  </div>
  <div id="log"></div>
</body>
</html>
 
#target {
  width: 100px;
  height: 100px;
  background: green;
  position: absolute;
  color: white;
  touch-action: none;
}
#container {
  width: 300px;
  height: 150px;
  border: 2px solid black;
}
#log {
  white-space: pre-wrap;
}
 
let target = document.querySelector('#target');
let log = document.querySelector('#log');
let container = document.querySelector('#container');
let logging = false;
let last = "";
function logev(elem, evt) {
  if (elem == target) {
    logging = true;
  }
  if (!logging)
    return;
  // We have an explicit listeners on target so
  // don't double-log those events through bubbling.
  if (evt.target == target && elem != evt.target)
    return;
  if (!document.querySelector('#logtouch').checked && evt.type.startsWith('touch'))
    return;
  if (!document.querySelector('#logpointer').checked && evt.type.startsWith('pointer'))
    return;
  let desc = evt.target.id || evt.target.tagName;
  let cur = `${evt.type} on ${desc}`;
  if (cur == last) {
    // add a period for repeated events.
    log.textContent += ' .';
    return;
  }
  log.textContent += `\n${cur}`;
  last = cur;
}
function prevent(evt) {
  evt.preventDefault();
}
let types = ['pointerdown', 'pointermove', 'pointerup',
            'touchstart', 'touchmove', 'touchend'];
target.addEventListener('pointerdown', (evt) => {
  if (document.querySelector('#capture').checked) {
    target.setPointerCapture(evt.pointerId);
  }
  evt.preventDefault();
  target.remove();
});
for (let elem of [document.body, target]) {
  for (let type of types) {
    elem.addEventListener(type, logev.bind(null, elem));
  }
}
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
flackrpro
0viewers