1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
<!DOCTYPE html>
<title>drag & drop - writing to dropEffect</title>
<style>
body > div {
height: 200px;
width: 200px;
background-color: orange;
position: absolute;
top: 8px;
left: 8px;
}
body > div * {
display: none;
}
body > div + div {
background-color: navy;
left: 250px;
}
body > div + div + div {
background-color: fuchsia;
left: 500px;
}
p:first-of-type {
margin-top: 220px;
}
</style>
<script>
window.onload = function() {
var orange = document.getElementsByTagName('div')[0], fails = [], doneonce = false, seenevent = {};
orange.ondragstart = function(e) {
e.dataTransfer.setData('Text', 'dummy text');
e.dataTransfer.effectAllowed = 'all';
if( seenevent[e.type] ) { return; }
seenevent[e.type] = true;
if( e.dataTransfer.dropEffect != 'none' ) {
fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of none';
}
try{ e.dataTransfer.dropEffect = 'move' } catch(err) {
fails[fails.length] = e.type + ' dropEffect threw on setting';
}
if( e.dataTransfer.dropEffect != 'move' ) {
fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
}
};
orange.ondrag = orange.nextSibling.ondragleave = function(e) {
if( seenevent[e.type] ) { return; }
seenevent[e.type] = true;
if( e.dataTransfer.dropEffect != 'none' ) {
fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of none';
}
try{ e.dataTransfer.dropEffect = 'move' } catch(err) {
fails[fails.length] = e.type + ' dropEffect threw on setting';
}
if( e.dataTransfer.dropEffect != 'move' ) {
fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
}
};
orange.nextSibling.ondragenter = function(e) {
e.preventDefault();
if( seenevent[e.type] ) { return; }
seenevent[e.type] = true;
if( e.dataTransfer.dropEffect != 'copy' ) {
fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of copy';
}
try{ e.dataTransfer.dropEffect = 'move' } catch(err) {
fails[fails.length] = e.type + ' dropEffect threw on setting';
}
if( e.dataTransfer.dropEffect != 'move' ) {
fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
}
};
orange.nextSibling.ondragover = function(e) {
e.preventDefault();
if( seenevent[e.type] ) {
e.dataTransfer.dropEffect = 'link';
return;
}
if( !doneonce ) {
if( e.dataTransfer.dropEffect != 'copy' ) {
fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of copy';
}
try{ e.dataTransfer.dropEffect = 'move' } catch(err) {
fails[fails.length] = e.type + ' dropEffect threw on setting';
}
if( e.dataTransfer.dropEffect != 'move' ) {
fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
}
doneonce = true;
} else {
seenevent[e.type] = true;
if( e.dataTransfer.dropEffect != 'copy' ) {
fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of copy on second attempt';
}
try{ e.dataTransfer.dropEffect = 'link' } catch(err2) {
fails[fails.length] = e.type + ' dropEffect threw on setting';
}
if( e.dataTransfer.dropEffect != 'link' ) {
fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of link on second attempt (seems to be readonly)';
}
doneonce = true;
}
};
orange.nextSibling.ondrop = function(e) {
e.preventDefault();
if( seenevent[e.type] ) { return; }
seenevent[e.type] = true;
if( e.dataTransfer.dropEffect != 'link' ) {
fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of link';
}
try{ e.dataTransfer.dropEffect = 'move' } catch(err) {
fails[fails.length] = e.type + ' dropEffect threw on setting';
}
if( e.dataTransfer.dropEffect != 'move' ) {
fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
}
};
orange.ondragend = function(e) {
if( seenevent[e.type] ) { return; }
seenevent[e.type] = true;
if( e.dataTransfer.dropEffect != 'move' ) {
//under-specified in the spec, but part of the spec related to cancelling a drag says:
//"set the current drag operation to the value of the dropEffect attribute of the DragEvent
//object's dataTransfer object as it stood after the event dispatch finished."
//this does not cover successful drags, but it makes sense to be consistent
fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move';
}
try{ e.dataTransfer.dropEffect = 'copy' } catch(err) {
fails[fails.length] = e.type + ' dropEffect threw on setting';
}
if( e.dataTransfer.dropEffect != 'copy' ) {
fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of copy (seems to be readonly)';
}
if( !seenevent.dragstart ) {
fails[fails.length] = 'dragstart did not fire';
}
if( !seenevent.drag ) {
fails[fails.length] = 'drag did not fire';
}
if( !seenevent.dragenter ) {
fails[fails.length] = 'dragenter did not fire';
}
if( !seenevent.dragover ) {
fails[fails.length] = 'dragover did not fire enough times';
}
if( !seenevent.dragleave ) {
fails[fails.length] = 'dragleave did not fire';
}
if( !seenevent.drop ) {
fails[fails.length] = 'drop did not fire';
}
document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
};
};
</script>
<div draggable='true'></div><div></div><div></div>
<p>Use your pointing device to drag the orange box to the pink box, then back to the blue box, and release it.</p>
<noscript><p>Enable JavaScript and reload</p></noscript>
|