How .setData / .getData when using jQuery.trigger ('dragstart') for HTML5 drag function
When using jQuery.trigger ('dragstart') to disable the feature of an element with ondragstart = "drag (event)" attribute, how do you drag .setData / .getData for HTML5 on a touch device? **
Example stream:
- User drags element with touchmove event
- enter the following two attributes:
- .bind ('touchmove', function (event) {$ (this) .trigger ('dragstart');});
- ondragstart = "drag (event)"
- drag (event) tries to use event.dataTransfer.setData ("Text", event.target.id);
- the result is the following error.
- "Uncaught TypeError: Cannot read property 'setData' from undefined"
For the mouse event ondragstart, .setData / .getData, the call to the drag (event) function works fine. However, when running ondragstart via .trigger (), the .setData / .getData methods do not work as expected and an error is returned.
Why does an error occur when trying to drag an order; and how to fix it? **
"Uncaught TypeError: Cannot read property 'setData' from undefined"
Please refrain from guiding how to use a .js library like TouchPunch, etc.
I am trying to bind a touchmove event to disable drag (event) and provide the same .setData / .getData functionality that is available for a mouse movement event.
---> jsFiddle Link <---
HTML:
<div class="l-col-container">
<section id="1130" class="orderqueue">
<h1>Order Queue</h1>
<div class="orderList">
<div id="100" class="order" timeslot="1130" ordernumber="100" draggable="true" ondragstart="drag(event)">
<div class="order-name">Johnny Cash</div>
<div class="order-num">Order Number: 100</div>
</div>
<!-- /order -->
<div id="101" class="order" timeslot="1130" ordernumber="101" draggable="true" ondragstart="drag(event);">
<div class="order-num">101</div>
<div class="order-name">Johnny Cash</div>
</div>
<!-- /order -->
</div>
<!-- /orderlist -->
</section>
<div class="queuebar">
<h2>Queue Bar</h2>
<hr/>
<div class="queuebar-dropzone"></div>
</div>
<div id="testsensor">
<h2>Test Log</h2>
<p id="testsensor-output"></p>
</div>
</div>
<!-- /l-col-container -->
JavaScript:
var orders = $('.order');
var testelement = document.getElementById('testsensor-output');
var index = 0;
orders.each(function () {
$(this).bind('touchmove', function (evt) {
index++;
testelement.innerHTML = index + ' dragstart fired';
console.log('dragstart fired');
$(this).trigger('dragstart');
});
$(this).bind('dragstart', function(event){
drag(event);
});
});
function drag(ev) {
console.log(ev);
var obj = $('#' + ev.target.id);
ev.dataTransfer.setData("Text", ev.target.id);
var data = ev.dataTransfer.getData("Text");
}
source to share
See jquery html 5 dragstart.on ('dragstart', function (e) {}) e.dataTransfer.setData () doesn't work
using event.originalEvent.dataTransfer
the trick
source to share
try it
Html
<div id="draggable" ></div>
CSS
#draggable {width:50px;height:50px;background-color:#f00;position:absolute}
HTML5 Touch Event Handlers
var draggable = document.getElementById('draggable');
draggable.addEventListener('touchmove', function(event) {
var touch = event.targetTouches[0];
// Place element where the finger is
draggable.style.left = touch.pageX-25 + 'px';
draggable.style.top = touch.pageY-25 + 'px';
event.preventDefault();
}, false);
thank
source to share
What I am trying to do here is not possible. I can't remember where I found the documentation, however I came to the conclusion that when setting / retrieving data using the HTML5 drag and drop method, the event that fires .setData could be a true mouse drag to transfer data. Another event cannot trigger the drag event and succeeds .setData due to security restrictions.
I may be wrong, but for anyone else trying to do this ... I suggest finding another method. I personally rewrote the code to completely remove HTML5 from the package. It was a miserable journey.: D
source to share