Drag'n'drop dataTransfer.getData为空

Rob*_*bba 9 javascript drag-and-drop angularjs

我正在努力让拖拉机工作,但我似乎完全忽略了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'));
});
Run Code Online (Sandbox Code Playgroud)

我在这里使用AngularJS,因为这是一段更大的代码片段.

出于某种原因,当拖动底部正方形的顶部正方形时,getData('text')的值始终为空,但我不知道为什么......

有任何想法吗?

提前致谢.

Mus*_*usa 29

这些数据仅在drop下可用,这是一项安全功能,因为当您在网页上拖动某些内容时,网站可能会抓取数据.

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'));
});  
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

  • 啊,我明白了,那就太糟糕了。我想根据拖动的内容进行一些动态样式更改。我想我必须想出一些其他的解决方案。 (6认同)
  • @Z.Khullah 您可以在拖动期间检查 dataTransfer.types,这将是您作为第一个参数传递给 setData 的字符串数组。因此,您可以例如调用 setData('text', 'my drop data') 和 setData('dropzone1', 'dummy'),然后检查拖放上的类型数组以查看它是否包含 dropzone1 或 dropzone2,您将知道要设置哪个 dropEffect。 (6认同)
  • @Robba 你找到解决方案了吗? (2认同)

bli*_*lid 12

如果您确实需要访问其他放置事件中的数据,请使用dataTransfer.types. 使用JSON.parse,JSON.stringify并对大写字符进行编码/解码以避开dataTransfer.types小写字符。

设定数据:

event.dataTransfer.setData(encodeUpperCase(JSON.stringify(value)), '');
Run Code Online (Sandbox Code Playgroud)

获取数据:

const data = JSON.parse(decodeUpperCase(event.dataTransfer.types[0]))
Run Code Online (Sandbox Code Playgroud)

编码/解码的过程如下:

  const UPPERCASE_PREFIX = '^{';
  const UPPERCASE_SUFFIX = '}^';

  function encodeUpperCase(str: string): string {
    return str.replace(/([A-Z]+)/g, `${UPPERCASE_PREFIX}$1${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()
    );
  }
Run Code Online (Sandbox Code Playgroud)

它有效,但你可能会在此过程中召唤克苏鲁。