2015-10-20 85 views
0

我有一个大的jQuery UI droppable,被其他元素覆盖。当我将draggable悬停在实际上掩盖了droppable的元素上时,droppable仍然收到ui-state-hover类。我们如何避免这种情况?jQuery UI:拒绝拖放部分覆盖可拖放?

看起来没有机会实施droppable s.t.的accept函数。它通过光标坐标来决定,至少我不能得到它的工作:如果返回false一次,它将不会再被查询,直到光标重新进入被遮蔽的droppable

回答

0

不确定是否有原生的方式。但是,您也可以使覆盖元素droppable以及overout禁用并启用“真实”droppable。像这样的例子:

$('#droppable').droppable({ 
 
    accept: '#draggable:not(.overObscure)', 
 
    greedy: true, 
 
    overlay: 'ha', 
 
    drop: function (e, ui) { 
 
     console.log(this) 
 
    } 
 
}); 
 

 
$('#overlay').droppable({ 
 
    accept: '#draggable', 
 
    over: function (e, ui) { 
 
     ui.draggable.addClass('overObscure'); 
 
    }, 
 
    out: function (e, ui) { 
 
     ui.draggable.removeClass('overObscure'); 
 
    } 
 
}); 
 

 

 
$('#draggable').draggable();
#droppable { 
 
    width: 300px; 
 
    height: 300px; 
 
    background-color: #ddd; 
 
} 
 
#overlay { 
 
    width: 100px; 
 
    height: 100px; 
 
    position: absolute; 
 
    top: 0px; 
 
    left: 0px; 
 
    background-color: blue; 
 
} 
 
#draggable { 
 
    width: 25px; 
 
    height: 25px; 
 
    background-color: yellow; 
 
}
<script type='text/javascript' src='//code.jquery.com/jquery-2.0.2.js'></script> 
 
<script type="text/javascript" src="//code.jquery.com/ui/1.10.3/jquery-ui.js"></script> 
 
<link rel="stylesheet" type="text/css" href="//code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css"> 
 

 
<div id="droppable"></div> 
 
<div id="overlay"></div> 
 
<div id="draggable"></div>

您还可以添加行为,可放开,以便更容易调用。像这样的例子:

$.widget("ui.droppable", $.ui.droppable, { 
 
    _create: function() { 
 
     var that = this; 
 
     this._super(); 
 
     $(this.options.overlay).droppable({ 
 
      accept: this.options.accept, 
 
      over: function (e, ui) { 
 
       that.options.disabled = true; 
 
      }, 
 
      out: function (e, ui) { 
 
       that.options.disabled = false; 
 
      } 
 
     }); 
 
    } 
 
}) 
 

 
$('#droppable').droppable({ 
 
    accept: '#draggable', 
 
    greedy: true, 
 
    overlay: '#overlay', 
 
    drop: function (e, ui) { 
 
     console.log('dropped') 
 
    } 
 
}); 
 

 
$('#draggable').draggable();
#droppable { 
 
    width: 300px; 
 
    height: 300px; 
 
    background-color: #ddd; 
 
} 
 
#overlay { 
 
    width: 100px; 
 
    height: 100px; 
 
    position: absolute; 
 
    top: 0px; 
 
    left: 0px; 
 
    background-color: blue; 
 
} 
 
#draggable { 
 
    width: 25px; 
 
    height: 25px; 
 
    background-color: yellow; 
 
}
<script type='text/javascript' src='//code.jquery.com/jquery-2.0.2.js'></script> 
 
<script type="text/javascript" src="//code.jquery.com/ui/1.10.3/jquery-ui.js"></script> 
 
<link rel="stylesheet" type="text/css" href="//code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css"> 
 

 
<div id="droppable"></div> 
 
<div id="overlay"></div> 
 
<div id="draggable"></div>