Layui-經典模組化前端框架
技術標籤:layui
Layui
1. Layui簡介
layui(諧音:類UI) 是一款採用自身模組規範編寫的前端 UI 框架,遵循原生 HTML/CSS/JS 的書寫與組織形式,門檻極低,拿來即用。
其外在極簡,卻又不失飽滿的內在,體積輕盈,元件豐盈,從核心程式碼到 API 的每一處細節都經過精心雕琢,非常適合介面的快速開發。
1.1 下載
官網:https://www.layui.com/
下載後的目錄結構如下:
├─css //css目錄
│ │─modules //模組css目錄
│ │ ├─laydate
│ │ ├─layer
│ │ └─layim
│ └─layui.css //核心樣式檔案
├─font //字型圖示目錄
├─images //圖片資源目錄(目前只有layim和編輯器用到的GIF表情)
│─lay //模組核心目錄
│ └─modules //各模組元件
│─layui.js //基礎核心庫
└─layui.all.js //包含layui.js和所有模組的合併檔案
1.2 入門
<%@ page language= "java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content= "text/html; charset=UTF-8">
<title>layui-demo</title>
<!-- 引入layui的樣式 -->
<link rel="stylesheet" href="layui/css/layui.css">
</head>
<body>
<!-- 使用layUI的按鈕樣式-->
<button type="button" class="layui-btn">一個標準的按鈕</button>
<script src="layui/layui.js"></script>
<script>
/* 使用layUI的彈出層模組 */
layui.use(['layer'], function(){
var layer = layui.layer;
/* 彈出hello world提示 */
layer.msg('Hello World');
});
</script>
</body>
</html>
2. 柵格佈局
如你所願,在 layui 2.0 的版本中,我們加入了強勁的柵格系統和後臺佈局方案,這意味著你終於可以著手採用 layui 排版你的響應式網站和後臺系統了。layui 的柵格系統採用業界比較常見的 12 等分規則,內建移動裝置、平板、桌面中等和大型螢幕的多終端適配處理,最低能支援到ie8。而你應當更欣喜的是,layui 終於開放了它經典的後臺佈局方案,快速搭建一個屬於你的後臺系統將變得十分輕鬆自如。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>layui-demo</title>
<link rel="stylesheet" href="layui/css/layui.css">
</head>
<body>
<!-- <div class="layui-fluid"> : 鋪滿 -->
<div class="layui-container">
常規佈局(以中型螢幕桌面為例):
<div class="layui-row">
<div class="layui-col-md9 layui-col-lg6 layui-bg-blue">
你的內容 9/12
</div>
<div class="layui-col-md3 layui-col-lg6 layui-bg-red">
你的內容 3/12
</div>
</div>
</div>
</body>
</html>
-
採用 layui-row 來定義行,如:
<div class="layui-row"></div>
-
列可以同時出現最多四種不同的組合,分別是:xs(超小螢幕,如手機)、sm(小螢幕,如平板)、md(桌面中等螢幕)、lg(桌面大型螢幕),以呈現更加動態靈活的佈局。
3. 圖示
layui 的所有圖示全部採用字型形式,取材於阿里巴巴向量圖示庫(iconfont)。因此你可以把一個 icon 看作是一個普通的文字,這意味著你直接用 css 控制文字屬性,如 color、font-size,就可以改變圖示的顏色和大小。你可以通過 font-class 或 unicode 來定義不同的圖示。
通過對一個內聯元素(一般推薦用 i標籤)設定 class=“layui-icon”,來定義一個圖示,然後對元素加上圖示對應的 font-class(注意:layui 2.3.0 之前只支援採用 unicode 字元),即可顯示出你想要的圖示,譬如:
<i class="layui-icon layui-icon-face-smile" ></i>
或者
<i class="layui-icon"></i>
4. 按鈕
向任意HTML元素設定class=“layui-btn”,建立一個基礎按鈕。通過追加格式為*layui-btn-{type}*的class來定義其它按鈕風格。內建的按鈕class可以進行任意組合,從而形成更多種按鈕風格。
<button type="button" class="layui-btn">一個標準的按鈕</button>
<a href="http://www.bailiban.com" class="layui-btn">一個可跳轉的按鈕</a>
4.1 主題
<button type="button" class="layui-btn layui-btn-primary">原始按鈕</button>
<button type="button" class="layui-btn ">預設按鈕</button>
<button type="button" class="layui-btn layui-btn-normal">百搭按鈕</button>
<button type="button" class="layui-btn layui-btn-warm">暖色按鈕</button>
<button type="button" class="layui-btn layui-btn-danger">警告按鈕</button>
<button type="button" class="layui-btn layui-btn-disabled">禁用按鈕</button>
4.2 尺寸
<button type="button" class="layui-btn layui-btn-lg">大型按鈕</button>
<button type="button" class="layui-btn ">預設按鈕</button>
<button type="button" class="layui-btn layui-btn-sm">小型按鈕</button>
<button type="button" class="layui-btn layui-btn-xs">迷你按鈕</button>
<button type="button" class="layui-btn layui-btn-fluid">流體按鈕(最大化適應)</button>
4.3 圓角
<button type="button" class="layui-btn layui-btn-radius layui-btn-primary">原始按鈕</button>
<button type="button" class="layui-btn layui-btn-radius ">預設按鈕</button>
<button type="button" class="layui-btn layui-btn-radius layui-btn-normal">百搭按鈕</button>
<button type="button" class="layui-btn layui-btn-radius layui-btn-warm">暖色按鈕</button>
<button type="button" class="layui-btn layui-btn-radius layui-btn-danger">警告按鈕</button>
<button type="button" class="layui-btn layui-btn-radius layui-btn-disabled">禁用按鈕</button>
4.4 圖示按鈕
<button type="button" class="layui-btn">
<i class="layui-icon"></i> 新增
</button>
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary">
<i class="layui-icon"></i>
</button>
- 圖示字型參考圖示列表。
4.5 按鈕組
<div class="layui-btn-group">
<button type="button" class="layui-btn">增加</button>
<button type="button" class="layui-btn">編輯</button>
<button type="button" class="layui-btn">刪除</button>
</div>
<div class="layui-btn-group">
<button type="button" class="layui-btn layui-btn-sm">
<i class="layui-icon"></i>
</button>
<button type="button" class="layui-btn layui-btn-sm">
<i class="layui-icon"></i>
</button>
<button type="button" class="layui-btn layui-btn-sm">
<i class="layui-icon"></i>
</button>
<button type="button" class="layui-btn layui-btn-sm">
<i class="layui-icon"></i>
</button>
</div>
<div class="layui-btn-group">
<button type="button" class="layui-btn layui-btn-primary layui-btn-sm">
<i class="layui-icon"></i>
</button>
<button type="button" class="layui-btn layui-btn-primary layui-btn-sm">
<i class="layui-icon"></i>
</button>
<button type="button" class="layui-btn layui-btn-primary layui-btn-sm">
<i class="layui-icon"></i>
</button>
</div>
5. 後臺佈局
layui 之所以贏得如此多人的青睞,更多是在於它前後臺系統通吃的能力。既可編織出絢麗的前臺頁面,又可滿足繁雜的後臺功能需求。layui 致力於讓每一位開發者都能輕鬆搭建自己的後臺。下面是 layui 提供的一個現場的方案。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>layui-demo</title>
<link rel="stylesheet" href="layui/css/layui.css">
</head>
<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
<div class="layui-header">
<div class="layui-logo">layui 後臺佈局</div>
<!-- 頭部區域(可配合layui已有的水平導航) -->
<ul class="layui-nav layui-layout-left">
<li class="layui-nav-item"><a href="">控制檯</a></li>
<li class="layui-nav-item"><a href="">商品管理</a></li>
<li class="layui-nav-item"><a href="">使用者</a></li>
<li class="layui-nav-item">
<a href="javascript:;">其它系統</a>
<dl class="layui-nav-child">
<dd><a href="">郵件管理</a></dd>
<dd><a href="">訊息管理</a></dd>
<dd><a href="">授權管理</a></dd>
</dl>
</li>
</ul>
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item">
<a href="javascript:;">
<img src="http://t.cn/RCzsdCq" class="layui-nav-img">
賢心
</a>
<dl class="layui-nav-child">
<dd><a href="">基本資料</a></dd>
<dd><a href="">安全設定</a></dd>
</dl>
</li>
<li class="layui-nav-item"><a href="">退了</a></li>
</ul>
</div>
<div class="layui-side layui-bg-black">
<div class="layui-side-scroll">
<ul class="layui-nav layui-nav-tree" lay-filter="test">
<li class="layui-nav-item layui-nav-itemed">
<a class="" href="javascript:;">系統管理</a>
<dl class="layui-nav-child">
<!-- data-url 定義點選後要顯示的頁面 -->
<dd><a href="javascript:;" data-url="user.jsp">使用者管理</a></dd>
<dd><a href="javascript:;" data-url="good.jsp">商品管理</a></dd>
</dl>
</li>
</ul>
</div>
</div>
<div class="layui-body">
<!-- 內容主體區域 -->
<div style="padding: 15px;" class="pagenav">內容主體區域</div>
</div>
<div class="layui-footer">
<!-- 底部固定區域 -->
© layui.com - 底部固定區域
</div>
</div>
<script src="layui/layui.js"></script>
<script>
//JavaScript程式碼區域
layui.use('element', function(){
/* 使用layui內建的jquery */
var $=layui.$;
/* 給選單新增點選事件 */
$('dl.layui-nav-child>dd').click(function (){
/* 獲取點選後的跳轉頁面url */
var url = $(this).find("a").attr("data-url");
/* 將URL部分內容顯示在主體區域 */
$('.pagenav').load(url);
})
});
</script>
</body>
</html>
6. 資料表格
table 模組是layui的又一走心之作,在 layui 2.0 的版本中全新推出,是 layui 最核心的組成之一。它用於對錶格進行一些列功能和動態化資料操作,涵蓋了日常業務所涉及的幾乎全部需求。支援固定表頭、固定行、固定列左/列右,支援拖拽改變列寬度,支援排序,支援多級表頭,支援單元格的自定義模板,支援對錶格過載(比如搜尋、條件篩選等),支援複選框,支援分頁,支援單元格編輯等等一些列功能。儘管如此,我們仍將對其進行完善,在控制程式碼量和效能的前提下,不定期增加更多人性化功能。table 模組也將是 layui 重點維護的專案之一。
這裡的資料表格的演示我們採用前臺跟後臺互動的方式,故我們先準備後臺的表格資料。
資料準備
我們在後臺封裝100條使用者資料,由於前端接收資料的時候接收的是json格式字串,所以後臺在傳遞資料時候需要進行資料處理。
public class UserData {
// 使用者資料的集合
public static List<User> userList = new ArrayList<User>();
}
public class User {
private String id ;
private String name ;
private String password ;
private String userImg ;
// setter and getter
}
@WebServlet("/TableDataServlet")
public class TableDataServlet extends HttpServlet {
// 構造方法中建立100條使用者資料
public TableDataServlet() {
for(int i=1;i<=100;i++){
User u = new User(i,"seven"+i,"123456","1.png");
UserData.userList.add(u);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 獲取前端傳遞需要的頁號跟每頁顯示數量
String pageNum = req.getParameter("page");
String limit = req.getParameter("limit");
// 獲取當頁數量的集合
List<User> pageList = getPageList(Integer.parseInt(pageNum),Integer.parseInt(limit));
resp.setContentType("text/json;charset=utf-8");
// 將資料封裝成前端需要的格式
JSONObject data = new JSONObject();
data.put("code", 0);
data.put("msg", "no data."); // 無資料顯示的內容
data.put("count", userList.size());
JSONArray array= JSONArray.parseArray(JSON.toJSONString(pageList));
data.put("data", array);
resp.getWriter().write(data.toString());
}
// 獲取當頁數量的集合
public List<User> getPageList(int pageNo ,int pageLimit){
List<User> list = new ArrayList<>();
int maxSize = UserData.userList.size()> pageNo*pageLimit? pageNo*pageLimit:UserData.userList.size() ;
for(int i=(pageNo-1)*pageLimit;i<maxSize;i++){
list.add(UserData.userList.get(i));
}
return list ;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
- 引數的
page
表示頁碼。 - 引數
limit
表示每頁顯示的數量。
前臺頁面user.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>使用者列表</title>
<link rel="stylesheet" href="layui/css/layui.css" media="all">
<style>
/* 設定表格行高自適應 */
.layui-table-cell {
height: auto !important;
}
</style>
</head>
<body>
<div><button type="button" class="layui-btn" id="add_btn">新增</button></div>
<table id="demo" lay-filter="demo" ></table>
<script>
layui.use('table',function(){
var table = layui.table;
//第一個例項
table.render({
elem: '#demo' //指定原始 table 容器的選擇器或 DOM,方法渲染方式必填
,toolbar:true // 是否顯示工具條
,url: 'TableDataServlet' //資料介面
,page: true //開啟分頁
,cols: [[ //表頭,裡面的name必須保證返回的json陣列的bean的屬性名為name,titile為頁面表頭顯示的欄位名
{field: 'id', title: 'ID', width:'20%',sort:true}
,{field: 'name', title: '姓名', width: '20%',sort:true}
,{field: 'password', title: '密碼', width:'20%'}
,{field: 'userImg', title: '密碼',templet : '#proImg'}
,{fixed: 'right',title : '操作',align:'center', toolbar: '#opt'}
]]
});
});
</script>
<script id="opt" type="text/html">
<a lay-event="update_event" href="javascript:;" ><button type="button" class="layui-btn layui-btn-radius layui-btn-xs layui-btn-normal">修改</button></a>
<a lay-event="del_event" href="javascript:;" ><button type="button" class="layui-btn layui-btn-radius layui-btn-xs layui-btn-normal">刪除</button></a>
</script>
<!-- 下面是圖片單元格要放入的內容,跟上面的templet對應 -->
<script id="proImg" type="text/html">
<img src="ImageServlet?imgName={{d.user_img}}" />
</script>
</body>
</html>
@WebServlet("/ImageServlet")
public class ImageServlet extends HttpServlet{
// 假設圖片都是存在這個路徑下
private static String path = "D://upload//";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 獲取傳遞過來的檔名
String imgName = req.getParameter("imgName");
// 取path路徑下找到這個檔案,作為流資料讀取踹,然後通過OutputStream寫到客戶端
// 如果看不懂這段程式碼,把當時課堂上講的圖片上傳視訊再重複看下
FileInputStream inputStream = new FileInputStream(path+imgName);
int i = inputStream.available();
byte[] buff = new byte[i];
inputStream.read(buff);
inputStream.close();
resp.setContentType("image/*");
OutputStream out = resp.getOutputStream();
out.write(buff);
out.close();
}
}
- 最後一列加上了操作列,為後續功能做準備。
- 由於
user.jsp
是內嵌在導航頁面中,所以user.jsp
不需要再次引入layui的css跟js。 sort:true
表示是否給列加上排序功能。templet
是為了設定自定義列內容跟結構。.layui-table-cell
是為了設定列高度自適應。
7. 彈出層
layer 至今仍作為 layui 的代表作,她的受眾廣泛並非偶然,而是這數年來的堅持、不棄的執念,將那些不屑的眼光轉化為應得的尊重,不斷完善和維護、不斷建設和提升社群服務,在 Web 開發者的圈子裡口口相傳,乃至於成為今天的 layui 最強勁的源動力。目前,layer已成為國內最多人使用的 Web 彈層元件,GitHub) 自然Stars5000+,官網累計下載量達50w+,大概有30萬不同規模的 Web 平臺使用過 layer。
之所以列舉上面這些數字,並非是在誇誇其談,而是懂 layer 的人都知道,這是一種怎樣不易的沉澱。而由於 layer 在 layui 體系中的位置比較特殊,甚至讓很多人都誤以為 layui = layer ui,所以再次強調 layer 只是作為 layui 的一個彈層模組,由於其使用者基數較大,所以至今仍把她作為獨立元件來維護。
layer作為獨立元件使用,你可以去layer獨立版本官網下載元件包。你需要在你的頁面引入jQuery1.8以上的任意版本,並引入layer.js。且jquery的引入位置必須放到layer引入之前,否則無效。
-
layer的獨立版本:https://layer.layui.com/
-
使用方式
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <script src="layer/layer.js"></script> <script type="text/javascript"> layer.msg('hello'); </script>
layer作為 layui 模組化使用,那麼你直接在官網下載 layui 框架即可,無需引入 jQuery 和 layer.js,但需要引入layui.css和layui.js。
-
使用方式
<script> layui.use('layer', function(){ var layer = layui.layer; layer.msg('hello'); }); </script>
-
type
layer提供了5種層型別。可傳入的值有:0(資訊框,預設)1(頁面層)2(iframe層)3(載入層)4(tips層)。 若你採用*layer.open({type: 1})*方式呼叫,則type為必填項(資訊框除外)
-
title
title支援三種類型的值,若你傳入的是普通的字串,如title :‘我是標題’,那麼只會改變標題文字;若你還需要自定義標題區域樣式,那麼你可以title: [‘文字’, ‘font-size:18px;’],陣列第二項可以寫任意css樣式;如果你不想顯示標題欄,你可以title: false
-
content
content可傳入的值是靈活多變的,不僅可以傳入普通的html內容,還可以指定DOM,更可以隨著type的不同而不同。
-
area
在預設狀態下,layer是寬高都自適應的,但當你只想定義寬度時,你可以area: ‘500px’,高度仍然是自適應的。當你寬高都要定義時,你可以area: [‘500px’, ‘300px’]
-
btn
資訊框模式時,btn預設是一個確認按鈕,其它層型別則預設不顯示,載入層和tips層則無效。當您只想自定義一個按鈕時,你可以btn: ‘我知道了’,當你要定義兩個按鈕時,你可以btn: [‘yes’, ‘no’]。當然,你也可以定義更多按鈕,比如:btn: [‘按鈕1’, ‘按鈕2’, ‘按鈕3’, …],按鈕1的回撥是yes,而從按鈕2開始,則回撥為btn2: function(){},以此類推。
-
closeBtn
layer提供了兩種風格的關閉按鈕,可通過配置1和2來展示,如果不顯示,則closeBtn: 0
-
shade
即彈層外區域。預設是0.3透明度的黑色背景(’#000’)。如果你想定義別的顏色,可以shade: [0.8, ‘#393D49’];如果你不想顯示遮罩,可以shade: 0
-
shadeClose
如果你的shade是存在的,那麼你可以設定shadeClose來控制點選彈層外區域關閉。
-
time
預設不會自動關閉。當你想自動關閉時,可以time: 5000,即代表5秒後自動關閉,注意單位是毫秒(1秒=1000毫秒)
-
layer.open(options)
基本上是露臉率最高的方法,不管是使用哪種方式建立層,都是走layer.open(),建立任何型別的彈層都會返回一個當前層索引,上述的options即是基礎引數
-
layer.alert(content, options, yes) - 普通訊息框
它的彈出似乎顯得有些高調,一般用於對使用者造成比較強烈的關注,類似系統alert,但卻比alert更靈便。它的引數是自動向左補齊的。通過第二個引數,可以設定各種你所需要的基礎引數,但如果你不需要的話,直接寫回調即可。
-
layer.confirm(content, options, yes, cancel) - 詢問框
類似系統confirm,但卻遠勝confirm,另外它不是和系統的confirm一樣阻塞你需要把互動的語句放在回撥體中。同樣的,它的引數也是自動補齊的。
-
layer.msg(content, options, end) - 提示框
我們在原始碼中用了相對較大的篇幅來定製了這個msg,目的是想將其打造成露臉率最高的提示框。而事實上我的確也在大量地使用它。因為它簡單,而且足夠得自覺,它不僅佔據很少的面積,而且預設還會3秒後自動消失所有這一切都決定了我對msg的愛。因此我賦予了它許多可能在外形方面,它堅持簡陋的變化,在作用方面,它堅持零使用者操作。而且它的引數也是自動補齊的。
-
layer.load(icon, options) - 載入層
type:3的深度定製。load並不需要你傳太多的引數,但如果你不喜歡預設的載入風格,你還有選擇空間。icon支援傳入0-2如果是0,無需傳。另外特別注意一點:load預設是不會自動關閉的,因為你一般會在ajax回撥體中關閉它。
-
layer.close(index) - 關閉特定層
關於它似乎沒有太多介紹的必要,唯一讓你疑惑的,可能就是這個index了吧。事實上它非常容易得到。
//當你在iframe頁面關閉自身時 var index = parent.layer.getFrameIndex(window.name); //先得到當前iframe層的索引 parent.layer.close(index); //再執行關閉 //如果你想關閉最新彈出的層,直接獲取layer.index即可 layer.close(layer.index); //它獲取的始終是最新彈出的某個層,值是由layer內部動態遞增計算的
8. 表單
我們通常會在最常用的模組上耗費更多的精力,用盡可能簡單的方式詮釋 layui 所帶來的便捷性。顯而易見,form 是我們非常看重的一塊。於是它試圖用一貫極簡的姿態,去捕獲你對它的深深青睞。寄託在原始表單元素上的屬性設定,及其全自動的初始渲染,和基於事件驅動的介面書寫方式,會讓你覺得,傳統模式下的元件呼叫形式,也可以是那樣的優雅、簡單。然而文字的陳述始終是蒼白的,所以用行動慢慢感受 layui.form 給你的專案帶來的效率提升吧。
元素元件
layui 針對各種表單元素做了較為全面的UI支援,你無需去書寫那些 UI 結構,你只需要寫 HTML 原始的 input、select、textarea 這些基本的標籤即可。我們在 UI 上的渲染只要求一點,你必須給表單體系所在的父元素加上*class="layui-form"*,一切的工作都會在你載入完form模組後,自動完成。如下是一個最基本的例子:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>layui.form小例子</title>
<link rel="stylesheet" href="layui.css" media="all">
</head>
<body>
<form class="layui-form"> <!-- 提示:如果你不想用form,你可以換成div等任何一個普通元素 -->
<div class="layui-form-item">
<label class="layui-form-label">輸入框</label>
<div class="layui-input-block">
<input type="text" name="" placeholder="請輸入" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">下拉選擇框</label>
<div class="layui-input-block">
<select name="interest" lay-filter="aihao">
<option value="0">寫作</option>
<option value="1">閱讀</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">複選框</label>
<div class="layui-input-block">
<input type="checkbox" name="like[write]" title="寫作">
<input type="checkbox" name="like[read]" title="閱讀">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">開關關</label>
<div class="layui-input-block">
<input type="checkbox" lay-skin="switch">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">開關開</label>
<div class="layui-input-block">
<input type="checkbox" checked lay-skin="switch">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">單選框</label>
<div class="layui-input-block">
<input type="radio" name="sex" value="0" title="男">
<input type="radio" name="sex" value="1" title="女" checked>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">請填寫描述</label>
<div class="layui-input-block">
<textarea placeholder="請輸入內容" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="*">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
<!-- 更多表單結構排版請移步文件左側【頁面元素-表單】一項閱覽 -->
</form>
<script src="layui.js"></script>
<script>
layui.use('form', function(){
var form = layui.form;
//各種基於事件的操作,下面會有進一步介紹
});
</script>
</body>
</html>
事件監聽
語法:form.on('event(過濾器值)', callback);
event | 描述 |
---|---|
select | 監聽select下拉選擇事件 |
checkbox | 監聽checkbox複選框勾選事件 |
switch | 監聽checkbox複選框開關事件 |
radio | 監聽radio單選框事件 |
submit | 監聽表單提交事件 |
-
監聽select
form.on('select(test)', function(data){ console.log(data); });
-
監聽checkbox複選
form.on('checkbox(filter)', function(data){ console.log(data.elem); //得到checkbox原始DOM物件 console.log(data.elem.checked); //是否被選中,true或者false console.log(data.value); //複選框value值,也可以通過data.elem.value得到 console.log(data.othis); //得到美化後的DOM物件 });
-
監聽submit提交
按鈕點選或者表單被執行提交時觸發,其中回撥函式只有在驗證全部通過後才會進入,回撥返回三個成員:
form.on('submit(*)', function(data){ console.log(data.elem) //被執行事件的元素DOM物件,一般為button物件 console.log(data.form) //被執行提交的form物件,一般在存在form標籤時才會返回 console.log(data.field) //當前容器的全部表單欄位,名值對形式:{name: value} return false; //阻止表單跳轉。如果需要表單跳轉,去掉這段即可。 });
再次溫馨提示:上述的*submit(*)*中的 *** 號為事件過濾器的值,是在你繫結執行提交的元素時設定的,如:
<button lay-submit lay-filter="*">提交</button>
你可以把*號換成任意的值,如:lay-filter=“go”,但監聽事件時也要改成 form.on(‘submit(go)’, callback);
表單賦值 / 取值
語法:form.val(‘filter’, object);
用於給指定表單集合的元素賦值和取值。如果 object 引數存在,則為賦值;如果 object 引數不存在,則為取值。
//給表單賦值
form.val("formTest", { //formTest 即 class="layui-form" 所在元素屬性 lay-filter="" 對應的值
"username": "賢心" // "name": "value"
,"sex": "女"
,"auth": 3
,"check[write]": true
,"open": false
,"desc": "我愛layui"
});
//獲取表單區域所有值
var data1 = form.val("formTest");
第二個引數中的鍵值是表單元素對應的 name 和 value。
9. 新增
開啟新增頁面
<div><button class="layui-btn" id="add_btn">新增</button></div>
<script>
$("#add_btn").on("click",function () {
layer.msg(" add ") ;
layer.open({
type:2,
title:"使用者新增",
area: ['700px', '600px'],
maxmin:true,
shadeClose :false,
content:'add.jsp'
});
});
</script>
顯示新增頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>layui</title>
<link rel="stylesheet" href="static/layui/css/layui.css">
</head>
<body>
<form class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">使用者名稱</label>
<div class="layui-input-block">
<input type="text" name="userName" placeholder="請輸入使用者名稱" autocomplete="off" class="layui-input" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">密碼</label>
<div class="layui-input-block">
<input type="text" name="userPwd" placeholder="請輸入使用者密碼" autocomplete="off" class="layui-input" >
</div>
</div>
<input id="img" type="hidden" name="imgName" />
<div class="layui-upload">
<button type="button" class="layui-btn" id="test1">上傳圖片</button>
<div class="layui-upload-list">
<img class="layui-upload-img" id="demo1">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="*">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
<script src="static/layui/layui.js"></script>
<script>
layui.use(['form','upload'], function(){
var upload = layui.upload;
var form = layui.form;
var $ = layui.$;
//圖片上傳
var uploadInst = upload.render({
elem: '#test1' //繫結元素
,url: 'UploadServlet' //上傳介面
,before: function(obj){
//預讀本地檔案示例
obj.preview(function(index, file, result){
$('#demo1').attr('src', result); //圖片連結
});
}
,done: function(res){
//res 獲取返回的json結果
$('#img').val(res.data.imgName);
}
});
form.on('submit(*)', function(data){
//1,資料提交到後臺,2,關閉當前頁面,3重新整理父頁面的table
$.post("InsertServlet",data.field,function () {
// 提交後重新整理父頁面的表格,demo為父表格的id
parent.layui.table.reload('demo');
// 通過父頁面關閉當前頁面
var index = parent.layer.getFrameIndex(window.name); //先得到當前iframe層的索引
parent.layer.close(index);
return true ;// 返回true表示提交資料,返回false表示不提交
});
});
});
</script>
</body>
</html>
處理新增請求的InsertServlet
@WebServlet("/InsertServlet")
public class InsertSerlvet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName = req.getParameter("userName");
String userPwd = req.getParameter("userPwd");
String imgName = req.getParameter("imgName");
User u = new User(""+(new Random().nextInt() + 100),userName,userPwd,imgName);
UserData.userList.add(u);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
10. 刪除跟修改功能
上面基於後臺佈局的demo有了表格列表資料的顯示功能,還有了新增功能,現將刪除跟修改功能也補全完整。
上面已經把修改跟刪除的介面顯示定義出來,我們這裡只需要通過table.on
將點選事件進行繫結即可。
table.on('tool(demo)', function(obj){
var layEvent = obj.event; //獲得 lay-event 對應的值
var data = obj.data; //獲得當前行資料
var userName = data.name;// 表單中的name欄位
var userId = data.id;// 表單中的id欄位
var $ = layui.$ ;
if(layEvent === 'del_event'){
layer.confirm("你確定真的要刪除"+userName+"的資料嗎?",{icon: 2},function(index){
// 非同步請求去後臺刪除資料
$.post("DeleteServlet",{"user_id":userId},function(data){
// 刪除成功給出提示
if(data.flag){
// 操作成功的提示
layer.msg("刪除成功!",{icon:1});
// 關閉最新的層
layer.close(layer.index);
// 重新整理id為demo的table資料
layui.table.reload("demo");
}
});
});
}else if(layEvent === 'update_event'){// 修改操作
// 開啟修改頁面
layer.open({
type:2,
title:"使用者修改",
area: ['700px', '600px'],
maxmin:true,
shadeClose :false,
// 修改頁面需要先訪問Servlet獲取修改的使用者資訊
content:'UpdatePageServlet?user_id='+userId
});
}
});
table.on('tool(demo)'
中的demo是去找lay-filter="demo"
的table。
刪除的後臺功能
@WebServlet("/DeleteServlet")
public class DeleteServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String deleteId = req.getParameter("deleteId");
for(int i = 0; i< UserData.userList.size(); i++){
String id = UserData.userList.get(i).getId() ;
if(id.equals(deleteId)){
UserData.userList.remove(i);
break;
}
}
resp.setContentType("text/json;charset=utf-8");
resp.getWriter().write("{\"flag\":true}");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
進入修改頁面時需要先到後臺獲取要修改的使用者資訊
@WebServlet("/UpdatePageServlet")
public class UpdatePageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String userId = req.getParameter("userId");
for(int i = 0; i< UserData.userList.size(); i++){
String id = UserData.userList.get(i).getId() ;
if(id.equals(userId)){
req.setAttribute("updateUser", UserData.userList.get(i));
break;
}
}
req.getRequestDispatcher("update.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
然後才能開啟修改頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>layui</title>
<link rel="stylesheet" href="static/layui/css/layui.css">
<style>
#demo1{
width: 300px;
}
</style>
</head>
<body>
<form class="layui-form">
<input type="hidden" name="userId" value="${updateUser.id}" />
<div class="layui-form-item">
<label class="layui-form-label">使用者名稱</label>
<div class="layui-input-block">
<input type="text" name="userName" value="${updateUser.name}" placeholder="請輸入使用者名稱" autocomplete="off" class="layui-input" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">密碼</label>
<div class="layui-input-block">
<input type="text" name="userPwd" value="${updateUser.password}" placeholder="請輸入使用者密碼" autocomplete="off" class="layui-input" >
</div>
</div>
<input id="img" type="hidden" name="imgName" value="${updateUser.img}" />
<div class="layui-upload">
<button type="button" class="layui-btn" id="test1">上傳圖片</button>
<div class="layui-upload-list">
<img class="layui-upload-img" id="demo1" src="ImageServlet?imageName=${updateUser.img}">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="*">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
<script src="static/layui/layui.js"></script>
<script>
layui.use(['form','upload'], function(){
var upload = layui.upload;
var form = layui.form;
var $ = layui.$;
//執行例項
var uploadInst = upload.render({
elem: '#test1' //繫結元素
,url: 'UploadServlet' //上傳介面
,before: function(obj){
//預讀本地檔案示例
obj.preview(function(index, file, result){
$('#demo1').attr('src', result); //圖片連結(base64)
});
}
,done: function(res){
$('#img').val(res.data.imgName);
}
,error: function(){
}
});
form.on('submit(*)', function(data){
//1,資料提交到後臺,2,關閉當前頁面,3重新整理父頁面的table
$.post("UpdateServlet",data.field,function () {
// 提交後重新整理父頁面的表格,demo為父表格的id
parent.layui.table.reload('demo');
// 通過父頁面關閉當前頁面
var index = parent.layer.getFrameIndex(window.name); //先得到當前iframe層的索引
parent.layer.close(index);
});
// 通過父頁面關閉當前頁面
var index = parent.layer.getFrameIndex(window.name); //先得到當前iframe層的索引
parent.layer.close(index);
// 提交後重新整理父頁面的表格,demo為父表格的id
parent.layui.table.reload('demo');
return true ;// 返回true表示提交資料,返回false表示不提交
});
});
</script>
</form>
</body>
</html>
修改操作要提交到後臺完成
@WebServlet("/UpdateServlet")
public class UpdateServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String userId = req.getParameter("userId");
String userName = req.getParameter("userName");
String userPwd = req.getParameter("userPwd");
String imgName = req.getParameter("imgName");
for(int i = 0; i< UserData.userList.size(); i++){
String id = UserData.userList.get(i).getId() ;
if(id.equals(userId)){
UserData.userList.get(i).setName(userName);
UserData.userList.get(i).setPassword(userPwd);
UserData.userList.get(i).setImg(imgName);
break;
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}