Я добавляю html5 drag and drop uploader на мою страницу.
Когда файл попадает в область загрузки, все работает отлично.
Однако, если я случайно уронил файл за пределы области загрузки, браузер загрузит локальный файл, как будто это новая страница.
Как я могу предотвратить это поведение?
Спасибо!
javascript
jquery
html
drag-and-drop
Travis
источник
источник
Ответы:
Вы можете добавить прослушиватель событий в окно, которое вызывает
preventDefault()
все события перетаскивания и удаления.Пример:
источник
dragover
иdrop
обработчики необходимы, чтобы браузер не загружал удаленный файл. (Chrome последний 2015/08/03). Решение работает и на FF последней.<input type="file" />
. Нужно проверить,e.target
есть ли файл ввода и пропустить такие события.После долгих раздумий я обнаружил, что это самое стабильное решение:
Установка обоих
effectAllow
иdropEffect
безоговорочно в окне заставляет мою зону удаления больше не принимать dnd, независимо от того, установлены ли свойства новыми или нет.источник
Для jQuery правильный ответ будет:
Здесь
return false
будет вести себя какevent.preventDefault()
иevent.stopPropagation()
.источник
Чтобы разрешить перетаскивание только для некоторых элементов, вы можете сделать что-то вроде:
источник
попробуй это:
источник
Предотвращение всех операций перетаскивания по умолчанию может оказаться не тем, что вам нужно. Можно проверить, является ли источник перетаскивания внешним файлом, по крайней мере, в некоторых браузерах. Я включил функцию, чтобы проверить, является ли источник перетаскивания внешним файлом в этом ответе StackOverflow .
Изменив ответ Digital Plane, вы можете сделать что-то вроде этого:
источник
e || event;
? Гдеevent
определяется? Неважно. Похоже, это глобальный объект в IE? Я нашел эту цитату,"In Microsoft Visual Basic Scripting Edition (VBScript), you must access the event object through the window object."
здесьПо моему опыту, эта проблема впервые возникает, когда вы добавляете функцию удаления файла на страницу. Поэтому я считаю, что компонент, который добавляет это, также должен отвечать за предотвращение выпадения за пределы зоны сброса.
В моем решении зона сброса является входом с классом, но любой однозначный селектор работает.
Слушатели добавляются / удаляются автоматически при создании / уничтожении компонента, а другие компоненты, использующие одну и ту же стратегию на одной странице, не мешают друг другу из-за stopPropagation ().
источник
Чтобы построить метод проверки цели, описанный в нескольких других ответах, вот более общий / функциональный метод:
Называется как:
источник
function preventDefaultExcept(...predicates){}
. И затем используйте это какpreventDefaultExcept(isDropzone, isntParagraph)
У меня есть HTML
object
(embed
), который заполняет ширину и высоту страницы. Ответ @ digital-plane работает на обычных веб-страницах, но не в том случае, если пользователь падает на внедренный объект. Поэтому мне нужно было другое решение.Если мы переключимся на использование фазы захвата событий, мы сможем получить события до того, как встроенный объект получит их (обратите внимание на
true
значение в конце вызова слушателя событий):Используя следующий код (на основе ответа @ digital-plane), страница становится целью перетаскивания, она предотвращает встраивание объектов в события и затем загружает наши изображения:
Проверено на Firefox на Mac.
источник
Я использую селектор классов для нескольких областей загрузки, поэтому мое решение приняло эту менее чистую форму
Основано на ответе Акселя Амтора с зависимостью от jQuery (с псевдонимом $)
источник