jQuery UI のバグにぶつからずにソートをキャンセルする唯一の方法は、ソートを非同期にキャンセルすることです。
他の人が提案したように停止オプションを使用することは、ユーザーが最初に画面上でアイテムをドラッグし、完了したらキャンセルできるため、受け入れられません。これは、特定のアイテムのドラッグを「防止」するというOPの当初の懸念を満たしません。
ソート イベント中にソート可能をキャンセルしようとすると、jQuery UI でエラーが発生します。のようなエラーUncaught TypeError: Cannot read property '0' of null
ユーザーがドラッグを開始すると、画面に短いフラッシュが表示されます。しかし、ドラッグはすぐにキャンセルされ、JS エラーは発生しません。
var isCancel = false;
element.sortable({
start: function() { isCancel = false; },
sort: function(event, ui) { // prevent dragging if row has dynamically assigned class
if (ui.item.hasClass('no-drag')) {
isCancel = true;
// allow current jQuery UI code to finish runing, then cancel
setTimeout(function() {
element.sortable('cancel');
}, 0);
}
},
stop: function() {
if (isCancel) return;
// your normal processing here
},
});