2016-08-16 91 views
0

我有一組行,我試圖做一個onclick來選擇行,然後將它移動到它的兄弟行之前或之後。JQuery - 移動Divs /行

我試圖使用一系列insertBefore()insertAfter()prev()next()用於選擇和移動元素。我不確定這些是不錯的使用方法,或者他們是否達到了他們的棄用時間或什麼。

的代碼如下:

HTML

<div> 
    <div class="row"> 
     <div class="small-10 medium-3 large-3 columns"><input type="text" placeholder="Presenter Name"></div> 
     <div class="small-4 medium-1 large-1 text-center columns"></div> 
     <div class="small-4 medium-1 large-1 text-center columns"></div> 
     <div class="small-4 medium-1 large-1 text-center columns"></div> 
     <div class="small-12 medium-5 large-5 columns"></div> 
     <div class="show-for-medium-up medium-1 large-1 columns"> 
     <div class="row"> 
      <div class="small-6 columns close-thik"></div> 
      <div class="small-6 columns arrow"> 
       <div class="arrow-up"></div> 
       <div class="arrow-down"></div> 
      </div> 
     </div> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="small-10 medium-3 large-3 columns"><input type="text" placeholder="Presenter Name"></div> 
     <div class="small-4 medium-1 large-1 text-center columns"></div> 
     <div class="small-4 medium-1 large-1 text-center columns"></div> 
     <div class="small-4 medium-1 large-1 text-center columns"></div> 
     <div class="small-12 medium-5 large-5 columns"></div> 
     <div class="show-for-medium-up medium-1 large-1 columns"> 
     <div class="row"> 
      <div class="small-6 columns close-thik"></div> 
      <div class="small-6 columns arrow"> 
       <div class="arrow-up"></div> 
       <div class="arrow-down"></div> 
      </div> 
     </div> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="small-10 medium-3 large-3 columns"><input type="text" placeholder="Presenter Name"></div> 
     <div class="small-4 medium-1 large-1 text-center columns"></div> 
     <div class="small-4 medium-1 large-1 text-center columns"></div> 
     <div class="small-4 medium-1 large-1 text-center columns"></div> 
     <div class="small-12 medium-5 large-5 columns"></div> 
     <div class="show-for-medium-up medium-1 large-1 columns"> 
     <div class="row"> 
      <div class="small-6 columns close-thik"></div> 
      <div class="small-6 columns arrow"> 
       <div class="arrow-up"></div> 
       <div class="arrow-down"></div> 
      </div> 
     </div> 
     </div> 
    </div> 
</div> 

正如你可以看到,有一個<div>類箭頭和兩個div裏面有是向上和向下箭頭(用於移動)。

的JavaScript

var MovePerson = { 

    up: function() { 

     $(document).on("click", ".arrow-up", function() { 

      $(this).parents().eq(3).insertBefore($(this).prev()); 

     }); 

    }, 

    down: function() { 

     $(document).on("click", ".arrow-down", function() { 

      $(this).parents().eq(3).insertAfter($(this).next()); 

     }); 

    } 

}; 

$(document).ready(MovePerson.up); 
$(document).ready(MovePerson.down); 

所以,如果你可以想像,我行

A 
B 
C 
D 

我想移動C到第二行,所以爲了將被A, C, B, D

所以我的邏輯是用$(this).parents().eq(3)去選擇<row>然後用一些更多的js在元素前後移動它。

(獎金)很高興知道我是否已達到結尾或開始。所以也許有些方法可以檢測我的目標之前或之前是否有另一個兄弟姐妹。

+0

難道你不想使用任何插件來實現這一目標嗎?使用plugnin會容易得多。 –

+0

儘管只用jquery可以做到這一點,但我建議使用像knockout.js這樣的MVVM框架。這樣knockout處理綁定到DOM,你的重新排序函數將使用'splice'重新排序數組。如果數組是一個綁定到頁面的可觀察數組,那麼knockout會自動重新渲染所有更改的元素。 – fotijr

+0

嗯,這是一個Angular應用程序的一部分,但我看到的唯一的東西是過度複雜的插件和寫得不好的方向。我在想也許一個快速/骯髒的解決方案會更容易。 – Kenny

回答

1

我認爲這個想法只是簡單地選擇當前行,識別上一行/下一行,分離當前行並將其插入前一行或下一行之前。

這是您的代碼片段的快速模式。

var MovePerson = { 

    up: function() { 

     $(document).on("click", ".arrow-up", function() { 

      var thisRow = $(this).parents().eq(3); 
      var prevRow = $(thisRow).prev(); 

      //we only want to move this row up if there is a row before this row. 
      if(prevRow){ 
       $(prevRow).before($(thisRow).detach()); 
      } 
     }); 

    }, 

    down: function() { 

     $(document).on("click", ".arrow-down", function() { 

      var thisRow = $(this).parents().eq(3); 
      var nextRow = $(thisRow).next(); 

      //we only want to move this row down if there is a row after this row. 
      if(nextRow){ 
       $(nextRow).after($(thisRow).detach()); 
      } 
     }); 

    } 

}; 

$(document).ready(MovePerson.up); 
$(document).ready(MovePerson.down); 
+0

非常感謝,因爲它符合我的喜好和獎勵內容。你認爲應用某種動畫很簡單嗎?這樣div的移動就不那麼波動了? – Kenny

+0

@Kenny你可以嘗試調用slideUp()+ detach(),然後在之前/之後調用slideDown() –