0

私はここで利用できる単純化された「ドラッグ可能な」関数をカスタマイズしています:jQuery-UIなしでドラッグ可能であり、これは私がこれまでに持っているものです:

$.fn.extend({
        canDragMe: function(){
        return this.each(function() {
        var $this = $(this);
        $this = $(this);
        return $this.css('cursor', opt.cursor).on("mousedown", function(e) {
            var $drag = $this.addClass('draggable');
                drg_h = $drag.outerHeight(),
                drg_w = $drag.outerWidth(),
                pos_y = $drag.offset().top + drg_h - e.pageY,
                pos_x = $drag.offset().left + drg_w - e.pageX;
            $drag.on("mousemove", function(e) {
                $('.draggable').offset({
                    top:e.pageY + pos_y - drg_h,
                    left:e.pageX + pos_x - drg_w
                }).on("mouseup", function() {
                    $this.removeClass('draggable');
                });
            });
            e.preventDefault(); // disable selection
        }).on("mouseup", function() {
                $this.removeClass('draggable');
            }
        });

    });
});

私はそれをこのように使うつもりです:$('#mydiv').canDragMe();。ただし、ユーザー入力に応じて、要素のドラッグのオンとオフを切り替える必要があります。

だから私の質問は、ドラッグをオフにする最も簡単な方法は何ですか?好き$('#mydiv').canNotDragMe();か多分$('#mydiv').canDragMe(false);(もちろんプラグインの入力オプションが必要です)。

編集

上記のアクションをマウスダウンからバインド解除する何らかの実装が必要であることを理解していますか?または、プラグインを「破壊」する方法はありますか?

4

1 に答える 1

2

cannotDragMe元のメソッドで設定されているハンドラーのバインドを解除するだけで、基本的なメソッドを作成できます。オリジナルはを使用しているので、新しい方法でそれらをオフにするために.on()使用できます。.off()

注:提供したコードが、参照したサイトのコードとは異なることにも気づきました。サイトのコードの方がパフォーマンスが良かったので、代わりにそれを使用しました。また、イベントに名前空間を追加して、バインドを解除するつもりのないものを誤ってバインド解除しないようにしました。.on().off()

更新されたjQueryExtendメソッド-jsfiddle

$.fn.extend({
    cannotDragMe: function () {
        return this.each(function () {
            var $this = $(this);
            $this = $(this);
            return $this.css('cursor', 'default').off("mousedown.drag").off("mousemove.drag").off("mouseup.drag");
        });
    },
    canDragMe: function (opt) {
        opt = $.extend({
            handle: "",
            cursor: "move"
        }, opt);

        var $el;
        if (opt.handle === "") {
            $el = this;
        } else {
            $el = this.find(opt.handle);
        }

        return $el.css('cursor', opt.cursor).on("mousedown.drag", function (e) {
            var $drag;
            if (opt.handle === "") {
                $drag = $(this).addClass('draggable');
            } else {
                $drag = $(this).addClass('active-handle').parent().addClass('draggable');
            }
            var z_idx = $drag.css('z-index'),
                drg_h = $drag.outerHeight(),
                drg_w = $drag.outerWidth(),
                pos_y = $drag.offset().top + drg_h - e.pageY,
                pos_x = $drag.offset().left + drg_w - e.pageX;
            $drag.css('z-index', 1000).parents().on("mousemove.drag", function (e) {
                $('.draggable').offset({
                    top: e.pageY + pos_y - drg_h,
                    left: e.pageX + pos_x - drg_w
                }).on("mouseup.drag", function () {
                    $(this).removeClass('draggable').css('z-index', z_idx);
                });
            });
            e.preventDefault(); // disable selection
        }).on("mouseup.drag", function () {
            if (opt.handle === "") {
                $(this).removeClass('draggable');
            } else {
                $(this).removeClass('active-handle').parent().removeClass('draggable');
            }
        });
    }
});
于 2013-02-19T00:09:38.587 に答える