032.html (2585B)
1 <!doctype html> 2 <html> 3 <head> 4 <title>Drag and drop passing over body without cancelling dragenter</title> 5 <style type="text/css"> 6 div:first-child { 7 height: 100px; 8 width: 100px; 9 background: orange; 10 display: inline-block; 11 } 12 div:first-child + div { 13 height: 100px; 14 width: 100px; 15 margin-left: 200px; 16 background: blue; 17 display: inline-block; 18 } 19 </style> 20 <script type="text/javascript"> 21 //this test enforces the following spec statement: 22 //"if this immediate user selection is not the same as the current target element" 23 window.onload = function () { 24 var drag = document.getElementsByTagName('div')[0], sequence = []; 25 drag.ondragstart = function (e) { 26 e.dataTransfer.setData('text','hello'); 27 e.dataTransfer.effectAllowed = 'copy'; 28 }; 29 drag.ondragenter = function (e) { 30 sequence[sequence.length] = 'drag.dragenter'; 31 }; 32 drag.ondragover = function (e) { 33 if( sequence[sequence.length-1] != 'drag.dragover' ) { 34 sequence[sequence.length] = 'drag.dragover'; 35 } 36 }; 37 var drop = document.getElementsByTagName('div')[1]; 38 drop.ondragenter = function (e) { 39 e.preventDefault(); 40 sequence[sequence.length] = 'drop.dragenter'; 41 }; 42 drop.ondragover = function (e) { 43 e.preventDefault(); 44 if( sequence[sequence.length-1] != 'drop.dragover' ) { 45 sequence[sequence.length] = 'drop.dragover'; 46 } 47 }; 48 drop.ondrop = function (e) { 49 e.preventDefault(); 50 sequence[sequence.length] = 'drop.ondrop'; 51 }; 52 document.body.ondragenter = function (e) { 53 sequence[sequence.length] = ( e.target == this ) ? 'body.dragenter' : 'bubble.dragenter'; 54 }; 55 document.body.ondragover = function (e) { 56 if( e.target != this ) { return; } 57 if( sequence[sequence.length-1] != 'body.dragover' ) { 58 sequence[sequence.length] = 'body.dragover'; 59 } 60 }; 61 drag.ondragend = function (e) { 62 sequence = sequence.join('=>') 63 var desiredsequence = (['drag.dragenter','bubble.dragenter','body.dragenter','body.dragover','drop.dragenter','bubble.dragenter','drop.dragover','drop.ondrop']).join('=>') 64 if( sequence == desiredsequence ) { 65 document.getElementsByTagName('div')[2].innerHTML = 'PASS'; 66 } else { 67 document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence; 68 } 69 }; 70 }; 71 </script> 72 </head> 73 <body> 74 75 <div draggable="true"></div><div></div> 76 <div> </div> 77 <p>Drag the orange square onto the blue square and release it.</p> 78 <noscript><p>Enable JavaScript and reload</p></noscript> 79 80 </body> 81 </html>