拖放 dataTransfer.getData 空
Drag'n'drop dataTransfer.getData empty
我正在尝试让拖放工作,但我似乎完全不知道 getData/setData 是如何工作的。
我正在使用此代码 (http://jsfiddle.net/ASKte/218/)
var el = angular.element(document.getElementById('drag'));
el.attr("draggable", "true");
el.bind("dragstart", function(e) {
e.dataTransfer.setData('text', 'Where have you gone?!?!')
});
var target = angular.element(document.getElementById('drop'));
target.bind("dragover", function(e) {
if (e.preventDefault) {
e.preventDefault(); // Necessary. Allows us to drop.
}
return false;
});
target.bind("dragenter", function(e) {
console.debug(e.dataTransfer.types);
console.debug(e.dataTransfer.getData('text'));
});
我在这里使用 AngularJS,因为这是一段更大的代码片段。
由于某些原因,在将顶部方块拖到底部方块上时,getData('text') 的值始终为空,但我不知道为什么...
有什么想法吗?
提前致谢。
数据仅在拖放时可用,这是一项安全功能,因为当您碰巧在网页上拖动某些内容时,网站可能会抓取数据。
var el = angular.element(document.getElementById('drag'));
el.attr("draggable", "true");
el.bind("dragstart", function(e) {
e.dataTransfer.setData('text', 'Where have you gone?!?!')
});
var target = angular.element(document.getElementById('drop'));
target.bind("dragover", function(e) {
if (e.preventDefault) {
e.preventDefault(); // Necessary. Allows us to drop.
}
return false;
});
target.bind("drop", function(e) {
console.debug(e.dataTransfer.types);
console.debug(e.dataTransfer.getData('text'));
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div id="drag" style="width: 100px; height: 100px; background-color: blue;"></div>
<div id="drop" style="width: 100px; height: 100px; background-color: green;"></div>
如果您确实需要访问其他放置事件中的数据,请使用dataTransfer.types
。使用 JSON.parse
、JSON.stringify
和 encode/decode 大写字符绕过 dataTransfer.types
小写。
设置数据:
event.dataTransfer.setData(encodeUpperCase(JSON.stringify(value)), '');
获取数据:
const data = JSON.parse(decodeUpperCase(event.dataTransfer.types[0]))
encoding/decoding 是这样的:
const UPPERCASE_PREFIX = '^{';
const UPPERCASE_SUFFIX = '}^';
function encodeUpperCase(str: string): string {
return str.replace(/([A-Z]+)/g, `${UPPERCASE_PREFIX}${UPPERCASE_SUFFIX}`);
}
function decodeUpperCase(str: string): string {
const escapeRegExp = (escape: string) => ['', ...escape.split('')].join('\');
return str.replace(
new RegExp(`${escapeRegExp(UPPERCASE_PREFIX)}(.*?)${escapeRegExp(UPPERCASE_SUFFIX)}`, 'g'),
(_, p1: string) => p1.toUpperCase()
);
}
它有效,但您可能会在此过程中召唤 Cthulhu。
我正在尝试让拖放工作,但我似乎完全不知道 getData/setData 是如何工作的。
我正在使用此代码 (http://jsfiddle.net/ASKte/218/)
var el = angular.element(document.getElementById('drag'));
el.attr("draggable", "true");
el.bind("dragstart", function(e) {
e.dataTransfer.setData('text', 'Where have you gone?!?!')
});
var target = angular.element(document.getElementById('drop'));
target.bind("dragover", function(e) {
if (e.preventDefault) {
e.preventDefault(); // Necessary. Allows us to drop.
}
return false;
});
target.bind("dragenter", function(e) {
console.debug(e.dataTransfer.types);
console.debug(e.dataTransfer.getData('text'));
});
我在这里使用 AngularJS,因为这是一段更大的代码片段。
由于某些原因,在将顶部方块拖到底部方块上时,getData('text') 的值始终为空,但我不知道为什么...
有什么想法吗?
提前致谢。
数据仅在拖放时可用,这是一项安全功能,因为当您碰巧在网页上拖动某些内容时,网站可能会抓取数据。
var el = angular.element(document.getElementById('drag'));
el.attr("draggable", "true");
el.bind("dragstart", function(e) {
e.dataTransfer.setData('text', 'Where have you gone?!?!')
});
var target = angular.element(document.getElementById('drop'));
target.bind("dragover", function(e) {
if (e.preventDefault) {
e.preventDefault(); // Necessary. Allows us to drop.
}
return false;
});
target.bind("drop", function(e) {
console.debug(e.dataTransfer.types);
console.debug(e.dataTransfer.getData('text'));
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div id="drag" style="width: 100px; height: 100px; background-color: blue;"></div>
<div id="drop" style="width: 100px; height: 100px; background-color: green;"></div>
如果您确实需要访问其他放置事件中的数据,请使用dataTransfer.types
。使用 JSON.parse
、JSON.stringify
和 encode/decode 大写字符绕过 dataTransfer.types
小写。
设置数据:
event.dataTransfer.setData(encodeUpperCase(JSON.stringify(value)), '');
获取数据:
const data = JSON.parse(decodeUpperCase(event.dataTransfer.types[0]))
encoding/decoding 是这样的:
const UPPERCASE_PREFIX = '^{';
const UPPERCASE_SUFFIX = '}^';
function encodeUpperCase(str: string): string {
return str.replace(/([A-Z]+)/g, `${UPPERCASE_PREFIX}${UPPERCASE_SUFFIX}`);
}
function decodeUpperCase(str: string): string {
const escapeRegExp = (escape: string) => ['', ...escape.split('')].join('\');
return str.replace(
new RegExp(`${escapeRegExp(UPPERCASE_PREFIX)}(.*?)${escapeRegExp(UPPERCASE_SUFFIX)}`, 'g'),
(_, p1: string) => p1.toUpperCase()
);
}
它有效,但您可能会在此过程中召唤 Cthulhu。