基本上我想要的是,当我拖动时,如果我走到收容区域外并释放鼠标,那么可拖动元素就会粘到我离开收容区域的边界。当我将光标移回时,元素会回到光标处。当您只是移动光标(而不是拖动)并且元素仍然被拖动时,它看起来不太好。
Here是一个小提琴。只需拖动并将光标释放到输出区域外,您就会得到我正在谈论的内容。
我在考虑两种方式
在拖动时限制鼠标移动到包含区域(我搜索了它并且没有找到如何操作。这可能不可能吗?)
如果光标离开容器区域,则将可拖动恢复到其位置。 (仍然找不到办法做到这一点)
任何方式或更明智的想法来实现这一点???
Relevant Code
(对于stackoverflow)
答案 0 :(得分:1)
我认为这是因为它在iframe中。 这就像在浏览器外拖动一样。 mouseup事件不会在页面中注册。
看起来Chrome不允许这样,但firefox确实如此。
试试这个: fiddle
$('body').mouseleave(function()
{
$(document).trigger("mouseup");
});
这是您的解决方案,无需每次都设置事件。
overkill版本(这将允许用户暂时(1秒)离开iframe并返回而不会失去拖动):
$('body').prop('mouseuptimer',null)
.mouseleave(function()
{
var objTimer = setTimeout(function()
{
$(document).trigger("mouseup")
}, 1000);
$(document).prop('mouseuptimer', objTimer);
})
.mouseenter(function()
{
var objTimer = $(document).prop('mouseuptimer');
if (objTimer) clearTimeout(objTimer);
});
$(function()
{
$( "#sortable" ).sortable({revert: true });
$( "#draggable" ).draggable({
connectToSortable: "#sortable",
helper: "clone",
revert: "invalid" });
$( "ul, li" ).disableSelection();
});
编辑:
回答你的第一个问题:
您可以通过在选项中添加“包含”来包含可拖动,例如:
$( "#draggable" ).draggable({
connectToSortable: "#sortable",
helper: "clone",
revert: "invalid",
containment: "document" });
但是这只能包含被拖动的元素到边界框(在这种情况下是“文档”,但它也可以是“父”或“#somediv”)。 鼠标光标仍然可以移动到iframe之外的任何位置,并从那里调度事件,超出了iframe文档的范围。
答案 1 :(得分:0)
好的,我找到了解决方法。适用于IE8和Chrome。
为可拖动元素添加了此代码。
drag: function(){
$('body').mouseleave(function(){
$('body').mouseup();
});
}
编辑:感谢Rembunator指出了这个漏洞,我决定使用.one()来提高性能,并将代码从拖动转移到开始
start: function(){
$('body').one("mouseleave", function(){
$('body').mouseup();
});
}
编辑2:
终于找到了解决方案。
以下是代码:
var flag=true;
start: function( event, ui ){
if(flag){
flag = false;
$('body').one("mouseleave", function(){
$('body').mouseup();
flag = true; //event occured, rebind
});
}
else{
flag = false;
}
}
感谢Rembunator的帮助