Подтвердить что ты не робот

HTML5 перетащить и скопировать?

Я видел некоторый рабочий код для перетаскивания HTML5, но есть ли у кого-нибудь пример перетаскивания и копирования? Я хочу перетащить элемент на элемент drop, но только скопировать элемент в это место.

4b9b3361

Ответ 1

Я буду придерживаться приведенного здесь примера: http://www.w3schools.com/html/html5_draganddrop.asp

Предполагая, что у нас есть этот документ:

<!DOCTYPE HTML>
<html>
 <head>
  <script>
    <!-- script comes in the text below -->
  </script>
 </head>
 <body>

  <div id="div1" ondrop="drop(event)"
  ondragover="allowDrop(event)"></div>

  <img id="drag1" src="img_logo.gif" draggable="true"
  ondragstart="drag(event)" width="336" height="69">

 </body>
</html>

Нормальное перетаскивание

Нормальное перетаскивание имеет такие функции, которые назначаются соответствующим элементам:

function allowDrop(ev) {
  /* The default handling is to not allow dropping elements. */
  /* Here we allow it by preventing the default behaviour. */
  ev.preventDefault();
}

function drag(ev) {
  /* Here is specified what should be dragged. */
  /* This data will be dropped at the place where the mouse button is released */
  /* Here, we want to drag the element itself, so we set it ID. */
  ev.dataTransfer.setData("text/html", ev.target.id);
}

function drop(ev) {
  /* The default handling is not to process a drop action and hand it to the next 
     higher html element in your DOM. */
  /* Here, we prevent the default behaviour in order to process the event within 
     this handler and to stop further propagation of the event. */
  ev.preventDefault();
  /* In the drag event, we set the *variable* (it is not a variable name but a 
     format, please check the reference!) "text/html", now we read it out */
  var data=ev.dataTransfer.getData("text/html");
  /* As we put the ID of the source element into this variable, we can now use 
     this ID to manipulate the dragged element as we wish. */
  /* Let just move it through the DOM and append it here */
  ev.target.appendChild(document.getElementById(data));
}

Перетаскивание и копирование

В то время как вам придется изменить функцию drop, чтобы она копировала элемент DOM, а не перемещала его.

/* other functions stay the same */

function drop(ev) {
  ev.preventDefault();
  var data=ev.dataTransfer.getData("text/html");
  /* If you use DOM manipulation functions, their default behaviour it not to 
     copy but to alter and move elements. By appending a ".cloneNode(true)", 
     you will not move the original element, but create a copy. */
  var nodeCopy = document.getElementById(data).cloneNode(true);
  nodeCopy.id = "newId"; /* We cannot use the same ID */
  ev.target.appendChild(nodeCopy);
}

Попробуйте эту страницу: http://www.w3schools.com/html/tryit.asp?filename=tryhtml5_draganddrop
Затем добавьте .cloneNode(true) в getElementById(data).

Переключение между копированием и вставкой

Вы даже можете делать такие вещи, как в менеджерах файлов: Ctrl-Key переключается с перехода на копирование:

function drop(ev) {
  ev.preventDefault();
  var data=ev.dataTransfer.getData("text/html");
  /* Within a Mouse event you can even check the status of some Keyboard-Buttons
     such as CTRL, ALT, SHIFT. */
  if (ev.ctrlKey)
  {
    var nodeCopy = document.getElementById(data).cloneNode(true);
    nodeCopy.id = "newId"; /* We cannot use the same ID */
    ev.target.appendChild(nodeCopy);
  }
  else
    ev.target.appendChild(document.getElementById(data));
}

Ответ 2

Если вам нужен пример использования JQuery, я предоставил этот jsFiddle. По существу вам просто нужно привязываться к событиям drop, dragover и dropstart для объектов DOM. Затем вы можете использовать JQuery-сборку в методе clone() для дублирования элемента.

JQuery также возвращает свою собственную оболочку событий, поэтому вы должны получить originalevent из события JQuery

$('#x').bind('dragstart', function(e) {
    e.originalEvent.dataTransfer.effectAllowed = 'copy';
    e.originalEvent.dataTransfer.setData('Text', '#x');
});

$('#drop-box').bind('drop', function(e) {
    e.preventDefault();
    e.stopPropagation();

    $(this).html($(e.originalEvent.dataTransfer.getData('Text')).clone());

    return false;
}).bind('dragover', false);