2011-02-11 7 views
9

ドラッグアンドドロップ機能に問題があり、誰かが助けてくれることを望んでいます。一言で言えばルールは、次のとおりJQueryドラッグアンドドロップの配置に関する問題

  1. つクローン化.pageControlを受け入れることができるよりも多く存在することができるの「ステージ」(.stage)。それが受け入れる唯一のクラスです。

  2. .stageで一旦削除されると、.pageControlは.pageControlDroppedになり、クローンされた.wfcControlを受け入れることができます。それが受け入れる唯一のクラスです。

  3. .wfcControlを削除すると、新しいhtmlに置き換えられ、.wfcControlDroppedになります。

私の問題は、次のとおりです。

  1. 私は.stageするクローン.pageControlをドラッグすると、それは私がそれを落としてるの位置ではありません.stage上の位置にジャンプします。私はそれを私が欲しいところにドラッグすることができますが、ドロップする場所にドロップする必要があります。 CSSの位置付けを試みましたが、.pageControlで動作するようです。 .pageControl-> .pageControlDroppedを実行すると、別の位置にジャンプします。また、例のように非常に流動的ではない

  2. 複数の.pageControlsを.stageにドラッグすると、いずれも.wfcControlを受け入れる必要があります。しかし、最初の.pageControl(今は.pageControlDropped)だけがそれを受け取るようです。 2番目の.pageControlDroppedを受け取ることができません。

  3. .pageControlをどのようにして、既存のものをオーバーレイしないようにするには?

CSS:

<style type="text/css"> 
.stage { margin-left: -.3em; width: 500px; height: 550px; padding: 0.0em;} 
.pageControl {height:15px; width:15px; background-color:#EAEEFF; border:1px solid blue;} 
.pageControlDropped {height:450px; width:600px;background-color:#F9FAFF;border:1px solid blue;} 
.wfcControl { } 
.wfcControlDropped { } 
</style> 

はJQuery:最後に

$('.pageControl').draggable({ 
       helper: 'clone', 
       snap: false, 
       containment: '.stage', 
       handle: '.wfcHandle', 
       stop: function (event, ui) { 
        var pos = $(ui.helper).offset(); 
        $(this).css({ 
         "left": pos.left, 
         "top": pos.top 
        }); 
       } 
      }); 
    $('.wfcControl').draggable({ helper: 'clone', containment: '.pageControlDropped' }); 
    $('.stage').droppable({ 
       accept: '.pageControl', 
       greedy: true, 
       drop: function (event, ui) { 
        $(this).append($(ui.helper).clone()); 
        $('.stage .pageControl') 
         .removeClass('pageControl') 
         .addClass('pageControlDropped') 
         .resizable() 
         .draggable({ 
          containment: '.stage', 
          handle: '.wfcHandle' 
         }) 
         .droppable({ 
          accept: '.wfcControl', 
          greedy: true, 
          drop: function (event, ui) { 
           switch (ui.helper[0].title) { 
            case "Play Greeting Control": 
             wfcControlDropped = wfcPlayGreetingControl 
             break; 
            case "Input Control": 
             wfcControlDropped = wfcInputControl 
             break; 
           } 
           $(this).append($(ui.helper).clone()); 
           $('.pageControlDropped .wfcControl').replaceWith($(wfcControlDropped)); 
           $('.pageControlDropped .wfcControlDropped') 
            .draggable({ 
             containment: '.pageControlDropped' 
            }) 
          } 
         }).clone(false) 

        return false; 
       } 
      }); 

、HTML:この上の任意の助けを

<div id = "divPageControl" title = "Page Control" class="pageControl"> 
    <table style = "width:100%" border = "0"> 
     <tr> 
     <td colspan = "1" width = "100%"></td> 
     </tr> 
    </table> 
</div> 
<div id = "divInputControl" title = "Input Control" class="wfcControl" style="height:15px; width:15px; background-color:light green; border:1px solid green;"> 
    <table style = "width:100%" border = "0"> 
     <tr class = "wfcHandle"> 
     <td colspan = "1" width = "100%">&nbsp;</td> 
     </tr> 
    </table> 
</div> 

感謝。

+0

あなたはどのブラウザをテストしましたか?あなたは厳密なDOCTYPEを使用していますか? CSSをリセットしていますか? – anon

+0

スイッチでブレークを取り除き、再度テストできますか?また、負のマージンを取り除くためのアドバイスもします。 – KutePHP

+2

http://jsfiddle.net/にコードを追加すると、コードをテストするのが簡単になります – ygaradon

答えて

1

これはあなたの方法にもあなたを取得する必要があります:

HTML:

<div class="pageControl"></div> 
    <div class="wfcControl"></div> 
    <div class="stage"> STAGE</div> 
    <div class="stage"> STAGE</div> 

JAVASCRIPT:

$('.pageControl,.wfcControl').draggable({ 
    helper:"clone", 
    opacity:0.5 
}); 

//========================================= 
$('.stage').droppable(
    { 
    tolerance: "fit", 
    greedy:true, 
    accept: ".pageControl", 
    drop: function(e,ui){ 
     $(this).append(
     $(ui.draggable).clone() 
     .css({ 
      position:"absolute", 
    //IMPORTANT 
      top: e.clientY-e.offsetY, 
      left: e.clientX-e.offsetX 
     }) 
     //note containment:parent => IMPORTANT 
     .draggable({containment:"parent", 
        snap:true, 
        snapMode:"outer", 
     //MY ATTEMPT TO STOP USERS FROM OVERLAPPING 
        snapTolerance:15 
        }) 
     .removeClass("pageControl") 
     .addClass("pageControlDropped") 
     .resizable() 
     .droppable({ 
      accept: ".wfcControl", 
      drop: function(ev,ui){ 
      $(this).append(
      $(ui.draggable).clone() 
       .css({ 
       position:"absolute", 
       top:ev.clientY-ev.offsetY-$(this).offset().top, 
       left: ev.clientX-ev.offsetX - $(this).offset().left 
       }) 
       //note containment:parent 
       .draggable({containment:"parent"}) 
       .removeClass("wfcControl") 
       .addClass("wfcControlDropped")  
    );  
    } 

     }) 
    );  
    } 
    } 
); 

DEMO: http://jsbin.com/orepew

はあなたがいずれかを持っていたなら、私を知ってみましょう質問

関連する問題