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ドキュメントの範囲を超えてそこからイベントをディスパッチできます。