Jquery拖延问题

时间:2013-02-01 11:40:26

标签: jquery jquery-ui draggable jquery-ui-draggable

基本上我想要的是,当我拖动时,如果我走到收容区域外并释放鼠标,那么可拖动元素就会粘到我离开收容区域的边界。当我将光标移回时,元素会回到光标处。当您只是移动光标(而不是拖动)并且元素仍然被拖动时,它看起来不太好。

Here是一个小提琴。只需拖动并将光标释放到输出区域外,您就会得到我正在谈论的内容。

我在考虑两种方式

  1. 在拖动时限制鼠标移动到包含区域(我搜索了它并且没有找到如何操作。这可能不可能吗?)

  2. 如果光标离开容器区域,则将可拖动恢复到其位置。 (仍然找不到办法做到这一点)

  3. 任何方式或更明智的想法来实现这一点???

    Relevant Code(对于stackoverflow)

2 个答案:

答案 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();
     });
}

Working Fiddle

编辑:感谢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的帮助