|
//todo double tap to select element |
|
// https://gist.github.com/Stvad/360233135351d41f0411ce275b16214b |
|
(function () { |
|
let lastPencilTapTime = 0 |
|
|
|
function isDoubleTap(maxDelta = 50) { |
|
const delta = Date.now() - lastPencilTapTime |
|
return delta < maxDelta && delta > 0 |
|
} |
|
|
|
const body = document.querySelector('body') |
|
|
|
|
|
function touchHandler(event) { |
|
console.log('touchHandler', event) |
|
var touches = event.changedTouches, |
|
first = touches[0], |
|
type = ""; |
|
switch(event.type) |
|
{ |
|
case "touchstart": type = "dblclick"; break; |
|
case "touchmove": type = "mousemove"; break; |
|
case "touchend": type = "mouseup"; break; |
|
default: return; |
|
} |
|
|
|
// initMouseEvent(type, canBubble, cancelable, view, clickCount, |
|
// screenX, screenY, clientX, clientY, ctrlKey, |
|
// altKey, shiftKey, metaKey, button, relatedTarget); |
|
|
|
var simulatedEvent = document.createEvent("MouseEvent"); |
|
simulatedEvent.initMouseEvent(type, true, true, window, 1, |
|
first.screenX, first.screenY, |
|
first.clientX, first.clientY, false, |
|
false, false, false, 0/*left*/, null); |
|
|
|
first.target.dispatchEvent(simulatedEvent); |
|
event.preventDefault(); |
|
} |
|
|
|
function init() |
|
{ |
|
document.addEventListener("touchstart", touchHandler, true); |
|
document.addEventListener("touchmove", touchHandler, true); |
|
document.addEventListener("touchend", touchHandler, true); |
|
document.addEventListener("touchcancel", touchHandler, true); |
|
} |
|
|
|
// init() |
|
|
|
|
|
body.addEventListener('touchstart', async evt => { |
|
try { |
|
// should be either "stylus" or "direct" |
|
// from https://stackoverflow.com/questions/34986373/javascript-touch-event-distinguishing-finger-vs-apple-pencil |
|
if (evt.touches[0].touchType === 'stylus') { |
|
selectTappedWord(evt) |
|
} |
|
} catch (e) { |
|
console.error(e) |
|
} |
|
}) |
|
|
|
function selectTappedWord(evt) { |
|
const touchRange = getWord(evt.touches[0]) |
|
// replaceSelectionWith(touchRange) |
|
} |
|
|
|
function replaceSelectionWith(range) { |
|
const sel = window.getSelection() |
|
console.log({sel, range}) |
|
sel.removeAllRanges() |
|
sel.addRange(range) |
|
} |
|
|
|
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms)) |
|
|
|
function selectElementContents(el) { |
|
const range = document.createRange() |
|
range.selectNodeContents(el) |
|
replaceSelectionWith(range) |
|
} |
|
|
|
function getWord(touch) { |
|
const sel = window.getSelection() |
|
|
|
const range = document.caretRangeFromPoint(touch.clientX, touch.clientY) |
|
sel.removeAllRanges() |
|
sel.addRange(range) |
|
|
|
if (sel.isCollapsed) { |
|
sel.modify('move', 'forward', 'character') |
|
sel.modify('move', 'backward', 'word') |
|
sel.modify('extend', 'forward', 'word') |
|
// t = selection.toString(); |
|
//s.modify('move', 'forward', 'character'); //clear selection |
|
} else {return } |
|
// else { |
|
// t = selection.toString(); |
|
// } |
|
console.log(sel) |
|
// return selection.getRangeAt(0) |
|
return range |
|
// const range = document.caretRangeFromPoint(touch.clientX, touch.clientY) |
|
// return range |
|
} |
|
|
|
|
|
// from https://stackoverflow.com/questions/47282265/html5-touch-event-getting-word-touched |
|
function getWordO(e) { |
|
// FF gives us a shortcut |
|
let target = e.target, |
|
// We will use this to get the positions of our textNodes |
|
range = document.createRange(), |
|
rect, i |
|
// so first let's get the textNode that was clicked |
|
if (target.nodeType !== 3) { |
|
const children = target.childNodes |
|
i = 0 |
|
while (i < children.length) { |
|
range.selectNode(children[i]) |
|
rect = range.getBoundingClientRect() |
|
if (rect.left <= e.clientX && rect.right >= e.clientX && |
|
rect.top <= e.clientY && rect.bottom >= e.clientY) { |
|
target = children[i] |
|
break |
|
} |
|
i++ |
|
} |
|
} |
|
if (target.nodeType !== 3) { |
|
return '[not a textNode]' |
|
} |
|
// Now, let's split its content to words |
|
let words = target.nodeValue.split(' '), |
|
textNode, newText |
|
i = 0 |
|
while (i < words.length) { |
|
// create a new textNode with only this word |
|
textNode = document.createTextNode((i ? ' ' : '') + words[i]) |
|
newText = words.slice(i + 1) |
|
// update the original node's text |
|
target.nodeValue = newText.length ? (' ' + newText.join(' ')) : '' |
|
// insert our new textNode |
|
target.parentNode.insertBefore(textNode, target) |
|
// get its position |
|
range.selectNode(textNode) |
|
rect = range.getBoundingClientRect() |
|
// if it is the one |
|
if (rect.left <= e.clientX && rect.right >= e.clientX && |
|
rect.top <= e.clientY && rect.bottom >= e.clientY) { |
|
// return words[i]; |
|
return range |
|
} |
|
i++ |
|
} |
|
} |
|
})() |