整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          輕松實現HTML表格拖拽和排序,實現復雜交互式數據表變得更簡單

          我們都知道普通的HTML自帶的功能相對有限,很多復雜的交互式場景,如果手動去寫功能的話會非常的復雜,而且可擴展性差,就拿HTML表格來說,對于初學者或者對于復雜的拖拽式交互編程不熟悉的話會很浪費時間,因此今天就介紹一個第三方的插件——Table-draagger,來輕松實現類似的功能。Table-draagger是用于構建可重排序的拖放表的極簡主義純Javascript庫!



          Github

          https://github.com/sindu12jun/table-dragger


          特征

          Table-draagger因為其以下幾個特征而讓拖拽和排序的實現變得如此簡單:

          • 非常容易配置
          • 能夠同時對列或行進行排序
          • 排序時動畫流暢
          • 沒有臃腫的依賴
          • 提供觸摸事件(意味著在觸摸設備可以實現一些你想要的功能)


          安裝使用

          • 安裝

          可以在npm上獲得它:

          npm install table-dragger --save
          

          或者引用壓縮的js文件

          <script src="../node_modules/table-dragger/dist/table-dragger.min.js"></script>
          

          或者嘗試開發中的不穩定版本

          npm install table-dragger@next --save
          

          • 快速入門

          請看以下代碼:

          import tableDragger from 'table-dragger'
          tableDragger(el, options?)
          

          <table id="table">
          <thead>
          <tr>
          <th class='handle'>header1</th>
          <th class='handle'>header2</th>
          </tr>
          </thead>
          <tbody>
          <tr>
          <td>conten1</td>
          <td>conten2</td>
          </tr>
          </tbody>
          </table>
          

          var el = document.getElementById('table');
          var dragger = tableDragger(el, {
          mode: 'row',
          dragHandler: '.handle',
          onlyBody: true,
          });
          dragger.on('drop',function(from, to){
          console(from);
          console(to);
          });
          

          你可以在不設置任何參數的情況下使用默認的拖拽和排序方式,當然以下是你可以配置的選項:

          • options.mode

          1、將mode設置為column,用戶拖動和排序表的列

          2、將mode設置為row,用戶拖動并排序表的行

          3、設置mode為free,用戶根據點擊后鼠標移動的方向拖動行或列。注意,必須在自由模式下指定dragHandler。

          • options.dragHandler

          dragHandler是表中的拖動句柄選擇器默認情況下,在列模式下,dragHandler是表的第一行;在行模式下,則是第一列。

          • options.onlyBody

          在行模式下將onlyBody設置為true時,用戶只能在tbody中提升行。

          • API

          下面是返回對象的API


          tableDragger(document.querySelector('#event-table'), { mode: 'free', dragHandler: '.handle', onlyBody: true })
          .on('drag', () => {
          console.log('drag');
          })
          .on('drop', (from, to, el, mode) => {
          console.log(`drop ${el.nodeName} from ${from} ${mode} to ${to} ${mode}`);
          })
          .on('shadowMove', (from, to, el, mode) => {
          console.log(`move ${el.nodeName} from ${from} ${mode} to ${to} ${mode}`);
          })
          .on('out', (el, mode) => {
          console.log(`move out or drop ${el.nodeName} in mode ${mode}`);
          });
          


          總結

          Table-draagger為我們節省了很多手動封裝表格排序和拖拽功能的時間,當然目前很多第三方框架已經實現了類似的功能,這更適用于原生的html表格,你還可以通過一些手段記憶用戶拖拽,這只是其中一種思路,Enjoy it!~

          本文中,我們將了解HTML拖放,并借助示例了解其實現.

          拖放是一個非常交互式和用戶友好的概念,它可以通過抓住對象更輕松地將對象移動到其他位置。這允許用戶在元素上單擊并按住鼠標按鈕,將其拖動到其他位置,然后釋放鼠標按鈕以將元素放到該位置。在HTML 5中,拖放更容易編碼,其中的任何元素都是可拖動的。

          拖放事件:有各種拖放事件,其中一些在下面列出:

          • ondrag: 它用于在 HTML 中拖動元素或文本選擇時使用。
          • ondragstart: 它用于調用一個函數 drag(event),該函數指定要拖動的數據。
          • ondragenter: 它用于確定丟棄目標是否接受丟棄。如果要接受丟棄,則必須取消此事件。
          • ondragleave:當鼠標在拖動發生時將元素留在有效放置目標之前時,就會發生這種情況。
          • ondragover: 它指定可以放置拖動數據的位置。
          • ondrop:它指定在拖動操作結束時發生丟棄的位置。
          • ondragend: 當用戶完成拖動元素時,就會發生這種情況。

          拖放 Drag and Drop實現步驟:

          • 步驟1:使對象可拖動 首先將可拖動屬性設置為 true,以使該元素可拖動 <img draggable = “true”>然后,指定拖動元素時應發生的情況。ondragstart 屬性調用一個函數 drag(event),該函數指定要拖動的數據。dataTransfer.setData() 方法設置數據類型和拖動數據的值事件偵聽器 ondragstart 將設置允許的效果(復制、移動、鏈接或某種組合).
          • 步驟2: 放下對象 ondragover 事件指定可以放下拖動數據的位置。默認情況下,不能將數據/元素放在其他元素中。若要允許刪除,它必須阻止元素的默認處理。這是通過調用 event.preventDefault() 方法最后,drop 事件來完成的,它允許執行實際的丟棄

          例1:

          <!DOCTYPE HTML>
          <html>
          <head>
              <style>
              #getData {
                  width: 250px;
                  height: 200px;
                  padding: 10px;
                  border: 1px solid #4f4d4d;
              }
              </style>
              <script>
              function allowDrop(even) {
                  even.preventDefault();
              }
           
              function drag(even) {
                  even.dataTransfer.setData("text", even.target.id);
              }
           
              function drop(even) {
                  even.preventDefault();
                  var fetchData = even.dataTransfer.getData("text");
                  even.target.appendChild(document.getElementById(fetchData));
              }
              </script>
          </head>
           
          <body>
              <h3>Drag the GeekforGeeks image into the rectangle:</h3>
              <div id="getData"
                   ondrop="drop(event)"
                   ondragover="allowDrop(event)">
                </div>
              <br>
              <img id="dragData"
                   src="gfg.png"
                   draggable="true"
                   ondragstart="drag(event)"
                   width="250"
                   height="200">
          </body>
          </html>


          Output:

          Dragging the image into the box

          拖放過程的數據傳遞: 當拖放的整個過程發生時,將使用數據傳輸屬性。它用于保存從源拖放到所需位置的數據。這些是與之關聯的屬性:

          • dataTransfer.setData(format, data): 它用于設置要拖動的數據.
          • dataTransfer.clearData(format): 它用于調用此函數,沒有清除所有數據的參數。使用 format 參數調用它僅刪除該特定數據。
          • dataTransfer.getData(format): 它返回指定格式的數據。如果沒有此類數據,則返回空字符串.
          • dataTransfer.types:此屬性返回在 dragstart 事件中設置的所有格式的數組。
          • dataTransfer.files: 它用于返回要刪除的所有文件。
          • dataTransfer.setDragImage(element, x, y): 它用于將現有圖像顯示為拖動圖像,而不是光標旁邊的默認圖像。坐標指定放置位置。
          • dataTransfer.addElement(element): 它用于添加要繪制的指定元素作為拖動反饋圖像。
          • dataTransfer.effectAllowed(value): 它將告訴瀏覽器只允許用戶使用列出的操作類型。該屬性可以設置為以下值:none、copy、copyLink、copyMove、link、linkMove、move、all 和未初始化。
          • dataTransfer.dropEffect(value): 它用于控制在拖動和拖動事件期間向用戶提供的反饋。當用戶將鼠標懸停在目標元素上時,瀏覽器的光標將指示將要發生的操作類型(例如復制、移動等)。效果可以采用以下值之一:無、復制、鏈接、移動。

          例2:

          <!DOCTYPE HTML>
          <html>
          <head>
          <title>Drag and Drop box</title>
          <script>
          function allowDrop(ev) {
          ev.preventDefault();
          }
          function dragStart(ev) {
          ev.dataTransfer.setData("text", ev.target.id);
          }
          function dragDrop(ev) {
          ev.preventDefault();
          var data = ev.dataTransfer.getData("text");
          ev.target.appendChild(document.getElementById(data));
          }
          </script>
          <style>
          #box {
          margin: auto;
          width: 50%;
          height: 200px;
          border: 3px solid green;
          padding: 10px;
          }
          #box1,
          #box2,
          #box3 {
          float: left;
          margin: 5px;
          padding: 10px;
          }
          #box1 {
          width: 50px;
          height: 50px;
          background-color: #F5B5C5;
          }
          #box2 {
          width: 100px;
          height: 100px;
          background-color: #B5D5F5;
          }
          #box3 {
          width: 150px;
          height: 150px;
          background-color: #BEA7CC;
          }
          p {
          font-size: 20px;
          font-weight: bold;
          text-align: center;
          }
          .gfg {
          font-size: 40px;
          color: #009900;
          font-weight: bold;
          text-align: center;
          }
          </style>
          </head>
          <body>
          <div class="gfg">GeeksforGeeks</div>
          <p>Drag and drop of boxes</p>
          <div id="box">
          <div id="box1" draggable="true"
          ondragstart="dragStart(event)">
          </div>
          <div id="box2" draggable="true"
          ondragstart="dragStart(event)">
          </div>
          <div id="box3" ondrop="dragDrop(event)"
          ondragover="allowDrop(event)">
          </div>
          </div>
          </body>
          </html>
          


          說明:

          • 通過將要拖動的元素的可拖動屬性draggable設置為 true 來開始拖動。
          • 使用 dataTransfer.getData() 方法獲取拖動的數據。此方法將返回在 setData() 方法中設置為相同類型的任何數據。
          • 調用 event.preventDefault() 方法,通過阻止元素的默認處理來允許刪除其他元素中的元素。
          • 該元素存儲在我們附加到放置元素中的變量數據中。

          效果:

          簡介】

          拖放是一種常見的特性, 屬于html5標準的一部分, 即抓取對象以后拖動到另一個位置, 在html5中, 任何元素都可被設置拖放。首先, 我們要給需要拖動的HTML元素啟用拖動功能, 設置屬性draggable="true",

          <div draggable="true"></div>

          提示:a標簽和img標簽默認是啟用該屬性的, 可不需要設置draggable屬性。

          draggable有三個值, 如下所示:

          draggable = true(元素可以被拖動)

          draggable = false(元素不能被拖動)

          draggable = auto(瀏覽器可以自主決定某個元素是否可以被拖動)

          【用法】

          當我們用鼠標拖拽目標元素過程中會觸發的事件:

          ondragstart:用戶按下鼠標開始拖動時觸發

          ondrag:用戶正在拖動時反復觸發

          ondragend:用戶結束拖動后觸發

          <img id="imgs" ondragstart="startFun()" ondrag="ondragFun()" ondragend="ondragendFun()" src="../img/a.png"/>

          當拖動元素進入目標容器內觸發的事件:

          ondragenter:鼠標拖動對象進入釋放區時觸發

          ondragover:被拖動物體進入目標容器內移動時反復觸發

          ondragleave:拖動對象在釋放區沒有釋放就離開容器時觸發

          ondrop:被拖動物體在目標容器內釋放時觸發

          <div id="container" ondragenter="ondragenterFun(event)" ondragover="ondragoverFun(event)" ondragleave="ondragleaveFun()" ondrop="drop()"></div>

          ondragenter和ondragover事件的默認行為是拒絕接受任何被拖放的項目, 所以我們必須要做的最重要的事情就是防止這種默認行為的發生。

          因此, 我們只需要在這兩個事件調用的函數中傳入event對象, 使用event.preventDefault()就可取消這種默認行為;舉個例子, 在drop事件時, Firefox瀏覽器會關閉網頁, 轉而顯示被拖動圖片img元素src所引用的地址。

          取消元素默認行為:

          function ondragenterFun(e){
              e.preventDefault();
          }
          function ondragoverFun(e){
              e.preventDefault();
          }

          在event對象中, 我們會使用dataTransfer屬性來獲取DataTransfer對象, 在DataTransfer對象中有我們操作數據的屬性和方法, 具體如下:

          datatransfer:轉移釋放元素的數據到釋放區, 返回Datatransfer對象

          event.dataTransfer //返回DataTransfer對象

          DataTransfer對象的屬性:

          files:處理從操作系統拖動并釋放到釋放區的文件;

          types:返回一個字符串數組, 該對象包含了dataTransfer對象中數據的所有類型;

          items:返回DataTransferItems對象, 該對象代表了拖動數據;

          dropEffect:設置拖放目標允許發生的拖放行為, 如果此處設置的拖放行為不在effectAllowed屬性設置的可拖放行為內, 拖放操作將會失敗。該屬性值只允許為"null"、"copy"、"link"或"move";

          effectAllowed:設置拖動元素允許發生的拖動行為, 該屬性值可為"none"、"copy"、"copyLink"、"copyMove"、"link"、"linkMove"、"move"、"all"或"uninitialized";

          DataTransfer對象的方法:

          setData( format , data ):將指定格式的數據賦值給dataTransfer對象,參數format定義數據的格式也就是數據的類型,data為待賦值的數據。

          getData( format ):從dataTransfer對象中獲取指定格式的數據,format代表數據格式,data為數據。

          clearData( [format] ):從dataTransfer對象中刪除指定格式的數據,參數可選,若不給參數,將刪除對象中所有的數據。

          setDragImage(el, x, y):設置拖放操作的圖標,其中el代表自定義圖標,x代表圖標與鼠標在水平方向上的距離,y代表圖標與鼠標在垂直方向上的距離。


          了解了H5拖動使用的api以后我們接下來看一個綜合的案例, 功能如下:

          1)、實現圖片拖動功能;

          2)、實現圖片復制功能;

          3)、過濾不能拖動的元素;

          4)、實現拖動本地圖片到瀏覽器指定位置;

          公共css部分:

          <style>
          #dropIn{
          border:1px solid #AAAAAA;
          height:100px;
          margin-bottom: 10px;
          padding: 10px;
          }
          #dropIn>img{
          margin-right: 10px;
          border:2px solid deepskyblue;
          }
          img{
          width:100px;
          border-radius: 10px;
          border:2px solid red;
          }
          </style>

          html部分:

          <body>
          <div id="dropIn"></div> <!--釋放區-->
          <img id="drop1" src="img/a.png" alt="" />
          <!--拖動的圖片元素-->
          </body>

          js部分:

          <script type="text/javascript">
          var darggID;
          function getId(el){
              return document.getElementById(el)
          }
          var dropId1 = getId("drop1");
          var dropInId = getId("dropIn");
          //取消事件默認行為
          dropInId.ondragenter = cancelDefault;
          dropInId.ondragover = cancelDefault; //綁定拖動元素釋放時觸發的事件
          dropInId.ondrop = drop; //綁定
          dropId1.ondragstart = startFun;
          function cancelDefault(ev){ //取消默認行為
              ev.preventDefault();
          }
          function startFun(ev){
              darggID = ev.target.id;
              //獲取被拖動元素的id
              //從源對象上的事件處理中保存數據,數據類型為"Text"
              ev.dataTransfer.setData("Text",darggID);
          }
          function drop(ev){
              ev.preventDefault();
              // 從目標對象上的事件處理中讀取"Text"類型數據
              var data=ev.dataTransfer.getData("Text");
              // 插入到目標對象中
              ev.target.appendChild(document.getElementById(data));
          }
          </script>

          接下來我們添加兩張圖, "drop2"是實現復制的圖片, "drop3"是既不能復制也不能拖動的圖片;

          <img id="drop2" src="img/b.png" alt="" /><img id="drop3" src="img/c.png" alt="" />

          添加js代碼:

          //獲取頁面元素
          var dropId2 = getId("drop2");
          var dropId3 = getId("drop3");
          //綁定事件
          dropId2.ondragstart = startFun;dropId3.ondragstart = startFun;
          //修改drop函數為
          function drop(ev){
              ev.preventDefault();
              // 從目標對象上的事件處理中讀取"Text"類型數據
              var data=ev.dataTransfer.getData("Text");
              if(data=='drop1'){
              //移動
                  ev.target.appendChild(document.getElementById(data));
              }
              if(data=='drop2'){//復制
                  var nreEl=document.getElementById(darggID).cloneNode(false);
                  getId("dropIn").appendChild(nreEl);
              }
              if(data=='drop3'){//過濾drop3,drop3不做任何操作
                  alert('過濾drop3')
              }
          }

          接下來我們實現拖動本地圖片到瀏覽器, 我們就將圖片拖動到id為"dropIn"的這個div中;添加js:

          /*document 監聽drop 并阻止瀏覽器打開客戶端的圖片*/
          document.ondragover = function (e) {
              //只有在ondragover中阻止默認行為
              e.preventDefault();
          };
          document.ondrop = function (e) {
              //阻止 document.ondrop的默認行為
              e.preventDefault();
          };
          //dropIn是div的id
          dropIn.ondrop = function (e) {
              var list = e.dataTransfer.files;
              for (var i = 0; i < list.length; i++) {
              var f = list[i];
                  reader(f);
              }
          };
          function reader(f) {
              var reader = new FileReader();
              //讀取數據
              reader.readAsDataURL(f);
              reader.onload = function () {
              var img = new Image();
              img.src = reader.result;
              dropIn.appendChild(img);
              }
          }

          【瀏覽器支持】

          目前只有Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari5支持拖放,在 Safari5.1.2 中不支持拖放。

          最后再和大家分享一個技巧, 這種拖動行為還能跨瀏覽器工作, 這里說的跨瀏覽器不是瀏覽器之間的跨窗口, 而是可以從Chrome瀏覽器拖動到Firefox瀏覽器, 因為拖放功能的支持是集成在操作系統里面的, 有著相同的特性。


          主站蜘蛛池模板: 国产精品无码一区二区在线| 国产精品一区二区av| 亚洲av无码一区二区三区在线播放 | 麻豆精品人妻一区二区三区蜜桃| 国偷自产av一区二区三区| 国产午夜三级一区二区三| 国产一区二区精品久久凹凸| 一区二区国产在线观看| 亚洲日韩国产一区二区三区 | 精品少妇一区二区三区视频| 国精品无码一区二区三区在线| 精品福利一区二区三| 久久亚洲日韩精品一区二区三区| 国产精品视频第一区二区三区| 无码人妻少妇色欲AV一区二区| 色婷婷一区二区三区四区成人网 | 国产精品香蕉一区二区三区| 鲁丝丝国产一区二区| 国产成人一区在线不卡| 国产精品无圣光一区二区| 精品少妇ay一区二区三区| 国产精品亚洲综合一区在线观看 | eeuss鲁片一区二区三区| 精品乱码一区二区三区在线| 国产自产V一区二区三区C| 亚洲日韩AV一区二区三区中文 | 丰满岳乱妇一区二区三区| 亚洲av无码一区二区三区网站| 亚洲中文字幕乱码一区| a级午夜毛片免费一区二区| 亚洲欧美成人一区二区三区| 中文字幕无线码一区| 日韩美女在线观看一区| 久久久精品人妻一区亚美研究所| 国产精品亚洲专区一区| 亚洲一区二区三区高清| 久久无码一区二区三区少妇| 精品国产一区二区三区免费看| 久久久久人妻精品一区二区三区| 风间由美在线亚洲一区| 国产一区二区三区播放|