我认为这是因为它在 iframe 中。这就像在浏览器之外拖动一样。mouseup 事件不会在页面中注册。
看起来 chrome 不允许这样做,但 Firefox 允许。
试试这个:
小提琴
$('body').mouseleave(function()
{
$(document).trigger("mouseup");
});
这是您的解决方案,无需每次都设置事件。
矫枉过正的版本(这将允许用户暂时(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 文档的范围。