【发布时间】:2015-09-14 18:31:15
【问题描述】:
问题:为什么解开 jQuery 元素并应用事件侦听器会起作用,但是当我将事件侦听器直接应用于 jQuery 元素时,它不起作用?见下文...
通过以下代码,我试图捕捉到原始位置的拖动距离。当用户从原点拖动超过 120 像素时,我会向控制台打印我们“超出边界”。
如果我通过解开 jQuery 元素来添加监听器,它会按预期工作并触发调用:
$btnItem[0].addEventListener("drag", function (e) { self.handleDrag(e); }, false);
如果我将侦听器添加到实际的 jQuery 元素,它不会触发调用:
$btnItem.on('drag', e=> self.handleDrag(e));
关于为什么解开 jQuery 元素有效但实际 jQuery 方法无效的任何想法? jQuery似乎失去了与鼠标位置的联系。
HTML:
<div style="padding:100px;">
<span id="dragMe" draggable="true">Drag</span>
</div>
CSS:
#dragMe{
display: inline-block;
padding: 6px 12px;
margin-bottom: 0;
font-size: 14px;
font-weight: 400;
line-height: 1.42857143;
text-align: center;
white-space: nowrap;
vertical-align: middle;
-ms-touch-action: manipulation;
touch-action: manipulation;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-image: none;
border: 1px solid transparent;
border-radius: 4px;
color: #fff;
background-color: #337ab7;
border-color: #2e6da4;
}
代码:
var oPos = [];
function handleDragStart(e) {
oPos = [e.clientX, e.clientY];
e.target.style.opacity = '0.4'; // this / e.target is the source node.
}
function handleDrag(e) {
var nPos = [e.clientX, e.clientY];
var d = Math.sqrt((oPos[0] - nPos[0]) * (oPos[0] - nPos[0]) + (oPos[1] - nPos[1]) * (oPos[1] - nPos[1]));
if (d > 120) {
console.log('outside of the boundary');
}
}
function handleDragEnd(e) {
e.target.style.opacity = '1.0'; // this / e.target is the source node.
}
function jQueryUnWrap(){
var $btnItem = $("#dragMe");
$btnItem[0].addEventListener("dragstart", function(e) {
handleDragStart(e);
}, false);
$btnItem[0].addEventListener("dragend", function (e) {
handleDragEnd(e);
}, false);
$btnItem[0].addEventListener("drag", function (e) {
handleDrag(e);
}, false);
}
function jQueryWrap(){
var $btnItem = $("#dragMe");
$btnItem.on('dragstart', e=> handleDragStart(e));
$btnItem.on('dragend', e=> handleDragEnd(e));
$btnItem.on('drag', e=> handleDrag(e));
}
$(document).ready(function(){
jQueryUnWrap();
//jQueryWrap();
});
【问题讨论】:
-
为什么要重新定义 jQuery?建议您创建一个复制您的问题的演示
-
jQuery 规范化事件对象,很可能规范化的事件对象不包含您期望的属性。我建议将其记录到控制台并检查它。或者,您可以使用
e.originalEvent.whateverproperty返回原始事件对象,但是,对于跨浏览器支持,我建议尽可能使用规范化事件对象。 在这种情况下,这似乎是不可能的。 -
@charlietfl - 它只是一个函数名,我重命名了它。我在上面添加了 JSFiddle 链接
-
@Pointy - self 是我从应用程序中提取出来的,我修复了它
-
那么您根本不必使用箭头函数 - 只需
$("#dragMe").on("dragstart", handleDragStart)即可。
标签: javascript jquery html draggable