11

あなたがここで見ることができるように:http://jsfiddle.net/rA4CB/6/

両方のドロップ可能アイテムで受信されるオーバーラップ領域にドロップすると、アイテムが兄弟の場合、貪欲は機能しません。zIndexの下位にあるdroppableの受信をブロックする方法はありますか?

ところで、マウスは実際にはドラッグ可能な要素の上にあるため、mouseOverはドロップ可能な要素に対して起動しません。

関連するJS:

$(function() {
    $( "#draggable" ).draggable();
    $( "#droppable" ).droppable({
        tolerance:'pointer',
        drop: function( event, ui ) {
            $( this )
                .addClass( "ui-state-highlight" )
                .find( "p" )
                    .html( "Dropped!" );
        }
    });
    $( "#droppable2" ).droppable({
        tolerance:'pointer',
        greedy:true,
        drop: function( event, ui ) {
            $( this )
                .addClass( "ui-state-highlight" )
                .find( "p" )
                    .html( "Dropped!" );
        }
    });
});
4

9 に答える 9

15

さて、私はそれを理解しようと1時間費やし、それから私が尋ねるとすぐに私の答えを見つけます

http://jsfiddle.net/rA4CB/7/

JSを次のように変更しました。

$(function() {
    $( "#draggable" ).draggable();
    $( "#droppable" ).droppable({
        tolerance:'pointer',
        drop: function( event, ui ) {
            $( this )
                .addClass( "ui-state-highlight" )
                .find( "p" )
                    .html( "Dropped!" );
        }
    });
    $( "#droppable2" ).droppable({
        tolerance:'pointer',
        greedy:true,
        drop: function( event, ui ) {
            $( this )
                .addClass( "ui-state-highlight" )
                .find( "p" )
                    .html( "Dropped!" );
        },
        over: function(event, ui){
            $( "#droppable" ).droppable( "disable" )
        },
        out: function(event, ui){
            $( "#droppable" ).droppable( "enable" )
        }
    });
});
于 2012-08-17T00:03:50.877 に答える
6
$( "#droppable" ).droppable({
    greedy: true,
    drop: function( event, ui ) {
       if(ui.helper.is(".dropped")) {
           return false;
       }
       ui.helper.addClass(".dropped");
    }
});

draggableのui.helperにcssクラスを設定するだけです。ドラッグ可能オブジェクトが一度受け入れられると、他のすべてのドロップ可能オブジェクトによって拒否されます(ドロップ可能「accept」パラメーターも同様accept : ":not(.dropped)"に、ui.draggableにクラスを追加して実行できます)。

于 2015-02-09T09:57:07.807 に答える
2

コンテナエリアにドロップ可能なものがたくさんある場合はどうしますか????

あなたはその問題について考え直さなければなりません。貪欲は、兄弟ではなく、親と子の関係でのみ機能します。したがって、ドロップ可能なjsを編集するか、独自のロジックを配置する必要があります。

したがって、ドロップ可能なものが多数ある場合は、この例のように、完全なドロップ可能なものへのドロップを処理するための追加のコードを作成する必要があります。

完璧な兄弟をドロップ可能にするために、以下のようにドロップベールを変更します

        var topElement = undefined;
        var topElementArray = Array();

        $( "#draggable" ).draggable();
        $( ".droppableBox" ).droppable({
            activeClass: "active-droppable",
            tolerance:'pointer',
            over: function( event, ui ) { 
                // This is for only show a message that z-index must be required for proppable
                // you can remove it after testing or after development
                if ($(this).css("z-index") == 'auto') {
                    alert("Please provide z-index for every droppable.");
                    return;
                }
                //

                topElement = undefined;
                topElementArray = Array();
                // Change it as you want to write in your code
                // For Container id or for your specific class for droppable or for both
                $('#demo > .droppableBox').each(function(){                     
                    _left = $(this).offset().left, _right = $(this).offset().left + $(this).width();
                    _top = $(this).offset().top, _bottom = $(this).offset().top + $(this).height();
                    if (event.pageX >= _left && event.pageX <= _right && event.pageY >= _top && event.pageY <= _bottom) {   
                          topElementArray.push($(this).attr('id'));
                    }
                });
            },
            drop: function( event, ui ) {
                if (!topElement) {
                    topElement = determineTopElement(topElementArray);
                }                   
                if ($(this).attr('id') == $(topElement).attr('id')) {
                    $( this ).addClass( "ui-state-highlight" ).find( "p" ).html( "Dropped!" );
                  // Your code after successful dropped element on specific siblings
                  // Start writing code for dropped element & perfect droppable
                }

            }
        });

        determineTopElement = function(_array) {
            var topElement;
            var zIndexHighest = 0;
            for (i = 0; i < _array.length; i++){
               var element = $("#"+ _array[i]);
               var z_index = $(element).css("z-index");
               if( z_index > zIndexHighest){
                   zIndexHighest = z_index;
                   topElement = element;
               }
            }
            return topElement;       
        }
于 2013-11-25T11:46:46.160 に答える
1

特定の状況では:

myjQuery.droppable({
  over:function(evt,ui){
    ui.draggable.attr('drg_time', this.drg_time = evt.timeStamp)
  },
  accept:function(draggeds){
    if(draggeds.attr('drg_time'))
    {
      return draggeds.attr('drg_time') == this.drg_time
    }
    return draggeds.hasClass('acceptable_classes_here')
  },
  out:function(evt,ui){
    // useless but cleaner
    ui.draggable.removeAttr('drg_time')
  }
  drop:...,
})
于 2013-12-18T06:51:25.760 に答える
0

私は同じ問題を抱えていて、小さなプラグインを作りました:)

見てみな:

https://stackoverflow.com/a/16720944/1308461

于 2013-05-26T00:07:53.523 に答える
0

#invertedSpearのメソッドを使用すると、UIの状態が変化することがわかりますが、これは望ましくない場合があります。これがコードです。

var lastOpertion = new Date().getTime();

drop: function (event, ui) {
        if (new Date().getTime() - lastOpertion < 100) return;
        lastOpertion = new Date().getTime();
        ....
}
于 2013-10-31T19:30:37.980 に答える
0

だから、簡単な解決策を見つけようとしたとき、私はこれを思いついた(そしてそれは私のために働く):

            window.overNowOnThis = "";
            window.olderOnes = [];
            $obj.droppable({
                accept: ".draggable_imgs",
                drop: function(e, ui) {
                    if(window.overNowOnThis == this){
                        // Do whatever
                    }
                },
                over: function(event, ui){
                    window.olderOnes.push(window.overNowOnThis);
                    window.overNowOnThis = this;
                },
                out: function(){
                    var lastElem = window.olderOnes.pop();
                    window.overNowOnThis = lastElem;
                }
            });

一番上の要素が選択されるのは、その上で最後の要素が「オーバー」で発射されるためです。また、兄弟が3人以上いる場合は、要素から移動するときに、最後の兄弟を現在の兄弟として設定します。たとえば、グローバルな「ウィンドウ」の使用でした。データを安全に保持できるため、クラスを使用することをお勧めします。

于 2016-10-03T11:36:29.997 に答える
0

これは、invertedSpearの回答と非常によく似ています。「over」/「out」の内側の有効化/無効化が機能しなかったため、少し変更する必要がありました。代わりに、以下を実行する必要がありました。

$("#droppable2").droppable({
    greedy: true,
    drop: function (event, ui) {
        $("droppable").droppable("disable");
    }
}

必要なときに「droppable」divを明示的に有効にする必要がありました。たとえば、ドラッグイベントを開始するときに有効にします。例えば

$("#drageMe").draggable({
 start:function(event,ui){
   $("droppable").droppable("enable");  

}})

于 2016-11-22T01:03:34.463 に答える
-1

uidropableで貪欲なオプションを試してください。デモについては、以下のフィドルリンクを参照してください。

http://jsfiddle.net/creators_guru/3vT5C/embedded/result/

$( ".circles" ).droppable({
    greedy: true,
    drop: function( event, ui ) {
        $_data  =   ('drgged class = ' + ui.draggable.attr('class'));
        $_data1 =   ('droped id = #' + $(this).attr('id'));
        $('#data').html($_data + '<br/>'+$_data1);
        return false;
    }
});
于 2014-02-11T10:18:12.963 に答える