drag.js 4.55 KB
var jQuery = require('jquery');

(function ($) {
    var dragging, placeholders = $();
    $.fn.mysortable = function (options) {
        options = options || {};
        return this.each(function () {
            if (/^enable|disable|destroy$/.test(options)) {
                var items = $(this).children($(this).data('items')).attr('draggable', options == 'enable');
                options == 'destroy' && items.add(this)
                    .removeData('connectWith').removeData('items')
                    .unbind('dragstart.h5s dragend.h5s selectstart.h5s dragover.h5s dragenter.h5s drop.h5s');
                return;
            }
            var _self = $(this);

            var index, items = $(this).children(options.items), connectWith = options.connectWith || false;

            var dataArray = options.array;
            var callBack = options.callback;
            console.log(dataArray);
            if (items.length == 0) {
                return;
            }
            for (var i = 0; i < items.length; i++) {
                $(items[i]).attr("drag-index", i);
                items[i]._index = i;
            }

            var placeholder = $('<' + items[0].tagName + ' class="sortable-placeholder">');
            placeholder.css("border", "2px dashed red");
            placeholder.css("height", $(items[0]).height());

            var handle = options.handle, isHandle;
            items.find(handle).mousedown(function () {
                isHandle = true;
            }).mouseup(function () {
                isHandle = false;
            });

            var isInput = false;
            items.find("input").mousedown(function () {
                isInput = true;
            });
            items.mouseup(function () {
                isInput = false;
            });

            $(this).data('items', options.items)
            placeholders = placeholders.add(placeholder);
            if (connectWith) {
                $(connectWith).add(this).data('connectWith', connectWith);
            }
            items.attr('draggable', 'true').bind('dragstart.h5s', function (e) {
                if (handle && !isHandle) {
                    return false;
                }
                if (isInput) {
                    return false;
                }
                isHandle = false;
                var dt = e.originalEvent.dataTransfer;
                dt.effectAllowed = 'move';
                dt.setData('Text', 'dummy');
                dragging = $(this).addClass('sortable-dragging');
                index = dragging.index();
            }).bind('dragend.h5s', function () {
                dragging.removeClass('sortable-dragging').fadeIn();
                placeholders.detach();
                if (index != dragging.index()) {

                    //拖拽返回排序后的数组
                    if (dataArray) {
                        var Array = [], sortArray = [];
                        var itemsUpdate = _self.children(options.items);
                        for (var i = 0; i < itemsUpdate.length; i++) {
                            Array.push(itemsUpdate[i]._index);
                        }
                        for (var i = 0; i < Array.length; i++) {
                            sortArray.push(dataArray[Array[i]]);
                        }
                        if (callBack) {
                            callBack(sortArray);
                        }
                    }

                    //拖拽回调函数
                    items.parent().trigger('sortupdate');
                }
                dragging = null;
            }).not('a[href], img, input').bind('selectstart.h5s', function () {
                this.dragDrop && this.dragDrop();
                return false;
            }).end().add([this, placeholder]).bind('dragover.h5s dragenter.h5s drop.h5s', function (e) {
                if (!items.is(dragging) && connectWith !== $(dragging).parent().data('connectWith')) {
                    return true;
                }
                if (e.type == 'drop') {
                    e.stopPropagation();
                    placeholders.filter(':visible').after(dragging);
                    return false;
                }
                e.preventDefault();
                e.originalEvent.dataTransfer.dropEffect = 'move';
                if (items.is(this)) {
                    dragging.hide();
                    $(this)[placeholder.index() < $(this).index() ? 'after' : 'before'](placeholder);
                    placeholders.not(placeholder).detach();
                }
                return false;
            });
        });
    };
})(jQuery);