SetDragImage не удаляет призрачное изображение в Chrome?

У меня есть элемент, который можно перетаскивать. Я хочу удалить призрачное изображение, поскольку я буду создавать его другим способом.

Однако Google Chrome не позволяет мне остановить появление призрачного изображения с помощью setDragImage(). Пустое изображение создается перед перетаскиванием, и я использую setDragImage() внутри обработчика событий dragstart, поэтому я не понимаю, что я делаю неправильно. Призрачное изображение не должно появляться.

Вот пример:

const blankCanvas = document.createElement('canvas');

document.querySelector('.item')
  .addEventListener('dragstart', (e) => {
    e.dataTransfer.setDragImage(blankCanvas, 0, 0);
  });
.item {
  display: inline-block;
  width: 5rem;
  height: 5rem;
  overflow: hidden;
  margin: 1rem;
  border: 2px solid #fe0000;
  cursor: pointer;
}

.item__img {
  width: 100%;
  height: auto;
}
<div draggable = "true" class = "item">
  <img src = "https://i.stack.imgur.com/drhx7.png" alt = "" class = "item__img">
</div>

В Chrome, если вы перетащите рамку с красной рамкой, появится призрачное изображение, даже если я использую setDragImage(). В Firefox все работает правильно (а Edge ... даже не имеет функции).

Моя версия Chrome - 66.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
2 097
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема исходит из изображения. Если вы попытаетесь перетащить красную рамку, все будет работать правильно. Проблема появится только тогда, когда начнется перетаскивание изображения внутри перетаскиваемого элемента. Возможно, в Chrome есть особая обработка изображений; Я не знаю.

Вы можете смягчить это, отключив события указателя на изображении:

.item img {
  pointer-events: none;
}

Вот рабочий пример:

const blankCanvas = document.createElement('canvas');

document.querySelector('.item')
  .addEventListener('dragstart', (e) => {
    e.dataTransfer.setDragImage(blankCanvas, 0, 0);
  });
.item {
  display: inline-block;
  width: 5rem;
  height: 5rem;
  overflow: hidden;
  margin: 1rem;
  border: 2px solid #fe0000;
  cursor: pointer;
}

.item__img {
  width: 100%;
  height: auto;
  
  /* The fix */
  pointer-events: none;
}
<div draggable = "true" class = "item">
  <img src = "https://i.stack.imgur.com/drhx7.png" alt = "" class = "item__img">
</div>

Вы знаете, как удалить значок глобуса, который добавляется к курсору в этом примере? Я видел, как некоторые предлагали использовать onmousedown = "event.preventDefault()", но это полностью отключает перетаскивание.

anabella 12.03.2021 12:18

Я не совсем понимаю, что вы подразумеваете под "значком земного шара". Вы про курсор Not Allowed? Если так, то я не думаю, что есть простой способ изменить это. Я считаю, что курсоры, используемые при перетаскивании, основаны на платформе. Для пользовательских курсоров вам придется заново реализовать собственное перетаскивание с помощью JavaScript.

Andrew Myers 12.03.2021 15:22

Этот значок земного шара очень расстраивает

ness-EE 22.06.2021 16:41

@ ness-EE Если вы говорите о запрещенном курсоре, я думаю, это означает, что ваша мышь не находится над допустимой целью перетаскивания. Может быть, если бы у вас был контейнер, который является допустимой целью перетаскивания, окружающий изображение, тогда курсор не сразу превратился бы в Not Allowed. Но это немного выходит за рамки этого вопроса.

Andrew Myers 22.06.2021 17:33

Неа ... Я про значок глобуса -> stackoverflow.com/questions/6771196/…

ness-EE 22.06.2021 18:19

@ ness-EE Я видел этот вопрос, но все еще не уверен, что такое земной шар. Я использую Chrome, но вижу только курсор "Не разрешен". Вы можете сделать снимок экрана или ссылку на изображение?

Andrew Myers 22.06.2021 20:20

Другие вопросы по теме