Ответ 1
Я нашел хитрое решение:
<label draggable="true" ondragstart="event.dataTransfer.setData('text/plain', '')">
<input type="button" value="Click me!" style="pointer-events: none" onclick="console.log(event)">
</label>
Возможно ли сделать операцию <button>
(<input type="button">
) с перетаскиванием HTML5 в Mozilla Firefox (при этом все еще можно нажать)?
Следующий фрагмент работает в Google Chrome, но кнопка и div с кнопкой нельзя перетаскивать Mozilla Firefox (если не нажата клавиша Alt, не знаю о мобильном телефоне):
document.getElementById("myDiv").addEventListener(
"dragstart",
function (e) {
e.dataTransfer.setData("Text", "myDiv")
}
);
document.getElementById("myButton").addEventListener(
"dragstart",
function (e) {
e.dataTransfer.setData("Text", "myButton")
}
);
document.getElementById("myDivWithButton").addEventListener(
"dragstart",
function (e) {
e.dataTransfer.setData("Text", "myDivWithButton")
}
);
<div id="myDiv" draggable="true">Div</div>
<button id="myButton" draggable="true">Button</button>
<div id="myDivWithButton" draggable="true"><button>Div with Button</button></div>
Я нашел хитрое решение:
<label draggable="true" ondragstart="event.dataTransfer.setData('text/plain', '')">
<input type="button" value="Click me!" style="pointer-events: none" onclick="console.log(event)">
</label>
В Firefox уже есть ошибка, в которой вы не можете перетащить кнопку. https://bugzilla.mozilla.org/show_bug.cgi?id=568313
Однако вы можете перетащить свою кнопку, содержащую div, которая сейчас не перетаскивается, используя псевдокласс "after". Пример:
document.getElementById("myDivWithButton").addEventListener(
"dragstart",
function (e) {
e.dataTransfer.setData("Text", "myDivWithButton")
}
);
.frontdrop {
position: relative;
}
.frontdrop:after {
content: '';
top: 0;
left: 0;
right: 0;
bottom: 0;
position: absolute;
}
<div id="myDivWithButton" class="frontdrop" draggable="true"><button>Div with Button</button></div>
Из других я узнал, что ваша проблема связана с ошибкой в Firefox. Я предлагаю вам реализовать пользовательские прослушиватели для имитации события перетаскивания. Мое решение таково:
var btn = document.getElementById('btn');
var btnPressed = false;
btn.addEventListener('mousedown', function(e) {
btnPressed = true;
px = e.clientX;
py = e.clientY;
});
btn.addEventListener('mouseup', function(e) {
btnPressed = false;
})
window.addEventListener('mouseup', function(e) {
btn.style.MozTransform = "";
btn.style.WebkitTransform = "";
btn.style.opacity = 1;
})
window.addEventListener('mousemove', function(e) {
if(btnPressed) {
dx = e.clientX - px;
dy = e.clientY - py;
btn.style.opacity = 0.85;
btn.style.MozTransform = "translate(" + dx + "px, " + dy + "px)";
btn.style.WebkitTransform = "translate(" + dx + "px, " + dy + "px)";
}
})
<button id="btn">Drag Me</button>
Решение прост с jQuery UI:
$(function() {
$("div.Icon").draggable({ // in "div.icon" is you class
grid: [80, 80], // for my project I needed a grid
containment: "document" // will stay in your display
});
});
Вы можете дать небольшой выступ, который можно перетаскивать рядом с кнопкой.
.frontdrop:after {
content: '';
top: 0;
left: 0;
right: 20;
bottom: 0;
border-width="1";
border-style: solid;
position: absolute;
}