Droppable запускает событие OUT после DROP - PullRequest
0 голосов
/ 09 января 2020

У меня есть партия маленьких камней, которые можно перетаскивать, и в некоторых группах их можно бросить. Для правильного выделения я использую события OVER и OUT. Но у меня есть некоторые проблемы с событием DROP и OUT. Когда я перетаскиваю камень в группе, запускаются события OVER и DROP, но как только я поднимаю следующий камень (переместите его настолько, чтобы я перешел за порог для перетаскивания), «старое» событие OUT

Кто-нибудь сталкивался с такими же проблемами и мог бы помочь мне?

Моя сбрасываемая группа выглядит так:

   $('.group').droppable({
        accept: this.canItBeDropped.bind(this),
        drop: this.drop.bind(this),
        over: this.over.bind(this),
        out: this.out.bind(this),
    });

И мои перетаскиваемые предметы, камни, как это:

    this.$stone.draggable({
        distance: 3,
        revert: 'invalid',
        revertDuration: 400,
        scroll: false,
        stack: '.stone',
        refreshPositions: true, 
    });

РЕДАКТИРОВАТЬ

После дальнейшего поиска в библиотеке, я обнаружил, что она имеет какое-то отношение к моей пользовательской функции принятия , Но библиотека называет его новым камнем, а не старым, как я ожидал.

1 Ответ

0 голосов
/ 10 января 2020

Я наконец исправил проблему и опишу ее, на случай, если в будущем у кого-то возникнет аналогичная проблема.

Проблема была вызвана тем, что как только я уронил камень, моя пользовательская функция accept возвратил бы false, потому что теперь этот камень не помещается в группу, поскольку он уже находится в ней (требование для моего проекта)

Поэтому я решил просто определить результат для оператора if перед фактический сброс

    drop: function( draggable, event ) {

        var dropped = false;

        // Create a copy of the droppables in case the list changes during the drop (#9116)
        $.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {

            if ( !this.options ) {
                return;
            }

            // determine the result for the if statement beofre the dropping
            let deactivate = !this.options.disabled && this.visible 
                && this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) 

            if ( !this.options.disabled && this.visible && 
                    intersect( draggable, this, this.options.tolerance, event ) ) {
                dropped = this._drop.call( this, event ) || dropped;
            }

            if (deactivate) {
                this.isout = true;
                this.isover = false;
                this._deactivate.call( this, event );
            }

        } );
        return dropped;

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...