<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
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |