предисловие
Перетаскивание (drap && drop) часто встречается в нашей обычной работе. Это означает: возьмите объект, а затем перетащите его в другое место. В настоящее время он является частью стандарта HTML5. Я изучал и практиковал эту функцию несколькими способами.
Событие, соответствующее процессу перетаскивания
Давайте сначала посмотрим на процесс перетаскивания:
选中 ---> 拖动 ---> 释放
Затем давайте шаг за шагом рассмотрим, что происходит в этом процессе.
проверил
В стандарте HTML5, чтобы сделать элемент перетаскиваемым, установите для свойства draggable значение true.
Текст, изображения и ссылки можно перетаскивать по умолчанию, и для их свойства draggable автоматически устанавливается значение true.
Изображения и ссылки можно перетаскивать, удерживая левую кнопку мыши, чтобы выбрать их.
Текст можно перетаскивать только в том случае, если он выделен. Если свойство draggable текста настройки отображения установлено, вы также можете перетаскивать его напрямую, удерживая левую кнопку мыши.
свойство draggable: установите, можно ли перетаскивать элемент. грамматика:<element draggable="true | false | auto" >
- правда: можно перетаскивать
- false: отключить перетаскивание
- auto: можно ли перетаскивать его в соответствии с определением браузера.
тянуть
Каждый перетаскиваемый элемент проходит через три процесса в процессе перетаскивания.拖动开始
-->拖动过程中
--> 拖动结束
.
объект | название события | иллюстрировать |
---|---|---|
перетаскиваемый элемент | dragstart | Запускается, когда элемент начинает перетаскиваться |
drag | Повторно срабатывает при перетаскивании элемента | |
dragend | Запускается после завершения операции перетаскивания | |
целевой объект | dragenter | Запускается, когда перетаскиваемый элемент входит в пространство экрана, занятое целевым элементом |
dragover | Запускается, когда перетаскиваемый элемент находится внутри целевого элемента | |
dragleave | Запускается, когда перетаскиваемый элемент покидает элемент назначения, не отпуская его |
По умолчанию события dragenter и dragover отказываются принимать любой перетаскиваемый элемент. Поэтому мы должны предотвратить такое поведение браузера по умолчанию. e.preventDefault();
освобожден
После достижения пункта назначения отпустите событие элемента
объект | название события | иллюстрировать |
---|---|---|
целевой объект | drop | Запускается, когда перетаскиваемый элемент помещается в элемент назначения, обычно для отмены поведения браузера по умолчанию. |
Выберите пример освобождения от перетаскивания
<!DOCTYPE HTML>
<html>
<head>
<title>拖放示例-文本</title>
</head>
<style>
.src {
display: flex;
}
.dropabled {
flex: 1;
}
.txt {
color: green;
}
.img {
width: 100px;
height: 100px;
border: 1px solid gray;
}
.target {
width: 200px;
height: 200px;
line-height: 200px;
text-align: center;
border: 1px solid gray;
color: red;
}
</style>
<body>
<div class="src">
<div class="dragabled">
<div class="txt" id="txt">
所有的文字都可拖拽。
<p draggable="true">此段文字设置了属性draggable="true"</p>
</div>
<div class="url" id="url">
<a href="http://weiqinl.com" target="_blank">我是url:http://weiqinl.com</a>
</div>
<img class="img" id="tupian1" src="img1.png" alt="图片1" />
<img class="img" id="tupian2" src="img2.png" alt="图片2" />
</div>
<div id='target' class="dropabled target">Drop Here</div>
</div>
<script>
var dragSrc = document.getElementById('txt')
var target = document.getElementById('target')
dragSrc.ondragstart = handle_start
dragSrc.ondrag = handle_drag
dragSrc.ondragend = handle_end
function handle_start(e) {
console.log('dragstart-在元素开始被拖动时候触发')
}
function handle_drag() {
console.log('drag-在元素被拖动时候反复触发')
}
function handle_end() {
console.log('dragend-在拖动操作完成时触发')
}
target.ondragenter = handle_enter
target.ondragover = handle_over
target.ondragleave = handle_leave
target.ondrop = handle_drop
function handle_enter(e) {
console.log('handle_enter-当元素进入目的地时触发')
// 阻止浏览器默认行为
e.preventDefault()
}
function handle_over(e) {
console.log('handle_over-当元素在目的地时触发')
// 阻止浏览器默认行为
e.preventDefault()
}
function handle_leave(e) {
console.log('handle_leave-当元素离开目的地时触发')
// 阻止浏览器默认行为
// e.preventDefault()
}
function handle_drop(e) {
console.log('handle_drop-当元素在目的地放下时触发')
var t = Date.now()
target.innerHTML = ''
target.append(t + '-拖放触发的事件。')
e.preventDefault()
}
</script>
</body>
</html>
Событие перетаскивания срабатывает
Во всем процессе перетаскивания то, что мы сказали выше, является поверхностным явлением, что еще произойдет внутри процесса события? См. объект DataTransfer ниже 👇.
Объект передачи данных
Объект, отправляемый одновременно с событием, вызванным операцией перетаскивания, — это DragEvent, производный от MouseEvent, обладающий всеми функциями объектов Event и MouseEvent и добавляющий свойство dataTransfer. Это свойство используется для сохранения перетаскиваемых данных и информации о взаимодействии и возвращает объект DataTransfer.
// DataTransfer dataTransfer = DragEvent.dataTransfer
Объект DataTransfer определяет множество свойств и методов, рассмотрим некоторые из стандартных.
Атрибуты | иллюстрировать |
---|---|
types | Свойство только для чтения. Он возвращает массив формата данных перетаскивания, который мы установили в событии dragstart. Порядок форматирования такой же, как порядок данных, содержащихся в операции перетаскивания. Это свойство поддерживается IE10+, Edge, Safari3.1, Firefox3.5+ и Chrome4 и выше. |
files | Возвращает список файлов в операции перетаскивания. Содержит список всех локальных файлов, доступных при передаче данных. Если операция перетаскивания не включает перетаскивание файлов, это свойство является пустым списком. |
dropEffect | Получите тип текущей выбранной операции перетаскивания или задайте для операции новый тип. Всегда должно быть установлено одно из возможных значений effectAllowed [none, move, copy, link]. DropEffect устанавливается для цели перетаскивания в обработчике событий перетаскивания. |
effectAllowed | Указывает эффекты, разрешенные для операций перетаскивания. Должен быть одним из них [ none, copy, copyLink, copyMove, link, linkMove, move, all, uninitialized ] По умолчанию неинициализировано, что означает, что разрешены все эффекты. Установите свойство effectAllowed в обработчике ondragstart |
метод | иллюстрировать |
---|---|
void setData(format, data) | Устанавливает данные перетаскивания для операции перетаскивания на указанные данные и тип. формат может быть типом MIME |
String getData(format) | Возвращает данные в указанном формате, формат такой же, как в setData() |
void clearData([format]) | Удаляет данные для операции перетаскивания заданного типа. Если данные данного типа не существуют, этот метод ничего не делает. Если аргументы не указаны, удаляются все типы данных. |
void setDragImage(img, xOffset, yOffset) | Указывает изображение, которое будет отображаться под курсором при перетаскивании. В большинстве случаев задавать не нужно, поскольку перетаскиваемый узел создается как образ по умолчанию. Параметры x, y указывают горизонтальное и вертикальное смещения изображения соответственно. |
//IE10及之前版本,不支持扩展的MIME类型名
//Firefox 5版本之前,不能正确的将url和text映射为text/uri-list 和text/plain
var dataTransfer = event.dataTransfer;
//读取文本,
var text = dataTransfer.getData("Text");
//读取URL,
var url = dataTransfer.getData("url") || dataTransfer.getData("text/uri-list");
Пример каждого метода атрибута drag-drop-dataTransfer
поддержка браузера
Сказав так много, если браузер не поддерживает это, это тоже ерунда.
Method of easily dragging and dropping elements on a page, requiring minimal JavaScript.
Минимальные требования js, простой способ перетаскивания элементов страницы для достижения
Поддержка браузера для перетаскивания --caniuse

note
-
dataTransfer.items
Поддерживается только Chrome -
dropzone
свойство, в настоящее время не поддерживаемое браузерами - Поддержка Firefox
.setDragImage
Любой тип элемента DOM. Хром должен иметьHTMLImageElement
или любой элемент DOM, прикрепленный к DOM и браузеру..setDragImage
Внутри видового экрана.
1. Частичная поддержка означает отсутствие поддержкиdataTransfer.files
или.types
объект
2. Частичная поддержка означает отсутствие поддержки.setDragImage
3. Средства частичной поддержкиdataTransfer.setData / getData
ограниченное количество поддерживаемых форматов для
Ниже я столкнулся на практике, каждый браузер все же имеет отличия в реализации стандарта.
-
getData()
В браузере chrome 62.0 возможно толькоdrop
эффективен в мероприятии. - При использовании
setDragImage
метод, указанное изображение не существует, то процесс перетаскивания:- Браузер сафари 11.0.1, только триггеры
dragstart
а такжеdragend
мероприятие. - Chrome, Opera и Firefox запускают другие события нормально.
- Браузер сафари 11.0.1, только триггеры
- Каждый раз, когда вы перетаскиваете мышью, Firefox будет открывать новую страницу и автоматически искать
dataTransfer.getData()
полученный контент.
решение, вdrop
В событии добавить:e.stopPropagation();// 不再派发事件。解决Firefox浏览器,打开新窗口的问题
. - В опере 49 версии ссылку по умолчанию нельзя перетаскивать, она должна быть
draggable
свойство установлено наtrue
, его можно перетащить. - о
dropEffect
а такжеeffectAllowed
.-
effectAllowed
Существует не более нескольких эффектов, позволяющих выполнять операции перетаскивания.dropEffect
Настройка конкретного эффекта операции перетаскивания может быть только одной из четырех возможностей. - если
effectAllowed
Установить какnone
, перетаскивание элементов запрещено. Однако события, которые могут быть вызваны каждым браузером, различаются. (Примечание: Safari может перетаскивать элементы, и все события будут запущены) - если
dropEffect
Установить какnone
, его нельзя перетаскивать в целевой элемент. - если установлено
effectAllowed
значение, то если вы хотите установитьdropEffect
значение, которое должно быть таким же, какeffectAllowed
Значение такое же, в противном случае эффект перетаскивания недействителен, и перетаскиваемый элемент не может быть помещен на элемент назначения. (Примечание: Safari11.0.1 работает и его также можно перетащить в элемент назначения, но это не стандартно).
-
Пример
Пример каждого метода атрибута drag-drop-dataTransfer
Событие перетаскивания срабатывает
Суммировать
Собственный API перетаскивания HTML5, перетаскивание и перетаскивание встречается во многих ситуациях в реальной работе.
Выше я представил только некоторые часто используемые API. API не сложный, просто посмотрите на него некоторое время, и вы узнаете его на практике. У каждого браузера может быть немного разная производительность, но я считаю, что все равно все будут развиваться в направлении стандарта.
Кстати, когда первый раз писал статью в Наггетс, редактор уценки отличный 👍.
Блог Парк Адрес:www.cnblogs.com/weiqinl