我在 jQuery 中创建了一个“2d 滑块”,其中通过在边界框中拖动“句柄”来同时操作 2 个参数。
我通过在父 div 中嵌套一个“句柄”div 并使用 jQuery UI 插件来促进拖动行为来实现这一点。html 看起来像:
<div class="Slider2d" id="grid_spacing_both">
<div class="Slider2dHandle" id="grid_spacing_both_handle"></div>
</div>
jQuery 看起来像:
$(".Slider2dHandle").draggable({
containment: "parent",
scroll: false,
drag: function(event, ui) {
// calculates position and updates value input boxes
}
});
我还创建了一些代码,将句柄重新定位到父 div 中任何点击的位置:
$(".Slider2d").mousedown(function(event){
// get location of click and reposition handle to click location
});
我想做的是修改上述方法,以便用户可以单击父 div 中的某个位置,将句柄重新定位到单击位置,然后开始拖动句柄而不让鼠标按钮向上。基本上,我需要找到一种以编程方式触发拖动功能的方法。
我在这里和这里找到了一些建议,并尝试通过更改上述方法来实施他们的建议,如下所示:
$(".Slider2d").mousedown(function(event){
// get location of click and reposition handle to click location
handle = $(".Slider2d").children(".Slider2dHandle");
handle.trigger(event);
});
这在最技术意义上是有效的,但它超级慢,我从 Safari 收到一堆错误消息,告诉我“RangeError:超出最大调用堆栈大小”。我在想正在发生的是,当我在句柄上触发事件时,它会冒泡到父级,然后再次调用触发器,依此类推。我试图通过在 .trigger() 调用之前和之后将 event.stopPropagation 扔到我的代码中来阻止冒泡,但无济于事。
因此,如果有人对如何使这项工作有任何建议,我将不胜感激。我在这里有一个备用计划,但这在我看来是不必要的复杂。
谢谢!