| <!DOCTYPE html> |
| <!-- |
| | Pointer events demo web page. |
| | Can be used to verify that pointer events are generated and passed into the |
| | correct DOM elements. |
| --> |
| <html class="html"> |
| <head class="head"> |
| <style> |
| body { |
| margin: 20px; |
| background-color: #0000FF; |
| font-size: 20px; |
| font-family: Roboto; |
| } |
| .padded { |
| padding: 20px; |
| transition: border-left-color 1s linear, border-top-color 1s linear, outline-width 1s linear, outline-color 1s linear; |
| background-clip: padding-box; |
| } |
| .top { |
| transform-no: rotate(-45deg); |
| display: inline-block; |
| } |
| .outer { |
| background-color: #484; |
| border: solid rgba(0, 0, 0, 0) 10px; |
| outline: solid #00C0F0 5px; |
| } |
| .outer:hover { |
| background-color: #848; |
| border: solid white 10px; |
| outline: solid #FF4000 20px; |
| } |
| .inner { |
| animation: blink 1.1s infinite; |
| background-color: #8F8; |
| outline: solid rgba(0, 0, 0, 1) 0px; |
| } |
| .inner:hover { |
| background-color: #F8F; |
| outline: solid rgba(160, 160, 255, 0) 40px; |
| } |
| .leftswap { |
| position:relative; |
| left:+185px; |
| top:0px; |
| } |
| .rightswap { |
| position:relative; |
| left:-185px; |
| top:0px; |
| } |
| .pointereventsnone { |
| pointer-events:none; |
| } |
| .pointereventsauto { |
| pointer-events:auto; |
| } |
| |
| </style> |
| <script> |
| function phasename(phase) { |
| switch(phase) { |
| case 0: return ' [none]'; |
| case 1: return ' [capturing]'; |
| case 2: return ' [at target]'; |
| case 3: return ' [bubbling]'; |
| } |
| return ' [unknown: ' + phase + ']'; |
| } |
| |
| function sethandlers(event, classname, callback) { |
| var elements = document.getElementsByClassName(classname); |
| for (var i = 0; i < elements.length; ++i) { |
| elements[i].addEventListener(event, callback); |
| } |
| } |
| |
| function setfocus(classname) { |
| var elements = document.getElementsByClassName(classname); |
| for (var i = 0; i < elements.length; ++i) { |
| console.log('Setting focus \"' + elements[i].className + '\"'); |
| elements[i].focus(); |
| } |
| } |
| function log_event(e) { |
| var pointertype = e.pointerType ? e.pointerType + ' ' : ''; |
| var id = this.getAttribute('id') ? |
| 'id=\'' + this.getAttribute('id') + '\' ' : ''; |
| console.log(e.type + ' ' + pointertype + |
| id + '(' + |
| this.getAttribute('class') + ') ' + |
| phasename(e.eventPhase) + |
| ' (' + e.screenX + ',' + e.screenY + ')'); |
| } |
| function cancel(e) { |
| console.log('cancel'); |
| e.preventDefault(); |
| } |
| function stop(e) { |
| console.log('stop'); |
| e.stopPropagation(); |
| } |
| function capture(e) { |
| console.log('capture'); |
| e.target.setPointerCapture(e.pointerId); |
| } |
| function setallhandlers(prefix, classname, callback) { |
| sethandlers(prefix + 'enter', classname, callback); |
| sethandlers(prefix + 'leave', classname, callback); |
| sethandlers(prefix + 'over', classname, callback); |
| sethandlers(prefix + 'out', classname, callback); |
| sethandlers(prefix + 'down', classname, callback); |
| sethandlers(prefix + 'up', classname, callback); |
| sethandlers(prefix + 'move', classname, callback); |
| } |
| |
| window.onload = function() { |
| setallhandlers('mouse', 'log', log_event); |
| setallhandlers('pointer', 'log', log_event); |
| setallhandlers('mouse', 'cancel', cancel); |
| setallhandlers('pointer', 'cancel', cancel); |
| setallhandlers('mouse', 'stop', stop); |
| setallhandlers('pointer', 'stop', stop); |
| sethandlers('pointerdown', 'capture', capture); |
| setfocus('focus'); |
| |
| document.addEventListener("keydown", e => { |
| console.log('Do something on keydown'); |
| }); |
| |
| var links = document.getElementsByClassName("clickhere"); |
| for (var i = 0; i < links.length; i++) { |
| links[i].addEventListener("click", function(e) { |
| console.log('Click received at (' + e.screenX + ',' + e.screenY + |
| ') on \"' + e.target.innerHTML + '\" during ' + |
| phasename(e.eventPhase)); |
| }); |
| } |
| } |
| </script> |
| </head> |
| <body class="body"> |
| <div class="topdiv"> |
| <span id="top-left" class="top log pointereventsnone clickhere"> |
| <div class="outer padded log pointereventsnone"> |
| <div class="inner padded one log pointereventsauto clickhere">One</div> |
| <div class="inner padded two log capture stop cancel focus pointereventsauto clickhere" tabindex='0'>Two</div> |
| <div class="inner padded three log stop pointereventsauto clickhere" tabindex='1'>Three</div> |
| <div class="padded four log pointereventsauto clickhere">Four</div> |
| <div class="inner padded five offsetx log pointereventsauto">Five offset x</div> |
| <div class="inner padded six offsety log pointereventsauto">Six offset y</div> |
| <div class="padded seven log pointereventsauto">Seven</div> |
| <div class="inner padded eight log pointereventsauto">Eight</div> |
| <div class="padded nine log pointereventsauto">Nine</div> |
| <div class="inner padded leftswap log pointereventsauto">LeftSwap</div> |
| </div> |
| </span> |
| <span id="top-divider" class="top" style="width:50px;"></span> |
| <span id="top-right" class="top events"> |
| <div class="outer padded events"> |
| <div class="inner padded one events clickhere">One</div> |
| <div class="inner padded two events clickhere">Two</div> |
| <div class="inner padded three events clickhere">Three</div> |
| <div class="padded four events clickhere">Four</div> |
| <div class="inner padded five offsetx events">Five offset x</div> |
| <div class="inner padded six offsety events">Six offset y</div> |
| <div class="padded seven events">Seven</div> |
| <div class="inner padded eight events">Eight</div> |
| <div class="padded nine events">Nine</div> |
| <div class="inner padded rightswap events">RightSwap</div> |
| </div> |
| </span> |
| </div> |
| </body> |
| </html> |