>  기사  >  웹 프론트엔드  >  JS 구성 요소 Bootstrap 테이블 테이블 행 드래그 효과 구현 코드

JS 구성 요소 Bootstrap 테이블 테이블 행 드래그 효과 구현 코드

高洛峰
高洛峰원래의
2017-03-20 14:02:161669검색

1. 비즈니스 요구 사항 및 구현 효과

그날 갑자기 주문이 서로 다른 두 주문 사이에 삽입되어야 한다는 요구 사항을 받았습니다. 효과는 페이지에 다음과 같이 나타납니다. 왼쪽과 오른쪽에 두 개의 테이블이 있습니다. 왼쪽 테이블에는 상태 1의 주문이 포함되어 있고, 오른쪽 테이블에는 상태 2의 주문이 포함되어 있습니다. 왼쪽 테이블의 행 데이터를 지정된 행 위치로 드래그합니다. 작업이 완료되면 왼쪽 테이블이 한 행 줄어들고 오른쪽 테이블이 한 행 추가됩니다. 또한 이전 단계로 돌아가려면 작업을 실행 취소해야 합니다(Ctrl + Z 작업과 동일). 아마도 설명을 보면 시뮬레이션에 대해 다시 한 번 생각하게 될 것입니다. 어쨌든 먼저 렌더링을 살펴보겠습니다.

1. 드래그하기 전에 먼저 효과를 보세요

2. 테이블 행 데이터를 왼쪽으로 드래그하는 효과입니다

JS组件Bootstrap Table表格行拖拽效果实现代码

3 , 행 드래그 후 테이블 데이터의 효과

JS组件Bootstrap Table表格行拖拽效果实现代码

4. 두 번째 및 세 번째 드래그 후의 효과

JS组件Bootstrap Table表格行拖拽效果实现代码

5. 오른쪽 테이블에서 실행 취소를 클릭했을 때의 효과

JS组件Bootstrap Table表格行拖拽效果实现代码

6. 실행 취소를 여러 번 클릭하면 테이블이 초기 상태로 돌아갑니다

JS组件Bootstrap Table表格行拖拽效果实现代码

2. 코드 예시
요청을 받고 가장 먼저 느낀 점은 역시 Bootstrap 테이블 API에서 찾아봐야 한다는 것이었습니다. 오픈소스의 영향력은 강력하고 관련 사례가 있을 수 있습니다. 검색해본 결과 불행하게도 Bootstrap Table에는 두 테이블 사이에 이러한 작업이 없습니다. 생각해 보면 Bootstrap Table이 특정 동적 테이블의 데이터 바인딩을 위해 설계되었다는 것을 실제로 이해할 수 있습니다. 예를 들어 끌어서 놓기 정렬을 위한 좋은 솔루션이 있습니다. 행 재정렬) 블로거와 같은 특별한 요구 사항이 스스로 실현되어야 하는 것 같습니다.
1. 요구사항 분석
이제 직접 작성하기로 했으니, 이 작업에서 더 어려운 부분은 드래그 앤 드롭 효과인 것 같습니다. 그리고 드롭 효과를 적용한 결과 JsPlumb을 사용할 때 너무 많이 사용되는 것으로 나타났으므로 마법의 JQuery UI에서 draggable.js 및 droppable.js를 생각합니다. 이제 드래그 앤 드롭 문제는 해결됐는데 또 다른 난관이 있는데, 작업을 취소하면 어떻게 해야 할까요? Ctrl+z는 복원을 의미한다는 것을 알고 있습니다. 이전 단계의 작업으로 돌아가는 것이므로 이전 단계의 상태를 저장할 수 있다는 것이 전제인데, 특정 단계의 상태를 저장하는 방법은 블로거들이 어떻게 하는지 알고 있습니다. Json이 필요하며 각각 3개의 키-값 쌍이 있어야 합니다. 현재 단계의 인덱스, 왼쪽 테이블의 데이터, 오른쪽 테이블의 데이터입니다. 별로 어렵지 않을 것 같으니 시작해 보겠습니다.
2. 코드 예시
2.1 cshtml 페이지 코드

<html>
<head>
 <meta name="viewport" content="width=device-width" />
 <title>@ViewBag.Title</title>
 @Styles.Render("~/Content/css")
 @Styles.Render("~/Content/table-css")
 @Scripts.Render("~/bundles/jquery")
 @Scripts.Render("~/bundles/knockout")
 @Scripts.Render("~/bundles/bootstrap")
 @Scripts.Render("~/bundles/bootstrap-table")
 @RenderSection("Scripts", false)
</head>
<body>
 @RenderBody()
</body>
</html>
  
@{
 ViewBag.Title = "订单插单";
 Layout = "~/Views/Shared/_Layout.cshtml";
}
 
@Scripts.Render("~/bundles/Order/InsertOrder")
@Styles.Render("~/bundles/Order/css")
@Scripts.Render("~/Content/bootstrap/datepicker/js")
@Styles.Render("~/Content/bootstrap/datepicker/css")
 
<script src="~/Content/jquery-ui-1.11.4.custom/jquery-ui.min.js"></script>
 
<p class="panel-body" style="padding-bottom:0px;">
  
 <p class="panel panel-default" style="margin-bottom:0px;">
 <p class="panel-heading">查询条件</p>
 <p class="panel-body container-fluid">
 <p class="row">
  <p class="col-md-3">
  <label for="txt_search_ordernumber" class="col-sm-4 control-label" style="margin-top:6px;">订单号</label>
  <span class="col-sm-8">
  <input type="text" class="form-control" id="txt_search_ordernumber">
  </span>
  </p>
  <p class="col-md-3">
  <label for="txt_search_bodynumber" class="col-sm-3 control-label" style="margin-top:6px;">车身号</label>
  <span class="col-sm-8">
  <input type="text" class="form-control" id="txt_search_bodynumber">
  </span>
  </p>
  <p class="col-md-3">
  <label for="txt_search_vinnumber" class="col-sm-4 control-label" style="margin-top:6px;">VIN码</label>
  <span class="col-sm-8">
  <input type="text" class="form-control" id="txt_search_vinnumber">
  </span>
  </p>
  <p class="col-md-3">
  <label for="txt_search_engin_code" class="col-sm-4 control-label" style="margin-top:6px;">发动机号</label>
  <span class="col-sm-8">
  <input type="text" class="form-control" id="txt_search_engin_code">
  </span>
  </p>
 </p>
 <p class="collapse" id="p_more_search">
  <p class="row" style="margin-top:15px;">
  <p class="col-md-3">
  <label for="txt_search_import_startdate" class="col-sm-4 control-label" style="margin-top:6px;">导入时间</label>
  <span class="col-sm-8">
  <input type="text" class="form-control datetimepicker" readonly id="txt_search_import_startdate">
  </span>
  </p>
  <p class="col-md-3">
  <label for="txt_search_import_enddate" class="col-sm-3 control-label" style="margin-top:6px;">至</label>
  <span class="col-sm-8">
  <input type="text" class="form-control datetimepicker" readonly id="txt_search_import_enddate">
  </span>
  </p>
  <p class="col-md-3">
  <label for="txt_search_send_startdate" class="col-sm-4 control-label" style="margin-top:6px;">下发时间</label>
  <span class="col-sm-8">
  <input type="text" class="form-control datetimepicker" readonly id="txt_search_send_startdate">
  </span>
  </p>
  <p class="col-md-3">
  <label for="txt_search_send_enddate" class="col-sm-4 control-label" style="margin-top:6px;">至</label>
  <span class="col-sm-8">
  <input type="text" class="form-control datetimepicker" readonly id="txt_search_send_enddate">
  </span>
  </p>
  </p>
 
  <p class="row" style="margin-top:15px;">
  <p class="col-md-3">
  <label for="txt_search_carcode" class="col-sm-4 control-label" style="margin-top:6px;">整车编码</label>
  <span class="col-sm-8">
  <input type="text" class="form-control" id="txt_search_carcode">
  </span>
  </p>
  <p class="col-md-3">
  <label for="txt_search_vms" class="col-sm-3 control-label" style="margin-top:6px;">VMS号</label>
  <span class="col-sm-8">
  <input type="text" class="form-control" id="txt_search_vms">
  </span>
  </p>
  <p class="col-md-3">
  <label for="txt_search_trans_code" class="col-sm-4 control-label" style="margin-top:6px;">变速箱号</label>
  <span class="col-sm-8">
  <input type="text" class="form-control" id="txt_search_trans_code">
  </span>
  </p>
  </p>
 </p>
 
  <p class="row" style="float:right;margin-right:50px;margin-top:13px;">
  <p>
  <button type="button" id="btn_query" class="btn btn-primary" style="margin-right:20px;width:100px;">查询</button>
  <button type="submit" id="btn_reset" class="btn btn-default" style="margin-right:20px;width:100px;">重置</button>
  </p>
 
  </p>
 </p>
 </p>
 
 <p class="collapse_p_outside">
 <p class="collapse_p_inside"></p>
 <span id="span_collapse" href="#p_more_search" class="collapse_p_inside_ele">展开<label class="glyphicon glyphicon-menu-down"></label></span>
 </p>
</p>
 
@*<p id="toolbar_left" class="btn-group">
</p>*@
<p id="toolbar_right" class="btn-group">
 <button id="btn_cancel" type="button" class="btn btn-default">
 <span class="glyphicon glyphicon-backward aria-hidden="true"></span>撤销
 </button>
 <button id="btn_insertorder" type="button" class="btn btn-default">
 <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>插单
 </button>
</p>
<p class="panel-body" style="padding-top:0px;">
 <p id="p_tableleft" class="col-md-6">
 <table id="tb_order_left"></table>
 </p>
 <p id="p_tableright" class="col-md-6">
 <table id="tb_order_right"></table>
 </p>
</p>

2.2 js 코드

var i_statuindex = 0;
//此数组用于保存撤销操作每一步的数据
var arrdata = [];
 
var m_oTable = null;
 
$(function () {
 //1.初始化表格
 m_oTable = new TableInit();
 m_oTable.Init();
 
 //2.初始化按钮事件
 var oButtonInit = new ButtonInit();
 oButtonInit.Init();
 
 //3.日期控件的初始化
 $(".datetimepicker").datetimepicker({
 format: &#39;yyyy-mm-dd hh:ii&#39;,
 autoclose: true,
 todayBtn: true,
 });
 
});
 
//表格相关事件和方法
var TableInit = function () {
 var oTableInit = new Object();
 
 oTableInit.Init = function () {
     //初始化左边表格
 $(&#39;#tb_order_left&#39;).bootstrapTable({
 url: &#39;/api/OrderApi/get&#39;,
 method: &#39;get&#39;,
 striped: true,
 cache: false,
 striped: true,
 pagination: true,
 height: 600,
 uniqueId:"TO_ORDER_ID",
 queryParams: oTableInit.queryParams,
 queryParamsType: "limit",
 sidePagination: "server",
 pageSize: 10,
 pageList: [10, 25, 50, 100],
 search: true,
 strictSearch: true,
 showColumns: true,
 showRefresh: true,
 minimumCountColumns: 2,
 clickToSelect: true,
 columns: [{
 checkbox: true
 },
 {
 field: &#39;ORDER_NO&#39;,
 title: &#39;订单号&#39;
 },
 {
 field: &#39;BODY_NO&#39;,
 title: &#39;车身号&#39;
 }, {
 field: &#39;VIN&#39;,
 title: &#39;VIN码&#39;
 }, {
 field: &#39;TM_MODEL_MATERIAL_ID&#39;,
 title: &#39;整车编码&#39;
 },
 {
 field: &#39;ORDER_TYPE&#39;,
 title: &#39;订单类型&#39;
 },
 {
 field: &#39;ORDER_STATUS&#39;,
 title: &#39;订单状态&#39;
 },
 {
 field: &#39;CREATE_DATE&#39;,
 title: &#39;订单导入时间&#39;
 },
 {
 field: &#39;PLAN_DATE&#39;,
 title: &#39;订单计划上线日期&#39;
 },
 {
 field: &#39;VMS_NO&#39;,
 title: &#39;VMS号&#39;
 },
 {
 field: &#39;ENGIN_CODE&#39;,
 title: &#39;发动机号&#39;
 },
 {
 field: &#39;TRANS_CODE&#39;,
 title: &#39;变速箱号&#39;
 },
 {
 field: &#39;OFFLINE_DATE_ACT&#39;,
 title: &#39;实际下线日期&#39;
 },
 {
 field: &#39;HOLD_RES&#39;,
 title: &#39;hold理由&#39;
 },
 {
 field: &#39;SPC_FLAG&#39;,
 title: &#39;特殊标记&#39;
 },
 ],
 onLoadSuccess: function (data) {
  //表格加载完成之后初始化拖拽
          oTableInit.InitDrag();
 }
 });
     //初始化右边表格
 $(&#39;#tb_order_right&#39;).bootstrapTable({
 url: &#39;/api/OrderApi/get&#39;,
 method: &#39;get&#39;,
 toolbar: &#39;#toolbar_right&#39;,
 striped: true,
 cache: false,
 striped: true,
 pagination: true,
 height: 600,
 queryParams: oTableInit.queryParamsRight,
 queryParamsType: "limit",
 //ajaxOptions: { departmentname: "", statu: "" },
 sidePagination: "server",
 pageSize: 10,
 pageList: [10, 25, 50, 100],
 search: true,
 strictSearch: true,
 showRefresh: true,
 minimumCountColumns: 2,
 columns: [
 {
 field: &#39;ORDER_NO&#39;,
 title: &#39;订单号&#39;
 },
 {
 field: &#39;BODY_NO&#39;,
 title: &#39;车身号&#39;
 }, {
 field: &#39;VIN&#39;,
 title: &#39;VIN码&#39;
 }, {
 field: &#39;TM_MODEL_MATERIAL_ID&#39;,
 title: &#39;整车编码&#39;
 },
 {
 field: &#39;ORDER_TYPE&#39;,
 title: &#39;订单类型&#39;
 },
 {
 field: &#39;ORDER_STATUS&#39;,
 title: &#39;订单状态&#39;
 },
 {
 field: &#39;CREATE_DATE&#39;,
 title: &#39;订单导入时间&#39;
 },
 {
 field: &#39;PLAN_DATE&#39;,
 title: &#39;订单计划上线日期&#39;
 },
 {
 field: &#39;VMS_NO&#39;,
 title: &#39;VMS号&#39;
 },
 {
 field: &#39;ENGIN_CODE&#39;,
 title: &#39;发动机号&#39;
 },
 {
 field: &#39;TRANS_CODE&#39;,
 title: &#39;变速箱号&#39;
 },
 {
 field: &#39;OFFLINE_DATE_ACT&#39;,
 title: &#39;实际下线日期&#39;
 },
 {
 field: &#39;HOLD_RES&#39;,
 title: &#39;hold理由&#39;
 },
 {
 field: &#39;SPC_FLAG&#39;,
 title: &#39;特殊标记&#39;
 },
 ],
 onLoadSuccess: function (data) {
 oTableInit.InitDrop();
 }
 });
 };
 //注册表格行的draggable事件
 oTableInit.InitDrag = function () {
 $(&#39;#tb_order_left tr&#39;).draggable({
 helper: "clone",
 start: function (event, ui) {
 var old_left_data = JSON.stringify($(&#39;#tb_order_left&#39;).bootstrapTable("getData"));
 var old_right_data = JSON.stringify($(&#39;#tb_order_right&#39;).bootstrapTable("getData"));
 var odata = { index: ++i_statuindex, left_data: old_left_data, right_data: old_right_data };
 arrdata.push(odata);
 },
 stop: function (event, ui) {
  
 }
 });
 };
 //注册右边表格的droppable事件
 oTableInit.InitDrop = function () {
 $("#tb_order_right").droppable({
 drop: function (event, ui) {
 var arrtd = $(ui.helper[0]).find("td");
 var rowdata = {
  ORDER_NO: $(arrtd[1]).text(),
  BODY_NO: $(arrtd[2]).text(),
  VIN: $(arrtd[3]).text(),
  TM_MODEL_MATERIAL_ID: $(arrtd[4]).text(),
  ORDER_TYPE: $(arrtd[5]).text(),
  ORDER_STATUS: $(arrtd[6]).text(),
  CREATE_DATE: $(arrtd[7]).text() == "-" ? null : $(arrtd[7]).text(),
  PLAN_DATE: $(arrtd[8]).text() == "-" ? null : $(arrtd[8]).text(),
  VMS_NO: $(arrtd[9]).text(),
  ENGIN_CODE: $(arrtd[10]).text(),
  TRANS_CODE: $(arrtd[11]).text(),
  OFFLINE_DATE_ACT: $(arrtd[12]).text() == "-" ? null : $(arrtd[12]).text(),
  HOLD_RES: $(arrtd[13]).text(),
  SPC_FLAG: $(arrtd[14]).text(),
  TO_ORDER_ID: $(ui.helper[0]).attr("data-uniqueid")
 
 };
 var oTop = ui.helper[0].offsetTop;
 var iRowHeadHeight = 40;
 var iRowHeight = 37;
 var rowIndex = 0;
 if (oTop <= iRowHeadHeight + iRowHeight / 2) {
  rowIndex = 0;
 }
 else {
  rowIndex = Math.ceil((oTop - iRowHeadHeight) / iRowHeight);
 }
          //插入右边表格指定位置行数据
 $("#tb_order_right").bootstrapTable("insertRow", { index: rowIndex, row: rowdata });
 $(&#39;#tb_order_left&#39;).bootstrapTable("removeByUniqueId", $(ui.helper[0]).attr("data-uniqueid"));
 oTableInit.InitDrag();
 }
 });
 };
 
 oTableInit.queryParams = function (params) { //配置参数
 var temp = { //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
 limit: params.limit, //页面大小
 offset: params.offset, //页码
 strBodyno: $("#txt_search_bodynumber").val(),
 strVin: $("#txt_search_vinnumber").val(),
 strOrderno: $("#txt_search_ordernumber").val(),
 strEngincode: $("#txt_search_engin_code").val(),
 strOrderstatus: 0,
 strTranscode: $("#txt_search_trans_code").val(),
 strVms: $("#txt_search_vms").val(),
 strCarcode: $("#txt_search_carcode").val(),
 strImportStartdate: $("#txt_search_import_startdate").val(),
 strImportEnddate: $("#txt_search_import_enddate").val(),
 strSendStartdate: $("#txt_search_send_startdate").val(),
 strSendEnddate: $("#txt_search_send_enddate").val(),
 
 };
 return temp;
 };
 
 oTableInit.queryParamsRight = function (params) { //配置参数
 var temp = { //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
 limit: params.limit, //页面大小
 offset: params.offset, //页码
 strBodyno: "",
 strVin: "",
 strOrderno: "",
 strEngincode: "",
 strOrderstatus: 5,
 strTranscode: "",
 strVms: "",
 strCarcode: "",
 strImportStartdate: "",
 strImportEnddate: "",
 strSendStartdate: "",
 strSendEnddate: "",
 
 };
 return temp;
 };
 
 return oTableInit;
};
 
//页面按钮初始化事件
var ButtonInit = function () {
 var oInit = new Object();
 var postdata = {};
 
 oInit.Init = function () {
 
 //查询点击事件
 $("#btn_query").click(function () {
 $("#tb_order_left").bootstrapTable(&#39;refresh&#39;);
 });
 
 //重置点击事件
 $("#btn_reset").click(function () {
 $(".container-fluid").find(".form-control").val("");
 $("#tb_order_left").bootstrapTable(&#39;refresh&#39;);
 });
 //撤销操作点击事件
 $("#btn_cancel").click(function () {
 if (i_statuindex <= 0) {
 return;
 }
 for (var i = 0; i < arrdata.length; i++) {
 if (arrdata[i].index != i_statuindex) {
  continue;
 }
 var arr_left_data = eval(arrdata[i].left_data);
 var arr_right_data = eval(arrdata[i].right_data);
 
 $(&#39;#tb_order_left&#39;).bootstrapTable(&#39;removeAll&#39;);
 $(&#39;#tb_order_right&#39;).bootstrapTable(&#39;removeAll&#39;);
 $(&#39;#tb_order_left&#39;).bootstrapTable(&#39;append&#39;, arr_left_data);
 for (var x = 0; x < arr_right_data.length; x++) {
  $("#tb_order_right").bootstrapTable("insertRow", { index: x, row: arr_right_data[x] });
 }
  
 //$(&#39;#tb_order_right&#39;).bootstrapTable(&#39;append&#39;, arr_right_data);//append之后不能drop
 break;
 }
 i_statuindex--;
 
 //重新注册可拖拽
 m_oTable.InitDrag();
 //m_oTable.InitDrop();
 });
 
 //搜索栏展开收起点击事件
 $("#span_collapse").click(function () {
 if ($(this).text() == "收起") {
 $(this).html(&#39;展开<label class="glyphicon glyphicon-menu-down"></label>&#39;);
 $("#p_more_search").collapse(&#39;hide&#39;);
 }
 else {
 $(this).html(&#39;收起<label class="glyphicon glyphicon-menu-up"></label>&#39;);
 $("#p_more_search").collapse(&#39;show&#39;)
 }
 });
 };
 
 return oInit;
};

여러 부분에서 코드를 살펴보겠습니다.
1. 왼쪽 테이블이 성공적으로 로드되면 테이블 행을 끌어서 놓을 수 있습니다.

$(&#39;#tb_order_left tr&#39;).draggable({
 helper: "clone",
 start: function (event, ui) {
 var old_left_data = JSON.stringify($(&#39;#tb_order_left&#39;).bootstrapTable("getData"));
 var old_right_data = JSON.stringify($(&#39;#tb_order_right&#39;).bootstrapTable("getData"));
 var odata = { index: ++i_statuindex, left_data: old_left_data, right_data: old_right_data };
 arrdata.push(odata);
 },
 stop: function (event, ui) {
 }
 });

draggable의 시작 이벤트에서는 arrdata 변수로 드래그하기 전에 왼쪽 및 오른쪽 테이블의 모든 데이터를 저장합니다. 전역 변수 i_statuindex는 현재 단계의 인덱스를 기록하는 데 사용됩니다. 작업을 취소하는 데 사용됩니다.
2.2.2 오른쪽 테이블이 성공적으로 로드된 후 테이블의 드롭 가능한 이벤트를 등록합니다.

$("#tb_order_right").droppable({
 drop: function (event, ui) {
 var arrtd = $(ui.helper[0]).find("td");
 var rowdata = {
 ORDER_NO: $(arrtd[1]).text(),
 BODY_NO: $(arrtd[2]).text(),
 VIN: $(arrtd[3]).text(),
 TM_MODEL_MATERIAL_ID: $(arrtd[4]).text(),
 ORDER_TYPE: $(arrtd[5]).text(),
 ORDER_STATUS: $(arrtd[6]).text(),
 CREATE_DATE: $(arrtd[7]).text() == "-" ? null : $(arrtd[7]).text(),
 PLAN_DATE: $(arrtd[8]).text() == "-" ? null : $(arrtd[8]).text(),
 VMS_NO: $(arrtd[9]).text(),
 ENGIN_CODE: $(arrtd[10]).text(),
 TRANS_CODE: $(arrtd[11]).text(),
 OFFLINE_DATE_ACT: $(arrtd[12]).text() == "-" ? null : $(arrtd[12]).text(),
 HOLD_RES: $(arrtd[13]).text(),
 SPC_FLAG: $(arrtd[14]).text(),
 TO_ORDER_ID: $(ui.helper[0]).attr("data-uniqueid")
 
 };
 var oTop = ui.helper[0].offsetTop;
 var iRowHeadHeight = 40;
 var iRowHeight = 37;
 var rowIndex = 0;
 if (oTop <= iRowHeadHeight + iRowHeight / 2) {
 rowIndex = 0;
 }
 else {
 rowIndex = Math.ceil((oTop - iRowHeadHeight) / iRowHeight);
 }
 $("#tb_order_right").bootstrapTable("insertRow", { index: rowIndex, row: rowdata });
 $(&#39;#tb_order_left&#39;).bootstrapTable("removeByUniqueId", $(ui.helper[0]).attr("data-uniqueid"));
 oTableInit.InitDrag();
 }
 });

드롭 이벤트에서 현재 드래그된 행 데이터를 가져와서 현재 마우스 위치를 계산합니다. 오른쪽 테이블 드래그한 행 데이터를 지정된 위치에 삽입합니다. 그런 다음 왼쪽 테이블에서 드래그한 행 데이터를 삭제합니다.
2.2.3 Undo 연산 코드

//撤销操作点击事件
 $("#btn_cancel").click(function () {
 if (i_statuindex <= 0) {
 return;
 }
 for (var i = 0; i < arrdata.length; i++) {
 if (arrdata[i].index != i_statuindex) {
 continue;
 }
 var arr_left_data = eval(arrdata[i].left_data);
 var arr_right_data = eval(arrdata[i].right_data);
 
 $(&#39;#tb_order_left&#39;).bootstrapTable(&#39;removeAll&#39;);
 $(&#39;#tb_order_right&#39;).bootstrapTable(&#39;removeAll&#39;);
 $(&#39;#tb_order_left&#39;).bootstrapTable(&#39;append&#39;, arr_left_data);
 for (var x = 0; x < arr_right_data.length; x++) {
 $("#tb_order_right").bootstrapTable("insertRow", { index: x, row: arr_right_data[x] });
 }
 //$(&#39;#tb_order_right&#39;).bootstrapTable(&#39;append&#39;, arr_right_data);//append之后不能drop
 break;
 }
 i_statuindex--;
 
 //重写注册可拖拽
 m_oTable.InitDrag();
 });

Undo 연산은 주로 전역 변수 arrdata의 인덱스를 기준으로 어느 단계를 Undo할지 결정한 후 현재 테이블의 좌우 테이블 데이터를 꺼냅니다. 인덱스에 따라 단계를 거쳐 두 테이블에 차례로 추가합니다. 그러면 i_statuindex가 0이 될 때까지 순차적으로 감소합니다. 왼쪽 테이블 행의 모든 ​​데이터가 다시 작성되고 로드되므로 필요합니다. 드래그 가능한 이벤트를 다시 등록합니다. 이렇게 간단한 3단계만 거치면 원하는 효과를 얻을 수 있습니다. 아주 간단하지 않나요~~

위 내용이 모두의 학습에 도움이 되기를 바랍니다.

JS 구성 요소 Bootstrap 테이블 테이블 행 드래그 효과 구현 코드 관련 기사를 더 보려면 PHP 중국어 웹사이트를 주목하세요!

관련글 :

부트스트랩으로 기본 레이아웃을 구현하는 방법에 대한 자세한 설명

BootStrap 테이블 사용법 분석

Bootstrap 전환 효과 사용법 Transition modal box(Modal)

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.