首頁 web前端 js教程 JS元件Bootstrap Table表格行拖曳效果實作程式碼

JS元件Bootstrap Table表格行拖曳效果實作程式碼

Mar 20, 2017 pm 02:02 PM

一、業務需求及實現效果

項目涉及到訂單模組,那天突然接到一個需求,說是兩種不同狀態的訂單之間要實現插單的效果,頁面上呈現方式是:左右兩個Table,左邊Table裡面是狀態為1的訂單,右邊Table裡面是狀態為2訂單,左邊Table裡面的行資料拖曳到右邊Table裡面指定行的位置,拖曳完成後,左邊表格減少一行,右邊表格增加一行。除此之外,還需要撤銷操作(相當於Ctrl + Z操作),能夠回到上一步的狀態。可能描述會讓大家模擬兩可,反正已經實現了,先來看看效果圖。

1、先看看拖動之前的效果

2、這是拖動左邊表格行數據的效果

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

3、拖動一行完成之後表格數據的效果

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

4、第二次、第三次拖曳完成後效果

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

5、右邊表格上面撤銷操作點擊效果

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

6、多次點擊撤銷,表格回到初始狀態

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

6、多次點擊撤銷,表格回到初始狀態


程式碼範例

接到需求的第一個感覺是應該上Bootstrap table api裡面找一下,畢竟開源的力量是強大的,或許有相關的範例呢。經過一番查找,很可惜,Bootstrap Table沒有這種兩張表格之間的操作。想想其實也可以理解,Bootstrap Table是針對某個動態表格資料綁定的,它的重點是表格內部的功能,例如表格內部行的拖曳排序(Reorder Rows)有很好的解決方案,對於像部落客這樣的特殊需求,似乎也應該自己去實現。
1、需求分析
既然決定自己去寫,開始分析需求,似乎這個操作裡面比較困難的是拖曳效果,說到拖曳效果,原來使用JsPlumb的時候那使用太多了,於是就想到了我們神奇的JQuery UI裡面的draggable.js 和droppable.js。拖曳的問題解決了,那麼還有一個難點,就是撤銷操作怎麼辦?我們知道Ctrl+z的意思是還原,什麼叫還原?就是回到上一步的操作,那麼前提是要能夠保存上一步的狀態,說到保存某一步的狀態,博主就知道怎麼做了,需要一個全域變數Json,裡面要有三個鍵值對,分別是目前步驟的索引、左邊表格的資料、右邊表格的資料。似乎也不太難嘛,就此著手,開乾。

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;
};
登入後複製

我們重點來看幾個地方的程式碼:

2.2.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的start事件中,我們將拖曳先前的左右表格中的資料全部保存到arrdata變數中,i_statuindex這個全域變數用於記錄當前這一步驟的索引,用於撤銷操作。

2.2.2 右邊表格在載入成功之後註冊表格的droppable事件

$("#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();
 }
 });
登入後複製

在drop事件時,取到當前拖過來的行數據,計算當前滑鼠所在的位置,在右邊表格指定位置插入拖過來的行數據。然後刪除左邊表格拖曳來的行資料。

2.2.3 撤銷操作代碼

//撤销操作点击事件
 $("#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();
 });
登入後複製

撤銷操作主要是透過全域變數arrdata裡面的索引判斷撤銷到哪一步,然後根據索引取出當前步驟的左右表格數據,依次向兩個表插入數據,然後i_statuindex依次遞減,直到等於零,由於左邊表格行資料全部重寫載入過,所以需要重新註冊可拖曳事件。就是這麼簡單的三步驟就能實現想要的效果,是不是很簡單~~

以上就是本文的全部內容,希望對大家的學習有所幫助。

更多JS組件Bootstrap Table表格行拖曳效果實現代碼相關文章請關注PHP中文網!

相關文章:

詳解Bootstrap實現基本版面的方法🎜🎜

BootStrap table使用方法分析

使用Bootstrap過渡效果Transition模態框(Modal)的方法

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何創建和發布自己的JavaScript庫? 如何創建和發布自己的JavaScript庫? Mar 18, 2025 pm 03:12 PM

文章討論了創建,發布和維護JavaScript庫,專注於計劃,開發,測試,文檔和促銷策略。

如何在瀏覽器中優化JavaScript代碼以進行性能? 如何在瀏覽器中優化JavaScript代碼以進行性能? Mar 18, 2025 pm 03:14 PM

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

如何使用瀏覽器開發人員工具有效調試JavaScript代碼? 如何使用瀏覽器開發人員工具有效調試JavaScript代碼? Mar 18, 2025 pm 03:16 PM

本文討論了使用瀏覽器開發人員工具的有效JavaScript調試,專注於設置斷點,使用控制台和分析性能。

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何使用源地圖調試縮小JavaScript代碼? 如何使用源地圖調試縮小JavaScript代碼? Mar 18, 2025 pm 03:17 PM

本文說明瞭如何使用源地圖通過將其映射回原始代碼來調試JAVASCRIPT。它討論了啟用源地圖,設置斷點以及使用Chrome DevTools和WebPack之類的工具。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

console.log輸出結果差異:兩次調用為何不同? console.log輸出結果差異:兩次調用為何不同? Apr 04, 2025 pm 05:12 PM

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...

See all articles