jQueryEasyUI简介
jQuery EasyUI 是一组基于 jQuery 的 UI 插件集合,而 jQuery EasyUI 的目标就是帮助 Web 开发者更轻松的打造出功能丰富并且美观的 UI 界面。开发者不需要编写复杂的 JavaScript,也不需要对 css 样式有深入的了解,开发者需要了解的只有一些简单的 html 标签。
jQuery EasyUI 的特点
1.基于 jquery 用户界面插件的集合; 2.为一些当前用于交互的 js 应用提供必要的功能;
3.使用 EasyUI 你不需要写很多的 javascript 代码,通常只需要写 HTML 标记来定义用 户界面即可;
4.支持 HTML5;
5.开发产品时可节省时间和资源;
6.简单,但很强大;
7.支持扩展,可根据自己的需求扩展控件;
EasyUI 的准备:
1.EasyUI 的文件:我使用的是很早之前的版本jquery-easyui-1.3.6,做初学之用,有需要可以通过下面链接下载。
百度网盘链接: https://pan.baidu.com/s/1V6rqWdQYpUs3dUuPC-vqxA 提取码: xih3 或者去官网找找,官方网站:http://www.jeasyui.com
2.解压后放入easyUI文件夹,新建js文件夹存放自己的js文件
3.新建index.html后就可以开始使用
EasyUI 的使用:
1.引入easyui的文件,除了jq的文件库和自己的js文件,新引入了四个文件,两个js文件和两个css文件
<script src="easyUI/jquery.min.js"></script> <script src="easyUI/jquery.easyui.min.js"></script> <script src="easyUI/locale/easyui-lang-zh_CN.js"></script> <script src="js/index.js"></script> <link rel="stylesheet" href="easyUI/themes/default/easyui.css"> <link rel="stylesheet" href="easyUI/themes/icon.css">
2.加载 UI 组件有两种方式:
- 使用 class 方式加载;。
//使用 class 加载,格式为:easyui-组件名
<div class="easyui-dialog" id="box" title="标题" style="400px;height:200px;"> 内容部分 </div>
- 使用 JS 调用加载,不用给标签添加class,可以避免class滥用,提高代码可读性,所以多使用这种方法
<!--第二种使用方式,用jq写,用class方法不方便并会造成大量class属性值,可读性变低,建议用jq写--> <div id='box' title="我是标题" style="400px; height: 200px">内容</div>
在index.js中写jq代码 $(function(){ $('#box').dialog(); });
两种方法都能得到结果:一般使用第二种
3.Parser 解析器
Parser 解析器是专门解析渲染各种 UI 组件,一般来说,我们并不需要使用它即可自动完成 UI 组件的解析工作。当然,有时候我们也能选择手动解析。
注意:如果要指定 UI 解析,必须要设置父类容器才可以解析到,比如上个例子的id="box"的div要写成父盒子
例:我们们手动选择解析#box的easyUI组件
$.parser.auto = false; 用来开启和关闭parser解析器自动解析easyUI的功能
$.parser.onComplete=funciton(){}; 设置解析器解析完成后的回调函数
<div id="box"> <div title="我是标题" class="easyui-dialog" style="400px; height: 200px">内容</div> </div> $(function(){ // $('#box').dialog(); $.parser.parse('#box'); }); //关闭parser解析器自动解析easyUI的功能 $.parser.auto = false; //parser解析器解析完成后的回调函数 $.parser.onComplete=function(){ alert('easyUI组件加载完成'); };
EasyUI 的各个组件
说明:很多组件是具有相同功能的,本质很接近,只不过属性不同,代表的语义不同所以使用的情景不同。比如window的很多属性dialog也有,只不过它们的默认值是相反的。所以根据实际情景选择合适的组件
1.Draggable拖拽组件
Draggable拖拽组件,可以实现在页面拖拽元素
<div id="box" style="400px; height: 200px;background: pink;">内容</div> $(function(){ $('#box').draggable(); });
1.属性列表
通过给$('#box').draggable();传入json格式的属性值,实现对应的功能
使用示范:
edge : 20 指的是拖动的最大区域与元素边框距离20px;
handle:‘#pox’指按住哪个元素才可以拖得动,点击其他元素是无法拖动的
这三个属性是一起使用的。
- 当proxy属性值是clone时,在拖动时他会克隆当前元素并一直显示,拖动结束后消失
// proxy : 'clone' , // deltaX : 10 , // deltaY : 10 ,
- 当proxy属性值是自定义函数时,我们可以创建一个div元素,它只有边框,这时候当我们按住红点处拖动#box时(下图),就会出现我们创建的div随着鼠标移动,等拖动结束后该元素就会消失
<div id="box" style="400px; height: 200px;background: pink;"> <span id="pox">内容</span> </div> $(function(){ $('#box').draggable({ // revert : true , // cursor : 'string' , // handle : '#pox' , // disabled : true , // edge : 20 , // axis : 'v' , // proxy : 'clone' , // deltaX : 10 , // deltaY : 10 , proxy : function (source){ var p = $('<div style="400px;height:200px;border:1px dashed #ccc">'); p.appendTo($('body')); return p ; } }); });
传入的参数source指调用draggable的$('#box')对象,可以把它的内容传递给创建的div,使得内容也可以拖动(右图),代码如下
$('#box').draggable({ proxy : function (source){ var p = $('<div style="400px;height:200px;border:1px dashed #ccc">'); p.html($(source).html()).appendTo($('body')); return p ; }
2.Draggable事件
处于拖动不同过程时可以触发的事件
$('#box').draggable({ onBeforeDrag : function (e) { console.log('拖动前触发该事件'); } , onStartDrag : function () { console.log('拖动开始时触发该事件'); } , onDrag : function () { console.log('拖动时触发该事件'); }, onStopDrag : function () { console.log('拖动结束时触发事件'); }, });
3.Draggable方法
一般在进行某些判断后使用这些方法来对元素的拖动进行重新设定,可以在某些条件下停止或开始拖动。
$('#box').draggable({ proxy : 'clone' , onStartDrag : function () { console.log('拖动开始时触发该事件'); console.log($('#box').draggable('proxy')); //当前被拖动元素 } , }); // $('#box').draggable('disable'); // $('#box').draggable('enable'); //console.log($('#box').draggable('options')); //当前被拖动的元素设定的属性值是什么
4.重写某属性的默认属性值
如果想修改draggable的默认属性值,可以使用$.fn.draggable.defaults 重写默认值对象。
但注意这一句要写在拖动事件的前面才有效
$.fn.draggable.defaults.cursor = 'text' ; $('#box').draggable({ // revert : true , // cursor : 'string' , // handle : '#pox' , // disabled : true , // edge : 20 , // axis : 'v' , });
2.Droppable放置组件
Droppable放置组件,就是实现把一个元素拖入另一个元素内的功能,伴随实现的各种效果
1.属性列表
2.Droppable事件
处于放置不同过程时可以触发的事件
3.Droppable方法
案例代码:
accept : '#box', 可以接受#box这个元素放置到#wrap里面
方法和事件用法与draggable基本一致
$(function(){ $.fn.droppable.defaults.disabled = true; $('#wrap').droppable({ accept : '#box', disabled: false , //onDragEnter 进入时触发一次 onDragEnter : function (e,source) { console.log('enter'); $(this).css('background','blue'); }, //onDragOver在拖动时不停触发 onDragOver : function (e,source) { console.log('over'); $(this).css('background','orange'); }, //onDragLeave在#box离开#wrap时触发 onDragLeave : function (e,source) { $(this).css('background','black'); }, //onDrop在#box投入#wrap时鼠标松开触发 onDrop : function (e,source) { $(this).css('background','red'); }, }); console.log($("#wrap").droppable('options')); // $("#wrap").droppable('disable'); // $("#wrap").droppable('enable'); $('#box').draggable(); });
3.Resizable调整大小组件
Resizable调整大小组件,可以调整元素的大小
1.属性列表
// 禁止拖动
// disabled : true ,
// 选择拖动方向,默认是all,所有方向都能拖动
// handles : 'e,s,se',
// 设定拖动的最大最小边界,注意不加单位
// minWidth : 200,
// minHeight : 200,
// maxWidth : 600 ,
// maxHeight : 400 ,
可以增加放大缩小元素时鼠标的生效范围
edge : 20 ,
2.Resizable事件
处于缩放不同过程时可以触发的事件
onStartResize :'开始调整大小时触发';
onResize :调整过程中触发
onStopResize : 调整结束时触发
3.Resizable方法
案例代码:
$(function(){ $.fn.resizable.defaults.disabled = true; $('#box').resizable({ // 禁止拖动 // disabled : true , // 选择拖动方向,默认是all,所有方向都能拖动 // handles : 'e,s,se', // 设定拖动的最大最小边界,注意不加单位 // minWidth : 200, // minHeight : 200, // maxWidth : 600 , // maxHeight : 400 , edge : 20 , onStartResize : function(e){ console.log('开始调整大小时触发'); }, onResize : function(e){ console.log('调整过程中触发'); return false ; //拖拽过程不会变化,等拖拽结束才会变化大小 }, onStopResize : function(e){ console.log('调整结束时触发'); }, }); console.log($('#box').resizable('options')); // $('#box').resizable('disable'); // $('#box').resizable('enable'); })
4.Tooltip显示提示框
Tooltip用于显示提示框,在鼠标移到某元素上时显示提示框
1.属性列表
2.Tooltip事件
注意:onUpdate事件要与update方法结合使用,onDestroy事件要与destroy方法结合使用
3.Tooltip方法
案例代码:
<a href="" id='box'>Hi,World</a> $(function(){ $.fn.tooltip.defaults.position = 'top'; $('#box').tooltip({ content : '<strong>内容提示框</strong>', // position : 'top', // 提示讯息跟随鼠标显示 // trackMouse : true, // 设定提示框距离标签的位置 // deltaX : 100 , // deltaY : 100 , //未生效 // showEvent : 'click' , // hideEvent : 'dblclick', // showDelay : 500, // hideDelay : 500, onShow : function (){ console.log('显示时触发'); console.log($('#box').tooltip('tip')); console.log($('#box').tooltip('arrow')); }, // onHide : function (){ // console.log('隐藏时触发'); // }, // onUpdate : function (content){ //与update方法结合使用 // console.log('更新内容了'+content); // }, // onPosition : function (left,top){ //在提示框位置改变的时候触发,可以与trackMouse : true,连用 // console.log('left变为'+left+'top变为'+top); // }, // onDestroy : function (left,top){ //与提示框销毁的方法配合使用 // console.log('提示栏被销毁了'); // }, }); $('#box').click(function(){ // $(this).tooltip('update','啦啦啦'); // $(this).tooltip('destroy'); }); // console.log($('#box').tooltip('options')); // $('#box').tooltip('show'); // $('#box').tooltip('hide'); });
5.LinkButton按钮组件
LinkButton用于将元素变为按钮形式
1.属性列表
toggle与group可结合使用,可以实现复选和单选效果
2.LinkButton方法
案例代码:
<a href="#" id='box'>按钮</a> <a href="#" id='pox'>按钮</a> $(function(){ $('#box').linkbutton({ //改变元素的id属性 // id : 'pox' , // disabled : true , // 模拟复选效果,toggle与group可结合使用 // toggle : true , // selected : true , // group : 'sex' , // plain : true , text : '文字', //用来增加图标和确定图标的位置 iconCls : 'icon-add', iconAlign : 'right', }); $('#pox').linkbutton({ // toggle : true , // group : 'sex' , iconCls : 'icon-min-add', }); console.log($('#box').linkbutton('options')); $('#box').linkbutton('disable'); $('#box').linkbutton('enable'); $('#box').linkbutton('select'); $('#box').linkbutton('unselect'); });
6.ProgressBar( 进度条)
ProgressBar将元素变为进度条形式
1.属性列表
这里的text指进度条显示,默认是百分比显示value值,一般不去改它
2.ProgressBar事件
注意:onChange和setValue可以结合使用
3.ProgressBar方法
resize是重新设置进度条的长度
案例代码:
<body> <!-- <div id="box" class='easyui-progressbar' data-options='value:60' style=" 500px; height:50px; margin:100px;"></div> --> <div id="box"></div> </body> $(function(){ $.fn.progressbar.defaults.value=30; $('#box').progressbar({ width : 400 , height : 30 , // value : 5, //这里的text指进度条显示,默认是百分比显示value值,一般不去改它 text : '{value}%', // onChange和setValue结合使用 onChange : function(newValue,oldValue){ console.log('新值='+newValue+',旧值='+oldValue); //新值=70,旧值=100 }, }); setInterval(function(){ // 设置新的进度值 // $('#box').progressbar('setValue',70); $('#box').progressbar('setValue',$('#box').progressbar('getValue')+5); },200); console.log($('#box').progressbar('options')); $('#box').progressbar('resize',600); })
7.Panel面板组件
Panel组件是将当前元素变成面板内容,在当前元素(红圈)上面生成一个标签用来放置面板标题,同时在这两个元素外面生成新的标签用来表示整个面板。
1.属性列表
//title是给面板加一个标题,id是更改面板标签的id值
title : '面板',
// id : 'pox',
width : 500 ,
height : 150 ,
//给面板标题部分加图标
iconCls : 'icon-search',
//left和top要结合定位使用
left : 200 ,
top : 100 ,
//给面板标签增加class属性值
cls : 'abc',
//给面板标题增加class属性值
headerCls : 'b',
//给面板内容增加class属性值
bodyCls : 'c',
2.Panel事件
3.Panel方法
案例代码:
<div id="box"> <p>内容区域</p> </div> <div id="tt"> <a href="#" class="icon-add" onclick="javascript:alert('add')"></a> </div> $(function(){ $('#box').panel({ //title是给面板加一个标题,id是更改面板标签的id值 title : '面板', // id : 'pox', width : 500 , height : 150 , //给面板标题部分加图标 iconCls : 'icon-search', //left和top要结合定位使用 left : 200 , top : 100 , //给面板标签增加class属性值 cls : 'abc', //给面板标题增加class属性值 headerCls : 'b', //给面板内容增加class属性值 bodyCls : 'c', //style 设定后可能因为优先级不够无法生效 style : { 'background' : 'red' , }, // fit : true , // border : false , // doSize : true , // noheader : true , // content : '内容修改了' , collapsible : true , minimizable : true , maximizable : true , // tools : '#tt', //自定义面板工具栏 tools : [ { iconCls : 'icon-help' , handler :function (){ alert('help'); } }, ], // collapsed : true, // closed : true, loadingMessage : '加载中', }); $('#box').panel('panel').css('position','absolute'); // $('#box').panel('destroy'); 销毁panel console.log($('#box').panel('options')); console.log($('#box').panel('panel')); console.log($('#box').panel('header')); console.log($('#box').panel('body')); $('#box').panel('setTitle','新标题'); });
8.Tabs选项卡组件
Tabs是将元素变为选项卡的组件
1.属性列表
2.Tabs事件
注意:
3.Tabs方法
案例代码:
<div id="box" style="500px;height:300px;"> <div title="tab1" id="tab1">tab1</div> <div title="tab2" data-options="closable:true">tab2</div> <div title="tab3">tab3</div> </div> $(function(){ $('#box').tabs({ width : 300, height : 100, // plain : true, // fit : true, // border : false, // tabWidth : 300 , // tabHeight : 50, //规定tab选项每次滚动多长 scrollIncrement : 300 , scrollDuration : 300, tools : [{ //添加工具栏,包括图标和点击事件 iconCls : 'icon-add', handler : function(){ alert('add'); } },{}], // toolPosition : 'left' , // tabPosition : 'right' , // handlerWidth : 300, //选择默认被选中哪一项 selected : 1 , // showHeader : false , 不显示tab栏了 //被选中触发该事件 // onSelect : function(title,index){ // console.log(title+'|'+index); // }, //关闭之前触发该事件 // onBeforeClose : function(title,index){ // console.log(title+'|'+index); // }, // onClose :function (title,index) { // alert(title+'|'+index); // } onContextMenu :function (e,title,index) { alert(e.type+'|'+title+'|'+index); } }); // console.log($('#box').tabs('tabs')); // $(document).click(function(){ // $('#box').css('display','block').tabs('resize'); // }) //增添新选项卡 // $('#box').tabs('add',{ // id : 'abc' , // title : '新选项卡', // content : '新面板' , // href : 'content.html', // cache : false , // iconCls : 'icon-add', // collapsible : true, // //是否选择型新添加的选项卡作为当前页 // selected :false , // }) // console.log($('#box').tabs('getTab',1)); // console.log($('#box').tabs('getTabIndex','#tab1')); // $('#box').tabs('select',1); // $('#box').tabs('unselect',1); // console.log($('#box').tabs('exists',1)); // $('#box').tabs('update',{ // tab : $('#tab1'), // options : { // title : '修改标题', // } // }); // $('#box').tabs('disableTab',1); // $('#box').tabs('enableTab',1); // $('#box').tabs('scrollBy',100); });
9.Accordion选项卡组件
这个组件依赖于panel组件
1.属性列表
分类组件面板继承了 panel 属性,我们参考 panel 属性即可,对分类的面板同样有效。
并且提供了新增的两个属性
2.Accordion事件
3.Accordion方法
案例代码:
<div id="box" style=" 300px;"> <div title="accordion1">accordion1</div> <div title="accordion2">accordion2</div> <div title="accordion3">accordion3</div> </div> $(function () { $('#box').accordion({ width : 500, height : 300, // fit :true, // border : false, // animate : false, // multiple :true , //选择序号为1的作为默认打开项 // selected : 1, // onSelect : function(title,index){ // alert(title + '|' + index); // }, // onUnselect : function(title,index){ // alert(title + '|' + index); // }, }); // console.log($('#box').accordion('panels')); // $(document).click(function(){ // $('#box').accordion().show(); // $('#box').accordion('resize'); // }) // console.log($('#box').accordion('getSelected')); //accordion也支持panel的属性 $('#box').accordion('add',{ title : '新面板', content : '新面板', closable : true , selected : false, // collapsible : false, }) });
10.Layout布局组件
这个组件
1.属性列表
就一个属性:组件可以自适应页面大小的
2.方法
resize方法一般是在布局有隐藏-显示,或其他调整的时候用来重新调整组件的尺寸
案例代码:
<div id="box" style=" 600px;height: 400px;"> <div data-options=" region : 'north', title : '上北' , border : true , split : true , iconCls : 'icon-save' , href : 'content.html', collapsible : false , " style ="height:100px;"></div> <div data-options="region:'south',title:'下南'," style="height: 100px;"></div> <div data-options="region:'west',title:'左西'," style=" 100px;"></div> <div data-options="region:'east',title:'右东'," style=" 100px;"></div> <!-- <div data-options="region:'center',title:'中间'," ></div>--> </div> $(function () { $('#box').layout({ //使用自适应布局 // fit : true, }); // $(document).click(function(){ // $('#box').layout().css('display','none'); // $('#box').layout('resize'); // }); //折叠和展示 // $('#box').layout('collapse','north'); // $('#box').layout('expand','north'); // $('#box').layout('add',{ // title : '中间', // region : 'center', // }); // $('#box').layout('remove','east'); });
11.window窗口组件(☆)
这个组件是扩展自panel组件,和panel组件差不多,只不过可以拖动,调整大小,实现内部布局
1.属性列表
panel的属性都可以使用,还有一些自带的新属性
2.方法
案例代码:
<div id="box"> 窗口 </div> $(function () { $('#box').window({ width : 600, height :400, title : '窗口', // collapsible : false, // minimizable : false, // maximizable : false, // closable : false, // closed : true , zIndex : 9999, draggable : false, resizable : false , shadow : false , modal : true , //如果设置为 true,窗口将显示在它的父容器中, // 否则将显示在所有元素的上面。默认值为 false。 // inline : true , iconCls : 'icon-add', // fit : true, // onClose : function(){ // console.log('关闭了'); // }, }); // console.log($('#box').window('window')); $(document).click(function(){ $('#box').window('move',{ left : 0, top : 0, }) }); $(document).dblclick(function(){ $('#box').window('center'); }); });
window 组件最强大的地方就是可以内部布局和添加 linkbutton。
具体布局方法如下:
1.外部用 window 组件包裹一下;
2.内部用 layout 组件左右各分配一个,底部分配一个;
3.底部添加一个按钮即可。
<div class="easyui-window" style="400px;height:250px;"> <div class="easyui-layout" data-options="fit:true,"> <div data-options="region:'west',split:true,">左边</div> <div data-options="region:'center'">内容</div> <div data-options="region:'south',border:false," style="height: 50px;"> <a href="#" class="easyui-linkbutton" style="80px;" data-options="iconCls:'icon-ok'">确认</a> <a href="#" class="easyui-linkbutton" style="80px;" data-options="iconCls:'icon-cancel'">取消</a> </div> </div> </div>
12.Dialog对话框组件(☆)
这个组件是依赖于window组件,相当于添加了linkbutton功能的window组件
1.属性列表
对话框会多一些按钮组功能出来
注意toolbar的两种写法
写法一: <div id='tt'> <a href="#" class='easyui-linkbutton' data-options='iconCls : "icon-edit"'>编辑</a> <a href="#" class='easyui-linkbutton' data-options='iconCls : "icon-help"'>帮助</a> </div> $(function(){ $('#box').dialog({ toolbar : '#tt', }); }) 第二种:直接在js中写 $(function(){ $('#box').dialog({ // toolbar : '#tt', toolbar : [{
//需要新增几个工具栏就写几个 text : '编辑', iconCls : 'icon-edit', handler : function(){ alert('edit'); } },{}] }); })

<!-- <div id="box" class='easyui-dialog' style=" 500px; height:100px; margin:100px;"></div> --> <div id="box">对话框</div> <div id='tt'> <a href="#" class='easyui-linkbutton' data-options='iconCls : "icon-edit"'>编辑</a> <a href="#" class='easyui-linkbutton' data-options='iconCls : "icon-help"'>帮助</a> </div> $(function(){ $('#box').dialog({ width : 400, height : 250, title : '对话框', modal : true, // collapsible : true, // toolbar : '#tt', toolbar : [{ text : '编辑', iconCls : 'icon-edit', handler : function(){ alert('edit'); } },{ text : '编辑2', iconCls : 'icon-edit', handler : function(){ alert('edit'); } }], buttons : [{ text : '确定', //扁平化 plain : true , iconCls : 'icon-ok', },{ text : '取消', iconCls : 'icon-cancel', }] }); })
13.Messager消息组件(☆☆☆)
这个组件是依赖于window组件和进度条组件,消息窗口提供了不同的消息框风格,包含 alert(警告框)、confirm(确认框)、prompt(提示框)、progress(进度框)等。所有消息框都是异步的,用户可以在交互消息之后使用回调函数去处理结果。
由于这个组件的特殊性,没有 class 加载方式,全部在 JS 端完成。
1.属性列表
属性更改确认和取消两个按钮的内容按钮,
$.messager.defaults={ ok : '是', cancel : '否', };
2.方法
$(function(){ $.messager.defaults={ ok : '是', cancel : '否', }; /*警告框 $.messager.alert('警告框','这是一个提示','info',function () { alert('警告框'); }); */ // 确认框,回调函数的第一个参数是布尔值,如果点确定那就是true,取消就是false $.messager.confirm('确认框','你真的要卸载吗',function(flag){ if(flag){ alert('卸载成功'); } else { alert('取消卸载'); } }); // 提示框,回调函数第一个参数是你输入的讯息 // $.messager.prompt('提示框','请输入你的名字',function(content){ // if(content){ // alert(content); // } // }); /* 显示一个进度条样子的提示框,表示正在进行中 $.messager.progress({ title : '执行中', msg : '努力上传中', text : '{value}%', //进度条每次跳动的时间 interval : 100, }); // 获取进度条对象 console.log($.messager.progress('bar')); // 关闭进度条 // console.log($.messager.progress('close')); */ $.messager.show({ title : '我的消息', msg : '消息5秒钟后关闭', timeout : 5000, showType : 'slide', }); });
14.Menu菜单组件
该组件用来自定义页面右键的功能菜单,需要先注册页面的右击contextmenu事件,取消默认点击事件,然后用Menu组件自定义。
1.属性列表
菜单项属性指某一项的属性
菜单属性指整个菜单的样式,可以直接写在#box菜单标签的data-options属性中
<div id= 'box' class="easyui-menu" data-options="left:10,top:10,minWidth:120,hideOnUnhover:false,"> <div id="new">新建</div> <div>打开 <div> <div>Word</div> <div>Excel</div> <div>PowerPoint</div> </div> </div> <div data-options="iconCls : 'icon-save',disabled :true ,">保存</div> <div>退出</div> </div>
2.事件
规定整个菜单在显示,隐藏和被点击时的事件
3.方法
通过这些方法提供了api,能设置菜单项的属性,也可以新增菜单项和移除菜单项
<div id= 'box' class="easyui-menu" data-options="left:10,top:10,minWidth:120,hideOnUnhover:false,"> <div id="new">新建</div> <div>打开 <div> <div>Word</div> <div>Excel</div> <div>PowerPoint</div> </div> </div> <div data-options="iconCls : 'icon-save',disabled :true ,">保存</div> <div>退出</div> </div> $(function () { //首先注册一个鼠标右击事件 $(document).on('contextmenu',function(e){ e.preventDefault(); $('#box').menu('show',{ left : e.pageX , top : e.pageY , }) }); // console.log($('#box').menu('options')); //通过id属性值获得指定的菜单项 // console.log($('#box').menu('getItem','#new')); //通过文本内容找到指定的菜单项 // console.log($('#box').menu('findItem','退出')); //通过id属性值设置菜单项的文本内容和图标 $('#box').menu('setText',{ target : '#new', text : '星星', }); $('#box').menu('setIcon',{ target : '#new', iconCls : 'icon-add', }); $('#box').menu('appendItem',{ id : 'add', text : '新增', iconCls : 'icon-add', href : '123.html', onclick : function () { console.log($('#box').menu('findItem','新增')); } }); //销毁菜单 // $('#box').menu('destroy'); // $('#box').menu('removeItem','#add'); $('#box').menu({ onShow : function(){ alert('显示时触发'); }, onHide : function(){ alert('隐藏时触发'); }, onClick : function(item){ alert(item+'退出了'); }, }); });
15.MenuButton菜单按钮组件
该组件依赖于Menu组件和linkButton组件,其实是这两个组件的结合体
注意:这是class的写法,要将写好的菜单#box添加到编辑按钮中去,也可以写成js的写法
<a href="javascript:void(0)" id="edit" class="easyui-menubutton" data-options=" iconCls : 'icon-edit', menu : '#box', ">编辑</a> <div id="box" style="150px"> <div>剪切</div> <div>复制</div> <div class="menu-sep"></div> <div>粘贴</div> <div>删除</div> </div>
1.属性列表
简易效果就是指图标没有边框,看起来比较简单
2.方法
该组件只有四个简单的方法
<a href="javascript:void(0)" id="edit">编辑</a> <div id="box" style="150px"> <div>剪切</div> <div>复制</div> <div class="menu-sep"></div> <div>粘贴</div> <div data-options="iconCls:'icon-remove',">删除</div> </div> $(function () { $('#edit').menubutton({ menu : '#box', iconCls : 'icon-edit', plain : false, duration : 500, }); $('#edit').menubutton('disable'); $('#edit').menubutton('enable'); $('#edit').menubutton('destroy'); });
16.splitButton分割组件
该组件和上面的菜单按钮组件基本一样,只不过多了一个分割符,鼠标点击右边的箭头才能出现下拉菜单,就这点区别,还是因为语义化的原因才分成两个
代码和上个组件一样
<a href="javascript:void(0)" id="edit" >编辑</a> <div id="box" style="150px"> <div>剪切</div> <div>复制</div> <div class="menu-sep"></div> <div>粘贴</div> <div data-options="iconCls:'icon-remove',">删除</div> </div> $(function () { $('#edit').splitbutton({ menu : '#box', iconCls : 'icon-edit', plain : false, duration : 500, }); $('#edit').splitbutton('disable'); $('#edit').splitbutton('enable'); $('#edit').splitbutton('destroy'); });
17.Pagination分页组件
1.属性列表
2.事件
3.方法
<!--<div id="box" class="easyui-pagination" style="border: 1px solid #ccc;" data-options="total:2000,pageSize:10,"></div>--> <div id="content" class="easyui-panel" style="height:200px;" >内容</div> <div id="box" style="border: 1px solid #ccc;" ></div> $(function () { $('#box').pagination({ total : 5, pageSize :1 , pageNumber : 1, pageList : [1,2], // loading : true, buttons : [{ iconCls : 'icon-add', },'-', { //减号是分割线 iconCls: 'icon-edit', }], // showPageList : false, // showRefresh : false, beforePageText : '页数前面的文本', afterPageText : '页数后面的文本', onBeforeRefresh : function(pageNumber,pageSize){ alert('刷新之前'); }, onRefresh : function(pageNumber,pageSize){ alert('刷新之后'); }, onChangePageSize : function(pageSize){ alert('每页显示的条数被改变!'); }, // layout : ['first','prev','links','next','last',], }); $(document).click(function () { // $('#box').pagination('refresh',{ // pageSize : 2, // pageNumber : 2 , // }); }); });
18.searchBox搜索组件
与menuButton组件可以搭配使用,左侧是menuButton,右侧是searchBox
1.属性列表
2.方法
<!-- <div class="easyui-searchbox" style=" 300px;" data-options="--> <!-- menu:'#box',prompt: '请输入关键字',search:'qq',"--> <!-- ></div>--> <div id="ss" style=" 300px;"></div> <div id="box"> <div data-options="iconCls:'icon-ok',">所有频道</div> <div name="sports">体育频道</div> <div>财经频道</div> </div> $(function () { $('#ss').searchbox({ width : 300, height : 22, menu : '#box', searcher : function (name,value) { console.log(name+'-'+value); }, prompt : '请输入关键字', value : '固定的值', // disabled : true , }); var m = $('#ss').searchbox('menu'); // console.log(m); m.menu('setIcon',{ target : m.menu('findItem','体育频道').target, iconCls : 'icon-save', }); console.log($('#ss').searchbox('textbox')); console.log($('#ss').searchbox('getName')); //选择默认name是sports的频道显示 $('#ss').searchbox('selectName','sports'); $(document).dblclick(function(){ $('#ss').searchbox('clear'); }); });
19.validateBox验证框组件
1.属性列表
2.方法
<input type="text" id="email" name="abc"> $(function () { $.extend($.fn.validatebox.defaults.rules,{ minLength : { validetor : function(value,param){ return value.length >=param ; }, message : '请输入不小于{0}的字符', } }); $('#email').validatebox({ required : true, validType : 'email', // validType : 'url', validType : 'minLength[5]', // validType : 'remote["content.php","abc"]', // validType : ['email','length[5,10]'], //提示信息相关设定 // delay : 300, 提示信息的延迟 missingMessage : '请输入内容', invalidMessage : '你输入的电子邮件格式不合法', // tipPosition : 'right', // deltaX : 100, }); console.log($('#email').validatebox('options')); // $('#email').validatebox('destroy'); // $(document).click(function () { // console.log($('#email').validatebox('validate')); // }); // $(document).click(function () { // // 返回验证结果是true还是false // // console.log($('#email').validatebox('isValid')); // // }); });
20.Combo自定义下拉框组件
1.属性列表
2.事件
3.方法
<input id="box" > <div id="food"> <div style="background: #eee;padding:5px;">请选择一个食物</div> <div style="padding:5px;"> <input type="radio" name="food" id="01" value="01"><label for="01">煎饼果子</label> <input type="radio" name="food" id="02" value="02"><label for="02">果子煎饼</label> <input type="radio" name="food" id="03" value="03"><label for="03">煎果饼子</label> <input type="radio" name="food" id="04" value="04"><label for="04">煎子饼果</label> </div> </div> $(function () { $('#box').combo({ required : true, // editable : false, //value : '123', //会提交出去 //下拉菜单延时多久出现 // delay : 1000, // onShowPanel :function () { // console.log('显示出来了') // }, // onHidePanel :function () { // console.log('隐藏了') // }, onChange :function (newValue,oldValue) { console.log(newValue+'-'+oldValue); }, }); $('#food').appendTo($('#box').combo('panel')); $('#food input').click(function () { var v = $(this).val(); var s = $(this).next('label').text(); $('#box').combo('setValue',v).combo('setText',s).combo('hidePanel'); // console.log($('#box').combo('isValid')); console.log($('#box').combo('getText')); }); });
21.NumberBox数值输入框组件
1.属性列表
2.事件
3.方法
<input type="text" id="box" > $(function () { $('#box').numberbox({ // value : 555, min : 5, // max :500, //小数点后保留几位,超过会进位 precision : 2, // groupSeparator : ',', // filter : function () { // return true; // }, // formatter : function(value){ // return '111,'+ value; // }, // parser : function(s){ // return '111,'+s ; // }, }); $(document).click (function(){ // $('#box').numberbox('fix'); console.log($('#box').numberbox('getValue')); $('#box').numberbox('setValue',300); }); });
22.calendar日历组件(☆☆☆)
此组件可以方便的做一个日历,可以更改菜单栏和文字,也可以设定点击事件
1.属性列表
2.事件
3.方法
<div id="box"></div> $(function () { $('#box').calendar({ width : 300, height : 300, //设置日历控件自适应父盒子大小 // fit : true, // border : false, //规定第一天是星期几 firstDay : 1, //规定周列表,可以自定义是周一还是monday // weeks : ['S','M','T','W','T','F','S'], //months同理 // months : ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', // 'Sep', 'Oct', 'Nov', 'Dec'], // year : 2019, // month : 6 , //这句可以选择当前显示的日期 // current : new Date(2019,11,1), //格式化当前日期,对显示的日期进行操作 // formatter : function(date){ // return '#'+date.getDate(); // }, // 设置指定日期的样式,可以按照日期或星期设定 styler : function(date){ // if(date.getDate()===1){ // return 'background-color:hotpink' // }; if(date.getDay()===1){ return 'background-color:hotpink' } }, // validator : function(date){ // //只有星期一才能点击 // if(date.getDay()===1){ // return true; // } else { // return false; // } // }, //选择日历某一天时触发 onSelect : function(date){ console.log(date); }, // 在用户改变选择的时候触发 onChange : function(newDate,oldDate){ console.log(newDate+'-'+oldDate); }, }); });
23.Datebox日期输入框组件(☆☆☆)
引入一个下拉框,点开后是一个日历组件,通过选择日期可以让下拉框的内容变为选择的日期
可以先写一个calendar组件#cc,将这个组件添加到两个日期输入框中,它们就不会使用默认的日历,而会使用#cc这个日历,可以修改#cc这个日历组件
<input type="text" id="box"> <input type="text" class="easyui-datebox" data-options="sharedCalendar: '#cc'"> <input type="text" class="easyui-datebox" data-options="sharedCalendar: '#cc'"> <div id="cc"></div>
1.属性列表
2.事件
3.方法
也可以通过calendar方法得到内置的日历组件,直接修改,代码如下
<input type="text" id="box"> <!--<input type="text" class="easyui-datebox" data-options="sharedCalendar: '#cc'">--> <!--<input type="text" class="easyui-datebox" data-options="sharedCalendar: '#cc'">--> <!--<div id="cc"></div>--> $(function () { //这段是新增按钮,比较麻烦,直接赋值的代码 var buttons = $.extend([], $.fn.datebox.defaults.buttons); buttons.splice(1, 0, { text: 'MyBtn', handler: function(target){ alert('click MyBtn'); } }); $('#box').datebox({ panelWidth : 300, panelHeight : 300, // currentText : 'T', // closeText : 'C', // okText : 'O', //格式化就是设定选中日期后下拉框中显示什么,默认是选中的时间,下面改成了当前时间 // formatter : function(date){ // return date.getFullYear()+'/'+(date.getMonth()+1)+'/'+date.getDate(); // }, //感觉和上面的formatter效果一样,但写法有不同 // parser : function (date) { // return new Date(2016,11,31); // }, onSelect : function () { console.log('选择日期了'); } }); //修改内置的日历组件 $('#box').datebox('calendar').calendar({ firstDay : 1, }); $('#cc').calendar({ firstDay : 1, }); });
23.spinner基础微调组件
Spinner(微调)组件是其他两款高级微调组件的基础组件,有的功能无法微调,实际是使用下两节的高级微调组件
不支持class方式,要通过js写
1.属性列表
这个组件属于微调的低级组件,有的功能是没效果的,如min和max
2.事件
3.方法
<input type="text" id="box"> $(function () { // 这个组件属于微调的低级组件,有的功能是没效果的,如min和max和按钮的增加减少功能 $('#box').spinner({ required : true, // width :300, // height : 50, value : 5, // min : 3, // max : 10, // increment : 2, // editable : false, // spin : function(down){ //上面按钮是false,下面按钮是true // console.log(down); // } onSpinUp : function () { $('#box').spinner('setValue',parseInt($('#box').spinner('getValue'))+1); }, onSpinDown : function () { $('#box').spinner('setValue',parseInt($('#box').spinner('getValue'))-1); }, }); });
24.NumberSpinner数字微调组件
这个组件完全依赖于上面的Spinner(微调)组件,支持class方式,他的属性和方法和上面完全一样,只不过Spinner组件无法生效的功能在这个组件可以正常使用
<input type="text" id="box"> $(function () { $('#box').numberspinner({ required : true, // width :300, // height : 50, value : 5, min : 3, max : 10, increment : 2, onSpinUp : function () { console.log('上升'); }, onSpinDown : function () { console.log('下降'); }, }); });
25.TimeSpinner时间微调组件
这个组件完全依赖于上面的Spinner(微调)组件,支持class方式,他的属性和方法和上面完全一样,只不过Spinner组件无法生效的功能在这个组件可以正常使用
1.属性列表
除了基础微调组件的属性,这里新增了几个
2.方法
<input type="text" id="box"> $(function () { $('#box').timespinner({ editable : false, value : '00:00:00', // min : '00:00', // max : '23:59', // separator : '/', showSeconds : true, //初始选中的字段 0表示小时,1表示分钟 highlight : 2, }); $('#box').timespinner('setValue','21:00:00'); });
27.DateTimeBox日期时间输入框
这个组件依赖于 DateBox(日期输入框)组件和 TimeSpinner(时间微调)组件
有年月日,时分秒
1.属性列表
除了基础微调组件的属性,这里新增了几个
2.方法
<input type="text" id="box" > $(function () { $('#box').datetimebox({ value : '2015-6-1 11:11:11', // showSeconds : false, }); $('#box').datetimebox('setValue','2015-6-1 12:11:11') console.log($('#box').datetimebox('spinner').spinner('getValue')); });
28.Slider滑动条组件
1.属性列表
2.事件
3.方法
<div style="margin:100px;"> <input type="text" id="box"> </div> <span id="text">文字</span> $(function () { $('#box').slider({ width : 300, height : 100, //滑动块是横向还是纵向 mode : 'h', rule : [0,'|',25,'|',50,'|',75,'|',100], showTip : true, // reversed : true, // value : 50, //这里指可以滑动的最大最小值,不是滑动条的最大最小值 // min : 20, // max : 90, // step : 10, tipFormatter : function (value) { //这个函数用来修改滑动条的提示信息的 return value+'%'; }, // onSlideStart :function (value) { // console.log(value); // }, // onSlideEnd :function (value) { // console.log(value); // }, onChange :function(newValue,oldValue){ $('#text').css('fontSize',newValue); }, }); $('#box').slider('resize',{ width : 500, height : 30, }); });
29.Form表单组件
1.属性列表
2.事件
<form id="box" method="post"> <div> <label for="name">Name:</label> <input class="easyui-validatebox" type="text" name="name" data-options="required:true" /> </div> <div> <label for="email">Email:</label> <input class="easyui-validatebox" type="text" name="email" data-options="validType:'email'" /> </div> <input type="submit"> </form> $(function () { //组件中向后台提交数据都是通过ajax的方式进行的,所以不会直接echo在页面上 $('#box').form({ url : 'content.php', //提交之前执行 onSubmit : function(param){ param.code = 11111; return $(this).form('validate'); }, // //提交成功后执行,这个data参数是指php文件 // success : function(data){ // //data是字符串,通过eval将他转化为json格式的对象 // var data = eval('('+data+')'); // if(data.email){ // console.log(data.email); // } // }, }); // $('#box').form('load',{ // name : '小新', // email : 'xiaoxin@163.com', // }); // $('#box').form({ // onBeforeLoad : function(){ // console.log('load之前'); // }, // onBeSuccess : function(data){ // console.log('load成功'+data.email); // }, // onBeforeError : function(){ // console.log('load错误'); // }, // }); // //load可以读取文件到表单中 // $('#box').form('load','load.php'); $('#box').form('load','load.php'); }); <?php // echo 123; // echo $_POST['name']; // echo '|' ; // echo $_POST['email']; // echo $_POST['code']; ?> { 'name' : 'xiaoming', 'email' : 'xiaoming@gmail.com' }
30.DataGrid数据表格组件(1)
第一部分主要是实现分页功能
1.属性列表
其中user.php文件代码:主要是从Navicat的数据库中获取数据,并将数据显示在组件中
组件会通过POST方式向后台发送一些数据,包括当前页码,每页数据的条数,排序列,排序的方式等,在PHP中就能接受这些数据并操作
<table id="box"></table> index.js文件代码: $(function () { $('#box').datagrid({ // url : 'content.json', //通过ajax来请求php文件,上面是直接从json文件中得到数据,两种当时二选一 url : 'user.php', width : 400, title : '用户列表', iconCls : 'icon-search', //设置列的一些属性 columns : [[ { field : 'user', title : '账号', }, { field : 'email', title : '邮件', }, { field : 'date', title : '注册时间', } ]], pagination : true , //设置每页显示多少条 pageSize : 5, pageList : [5,10,15], pageNumber : 1, pagePosition : 'bottom', }); }); user.php文件代码: <?php sleep(1); $connection = mysqli_connect('127.0.0.1','root','123456','datagrid demo'); if (!$connection) { //链接数据库失败 exit('<h1>链接数据库失败</h1>'); } /*page是列表组件的当前页码,通过根据每次请求时的页码,来计算第一个数据从数据库的哪行开始获取, 比如当前是第二页,每页五个数据,那么5*(2-1), $first=5,从第五个数据开始抓,抓取5个数据
row是指组件的当前设置是每页多少个数据,也就是上面的pageSize属性 limit 第一个参数是第几位开始查询,默认从第0位开始,第二个参数是查询多少个数据 */ $page = $_POST['page']; $pageSize = $_POST['rows']; $first = $pageSize * ($page - 1); //php中多用双引号,双引号会解释变量的值,而单引号会把它当做字符串输出 $query = mysqli_query($connection,"SELECT * FROM test limit $first,$pageSize"); $json = ''; while ($row = mysqli_fetch_assoc($query)) { //.=是连续定义的意思,并且给每句后面加上逗号 $json .= json_encode($row).','; } //动态获取数据总条数,不写死 $total = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM test")); //要将多行对象拼接成json格式,去除末尾的逗号,从最后一位开始清除,清除一位 $json = '{"total": '.$total.',"rows":['.substr($json,0,-1).']}'; echo $json; mysqli_close($connection);
30.DataGrid数据表格组件(2)
第二部分主要是实现排序功能
1.属性列表
这部分的重点
js中主要是sortName ,sortOrder,sortable :true属性的设定,分为页面刚打开时的默认排序和点击排序两部分
php文件中是排序请求的接收
<table id="box"></table> index.js: $(function () { $('#box').datagrid({ // url : 'content.json', //通过ajax来请求php文件,上面是直接从json文件中得到数据,两种当时二选一 url : 'user.php', // method : 'get', width : 400, title : '用户列表', iconCls : 'icon-search', //设置列的一些属性 columns : [[ { field : 'user', title : '账号', //设置这一列是否可以点击排序 sortable : true , }, { field : 'email', title : '邮件', sortable : true , //自定义排序-本质是冒泡排序,是客户端自己通过冒泡排序方式进行排序,使用该功能时要设置remoteSort : false, sorter : function(a,b){ console.log(a,b) }, }, { field : 'date', title : '注册时间', sortable : true , } ]], pagination : true , //设置每页显示多少条 pageSize : 10, pageList : [10,20,30], pageNumber : 1, pagePosition : 'bottom', //设置哪些列可以排序(因为刚打开网页时,默认是按照下面排序的,之后就可以根据上面设置的sortable进行点击排序) sortName : 'date', sortOrder : 'DESC', //是否使用服务器进行排序,为true时,每次点击排序都会通过user.php向服务器发送请求,请求sortName是当前点击的列, // 为false时就不会发送请求,直接在客户端自己排序 // 服务器会返回排序后的列 // remoteSort : false, // multiSort : true, 多项排序提交请求的格式会改,也排不出什么,就不使用了 // 设置请求远程数据发送的额外数据 queryParams : { id : 1, } }); }); user.php: <?php sleep(1); $connection = mysqli_connect('127.0.0.1','root','123456','datagrid demo'); if (!$connection) { //链接数据库失败 exit('<h1>链接数据库失败</h1>'); } /*page是列表组件的当前页码,通过根据每次请求时的页码,来计算第一个数据从数据库的哪行开始获取, 比如当前是第二页,每页五个数据,那么5*(2-1), $first=5,从第五个数据开始抓,抓取5个数据 limit 第一个参数是第几位开始查询,默认从第0位开始,第二个参数是查询多少个数据 */ $page = $_POST['page']; $pageSize = $_POST['rows']; $first = $pageSize * ($page - 1); //下面两个是和排序有关的 $order = $_POST['order']; $sort = $_POST['sort']; //php中多用双引号,双引号会解释变量的值,而单引号会把它当做字符串输出 //ORDER是依照组件提交的$order,$sort这两个参数,在数据库中排序后返回到php文件,再返回给组件 $query = mysqli_query($connection,"SELECT * FROM test ORDER BY $sort $order LIMIT $first,$pageSize"); $json = ''; while ($row = mysqli_fetch_assoc($query)) { //.=是连续定义的意思,并且给每句后面加上逗号 $json .= json_encode($row).','; } //动态获取数据总条数,不写死 $total = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM test")); //要将多行对象拼接成json格式,去除末尾的逗号 $json = '{"total": '.$total.',"rows":['.substr($json,0,-1).']}'; echo $json; mysqli_close($connection);
30.DataGrid数据表格组件(3)
第三部分主要是组件一些样式的设定
1.属性列表
fitColumns : true,
width : 400,
columns : [[
{
field : 'user',
title : '账号',
//设置这一列是否可以点击排序
sortable : true ,
halign : 'center',
width : 100,
},{},{}]
这三个设定自适应布局,也就是给组件一个width,给每列一个width,这时候会和flex布局一样按每列width的比例分配总组件的width。
index.js: $(function () { $('#box').datagrid({ // url : 'content.json', //通过ajax来请求php文件,上面是直接从json文件中得到数据,两种当时二选一 url : 'user.php', // method : 'get', width : 400, title : '用户列表', iconCls : 'icon-search', //斑马线效果,各行交替变换颜色 striped : true , // fitColumns : true, //当文字显示不全是,是换行显示还是隐藏 // nowrap : false, //当未从外部引入数据时,默认是显示data这里的数据 // data : [ // { // user : '手工用户', // email : '手工邮件', // date : '2020-1-3', // } // ], //load时的提示讯息 loadMsg : '努力展开中', rownumbers : true, singleSelect : true, // showHeader : false, showFooter : true, //设置列的一些属性 columns : [[ { field : 'user', title : '账号', //设置这一列是否可以点击排序 sortable : true , //设置标题和文字的对齐方式 // align : 'center', halign : 'center', // hidden : true, // width : 100, //下面两个是对单元格操作 formatter : function(value,row,index){ //value是第一列的属性值 return "["+value+"]" ; }, styler : function (value,row,index) { if(value == '蜡笔小新'){ return 'background-color: red'; } }, }, { field : 'email', title : '邮件', sortable : true , //自定义排序-本质是冒泡排序,是客户端自己通过冒泡排序方式进行排序,使用该功能时要设置remoteSort : false, sorter : function(a,b){ console.log(a,b) }, }, { field : 'date', title : '注册时间', sortable : true , } ]], //这里可以return 样式,也可以return class类名 rowStyler : function(index,row){ if(row.user ==="哆啦B梦"){ return 'background-color:red'; } }, pagination : true , //设置每页显示多少条 pageSize : 10, pageList : [10,20,30], pageNumber : 1, pagePosition : 'bottom', //设置哪些列可以排序(因为刚打开网页时,默认是按照下面排序的,之后就可以根据上面设置的sortable进行点击排序) sortName : 'date', sortOrder : 'DESC', //是否使用服务器进行排序,为true时,每次点击排序都会通过user.php向服务器发送请求,请求sortName是当前点击的列, // 为false时就不会发送请求,直接在客户端自己排序 // 服务器会返回排序后的列 // remoteSort : false, // multiSort : true, 多项排序提交请求的格式会改,也排不出什么,就不使用了 // 设置请求远程数据发送的额外数据 queryParams : { id : 1, } }); }); user.php: <?php sleep(1); $connection = mysqli_connect('127.0.0.1','root','123456','datagrid demo'); if (!$connection) { //链接数据库失败 exit('<h1>链接数据库失败</h1>'); } /*page是列表组件的当前页码,通过根据每次请求时的页码,来计算第一个数据从数据库的哪行开始获取, 比如当前是第二页,每页五个数据,那么5*(2-1), $first=5,从第五个数据开始抓,抓取5个数据 limit 第一个参数是第几位开始查询,默认从第0位开始,第二个参数是查询多少个数据 */ $page = $_POST['page']; $pageSize = $_POST['rows']; $first = $pageSize * ($page - 1); //下面两个是和排序有关的 $order = $_POST['order']; $sort = $_POST['sort']; //php中多用双引号,双引号会解释变量的值,而单引号会把它当做字符串输出 //ORDER是依照组件提交的$order,$sort这两个参数,在数据库中排序后返回到php文件,再返回给组件 $query = mysqli_query($connection,"SELECT * FROM test ORDER BY $sort $order LIMIT $first,$pageSize"); $json = ''; while ($row = mysqli_fetch_assoc($query)) { //.=是连续定义的意思,并且给每句后面加上逗号 $json .= json_encode($row).','; } //动态获取数据总条数,不写死 $total = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM test")); //要将多行对象拼接成json格式,去除末尾的, //footer部分是设定footer部分的内容都有什么,要注意写法 $json = '{"total": '.$total.',"rows":['.substr($json,0,-1).'],"footer":[{"user": "统计","email": "统计","date": "统计"}]}'; echo $json; mysqli_close($connection);
30.DataGrid数据表格组件(4)
第四部分主要是组件工具栏和查询功能
1.属性列表
本部分新增代码:新增了user查询,日期选择两个功能,主要是通过组件的load属性通过ajax方式将三个input中输入的内容提交给后台,后台php文件接收到后将三个讯息拼接成sql查询语句,就可以从数据库中得到想要的结果
<table id="box"></table> <div id="tb" style="padding:5px"> <div style="margin-bottom: 5px"> <a href="#" class="easyui-linkbutton" iconCls="icon-add" plain="true">添加</a> <a href="#" class="easyui-linkbutton" iconCls="icon-edit" plain="true">修改</a> <a href="#" class="easyui-linkbutton" iconCls="icon-remove" plain="true">删除</a> </div> <div style="padding-left:7px;color:#333" > 查询账号:<input type="text" name="user" class="textbox" style="110px"> 创建时间从:<input type="text" name="date_from" class="easyui-datebox" style="110px"> 到:<input type="text" name="date_to" class="easyui-datebox" style="110px"> <a href="#" class="easyui-linkbutton" iconCls="icon-search" onclick="obj.search()">查询</a> </div> </div> js代码: $(function () { obj = { search : function(){ $('#box').datagrid('load',{ //这句是ajax方式提交名为user的键值对,后面是user这一栏输入的内容 //其中要注意:$.trim是取消字符串前后的空格 user : $.trim($('input[name=user]').val()), date_from: $.trim($('input[name=date_from]').val()), date_to : $.trim($('input[name=date_to]').val()), }); } }; php代码: $user = ''; $sql = ''; $date_from = ''; $date_to = ''; // sql查询语句: "SELECT * FROM test WHERE user LIKE '%德玛%' AND date >= '2020-01-14' // 找出test表user列中有“德玛”两个字的项和date列日期大于2020-01-14的项 // $query = mysqli_query($connection,"SELECT * FROM test WHERE user LIKE '%德玛%' AND date >= '2020-01-14' ORDER BY $sort $order LIMIT $first,$pageSize"); if(isset($_POST['user']) && !empty($_POST['user'])){ $user = "user LIKE '%{$_POST['user']}%' AND "; $sql .= $user; } if(isset($_POST['date_from']) && !empty($_POST['date_from'])){ $date_from = "date >='{$_POST['date_from']}' AND "; $sql .= $date_from; } if(isset($_POST['date_to']) && !empty($_POST['date_to'])){ $date_to = "date <='{$_POST['date_to']}' AND "; $sql .= $date_to; } if(!empty($sql)){ $sql = 'WHERE '.substr($sql,0,-4); } //php中多用双引号,双引号会解释变量的值,而单引号会把它当做字符串输出 //ORDER是依照组件提交的$order,$sort这两个参数,在数据库中排序后返回到php文件,再返回给组件 $query = mysqli_query($connection,"SELECT * FROM test $sql ORDER BY $sort $order LIMIT $first,$pageSize");
源代码:
<table id="box"></table> <div id="tb" style="padding:5px"> <div style="margin-bottom: 5px"> <a href="#" class="easyui-linkbutton" iconCls="icon-add" plain="true">添加</a> <a href="#" class="easyui-linkbutton" iconCls="icon-edit" plain="true">修改</a> <a href="#" class="easyui-linkbutton" iconCls="icon-remove" plain="true">删除</a> </div> <div style="padding-left:7px;color:#333" > 查询账号:<input type="text" name="user" class="textbox" style="110px"> 创建时间从:<input type="text" name="date_from" class="easyui-datebox" style="110px"> 到:<input type="text" name="date_to" class="easyui-datebox" style="110px"> <a href="#" class="easyui-linkbutton" iconCls="icon-search" onclick="obj.search()">查询</a> </div> </div> js代码: $(function () { obj = { search : function(){ $('#box').datagrid('load',{ //这句是ajax方式提交名为user的键值对,后面是user这一栏输入的内容 //其中要注意:$.trim是取消字符串前后的空格 user : $.trim($('input[name=user]').val()), date_from: $.trim($('input[name=date_from]').val()), date_to : $.trim($('input[name=date_to]').val()), }); } }; $('#box').datagrid({ // url : 'content.json', //通过ajax来请求php文件,上面是直接从json文件中得到数据,两种当时二选一 url : 'user.php', // method : 'get', width : 600, title : '用户列表', iconCls : 'icon-search', //斑马线效果,各行交替变换颜色 striped : true , fitColumns : true, //当文字显示不全是,是换行显示还是隐藏 // nowrap : false, //当未从外部引入数据时,默认是显示data这里的数据 // data : [ // { // user : '手工用户', // email : '手工邮件', // date : '2020-1-3', // } // ], //load时的提示讯息 // loadMsg : '努力展开中', // rownumbers : true, // singleSelect : true, //设置列的一些属性 columns : [[ { field : 'user', title : '账号', //设置这一列是否可以点击排序 sortable : true , // halign : 'center', }, { field : 'email', title : '邮件', sortable : true , //自定义排序-本质是冒泡排序,是客户端自己通过冒泡排序方式进行排序,使用该功能时要设置remoteSort : false, // sorter : function(a,b){ // console.log(a,b) // }, }, { field : 'date', title : '注册时间', sortable : true , } ]], toolbar : '#tb', pagination : true , //设置每页显示多少条 pageSize : 10, pageList : [10,20,30], pageNumber : 1, // pagePosition : 'bottom', //设置哪些列可以排序(因为刚打开网页时,默认是按照下面排序的,之后就可以根据上面设置的sortable进行点击排序) sortName : 'date', sortOrder : 'DESC', }); }); php代码: <?php // sleep(1); $connection = mysqli_connect('127.0.0.1','root','123456','datagrid demo'); if (!$connection) { //链接数据库失败 exit('<h1>链接数据库失败</h1>'); } /*page是列表组件的当前页码,通过根据每次请求时的页码,来计算第一个数据从数据库的哪行开始获取, 比如当前是第二页,每页五个数据,那么5*(2-1), $first=5,从第五个数据开始抓,抓取5个数据 limit 第一个参数是第几位开始查询,默认从第0位开始,第二个参数是查询多少个数据 */ $page = $_POST['page']; $pageSize = $_POST['rows']; $first = $pageSize * ($page - 1); //下面两个是和排序有关的 $order = $_POST['order']; $sort = $_POST['sort']; $user = ''; $sql = ''; $date_from = ''; $date_to = ''; // sql查询语句: "SELECT * FROM test WHERE user LIKE '%德玛%' AND date >= '2020-01-14' // 找出test表user列中有“德玛”两个字的项和date列日期大于2020-01-14的项 // $query = mysqli_query($connection,"SELECT * FROM test WHERE user LIKE '%德玛%' AND date >= '2020-01-14' ORDER BY $sort $order LIMIT $first,$pageSize"); if(isset($_POST['user']) && !empty($_POST['user'])){ $user = "user LIKE '%{$_POST['user']}%' AND "; $sql .= $user; } if(isset($_POST['date_from']) && !empty($_POST['date_from'])){ $date_from = "date >='{$_POST['date_from']}' AND "; $sql .= $date_from; } if(isset($_POST['date_to']) && !empty($_POST['date_to'])){ $date_to = "date <='{$_POST['date_to']}' AND "; $sql .= $date_to; } if(!empty($sql)){ $sql = 'WHERE '.substr($sql,0,-4); } //php中多用双引号,双引号会解释变量的值,而单引号会把它当做字符串输出 //ORDER是依照组件提交的$order,$sort这两个参数,在数据库中排序后返回到php文件,再返回给组件 // $query = mysqli_query($connection,"SELECT * FROM test WHERE user LIKE '%德玛%' AND date >= '2020-01-14' ORDER BY $sort $order LIMIT $first,$pageSize"); $query = mysqli_query($connection,"SELECT * FROM test $sql ORDER BY $sort $order LIMIT $first,$pageSize"); $json = ''; while ($row = mysqli_fetch_assoc($query)) { //.=是连续定义的意思,并且给每句后面加上逗号 $json .= json_encode($row).','; } //动态获取数据总条数,不写死 $total = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM test $sql")); //要将多行对象拼接成json格式,去除末尾的, //footer部分是设定footer部分的内容都有什么,要注意写法 $json = '{"total": '.$total.',"rows":['.substr($json,0,-1).'],"footer":[{"user": "统计","email": "统计","date": "统计"}]}'; echo $json; mysqli_close($connection);
30.DataGrid数据表格组件(5)
第五部分主要是,添加,撤销等功能
1.属性列表
新增代码:
<table id="box"></table> <div id="tb" style="padding:5px"> <div style="margin-bottom: 5px"> <a href="#" class="easyui-linkbutton" iconCls="icon-add" plain="true" onclick="obj.add()">添加</a> <a href="#" class="easyui-linkbutton" iconCls="icon-edit" plain="true">修改</a> <a href="#" class="easyui-linkbutton" iconCls="icon-remove" plain="true">删除</a> <a href="#" class="easyui-linkbutton" iconCls="icon-save" plain="true" style="display:none;" id="save" onclick="obj.save()" >保存</a> <a href="#" class="easyui-linkbutton" iconCls="icon-redo" plain="true" style="display:none;" id="redo" onclick="obj.redo()" >取消编辑</a> </div> <div style="padding-left:7px;color:#333" > 查询账号:<input type="text" name="user" class="textbox" style="110px"> 创建时间从:<input type="text" name="date_from" class="easyui-datebox" editable="false" style="110px"> 到:<input type="text" name="date_to" class="easyui-datebox" editable="false" style="110px"> <a href="#" class="easyui-linkbutton" iconCls="icon-search" onclick="obj.search()">查询</a> </div> </div> js代码: obj = { editRow : false, //写一个允许添加的开关 search : function(){ $('#box').datagrid('load',{ //这句是ajax方式提交名为user的键值对,后面是user这一栏输入的内容 //其中要注意:$.trim是取消字符串前后的空格 user : $.trim($('input[name=user]').val()), date_from: $.trim($('input[name=date_from]').val()), date_to : $.trim($('input[name=date_to]').val()), }); }, add : function(){ $('#save,#redo').show(); if(!this.editRow){ //appendRow是在当前一页的结尾添加一行 // $('#box').datagrid('appendRow',{ // user : 'abcd', // email : 'abcd@163.com', // date : '2020-01-05', // }) //insertRow是在index的位置添加一行 $('#box').datagrid('insertRow',{ index : 0, row : { // user : 'abcd', // email : 'abcd@163.com', // date : '2020-01-05', }, }); //将第一行设置为可编辑状态 $('#box').datagrid('beginEdit',0); this.editRow = true ; } }, save : function(){ //这里结束编辑后,会触发下面的onAfterEdit方法 $('#box').datagrid('endEdit',0); }, redo : function(){ //回 滚 所 有 从 创 建 或 上 一 次 调 用acceptChanges 函数后更改的数据 $('#box').datagrid('rejectChanges'); this.editRow = false ; $('#save,#redo').hide(); }, };
30.DataGrid数据表格组件(6)(7)
第六第七部分主要是完成增删改的功能,第六部分是增删改的前端,第七部分是增删改的后台php部分
1.属性列表
1.属性列表
全部代码整合如下:
index.html:
<!DOCTYPE HTML> <html> <head> <title>jQuery EasyUI</title> <meta charset="utf-8"> <meta name="Author" content="Helen"> <style> * { margin: 0; padding: 0; } </style> <script src="../easyUI/jquery.min.js"></script> <script src="../easyUI/jquery.easyui.min.js"></script> <script src="../easyUI/locale/easyui-lang-zh_CN.js"></script> <script src="js/index.js"></script> <link rel="stylesheet" href="../easyUI/themes/default/easyui.css"> <link rel="stylesheet" href="../easyUI/themes/icon.css"> </head> <body> <table id="box"></table> <div id="tb" style="padding:5px"> <div style="margin-bottom: 5px"> <a href="#" class="easyui-linkbutton" iconCls="icon-add" plain="true" onclick="obj.add()">添加</a> <a href="#" class="easyui-linkbutton" iconCls="icon-edit" plain="true" onclick="obj.edit()">修改</a> <a href="#" class="easyui-linkbutton" iconCls="icon-remove" plain="true" onclick="obj.remove()">删除</a> <a href="#" class="easyui-linkbutton" iconCls="icon-save" plain="true" style="display:none;" id="save" onclick="obj.save()" >保存</a> <a href="#" class="easyui-linkbutton" iconCls="icon-redo" plain="true" style="display:none;" id="redo" onclick="obj.redo()" >取消编辑</a> </div> <div style="padding-left:7px;color:#333" > 查询账号:<input type="text" name="user" class="textbox" style="110px"> 创建时间从:<input type="text" name="date_from" class="easyui-datebox" editable="false" style="110px"> 到:<input type="text" name="date_to" class="easyui-datebox" editable="false" style="110px"> <a href="#" class="easyui-linkbutton" iconCls="icon-search" onclick="obj.search()">查询</a> </div> </div> </body> </html>
index.js:
$(function () { //扩展datetimebox,因为列属性editors中没有datetimebox $.extend($.fn.datagrid.defaults.editors, { datetimebox : { init: function(container, options){ var input = $('<input type="text">').appendTo(container); options.editable = false; input.datetimebox(options); return input; }, getValue: function(target){ return $(target).datetimebox('getValue'); }, setValue: function(target, value){ $(target).datetimebox('setValue', value); }, resize: function(target, width){ $(target).datetimebox('resize', width); }, destroy : function (target) { $(target).datetimebox('destroy'); }, } }); obj = { //editRow是有两个作用:即是开关,也可以传值,默认为undefined,当双击或添加某一行时,会把当前行的index赋给editRow,当保存或双击另一行时,会通过editRow的值保存 editRow : undefined, search : function(){ $('#box').datagrid('load',{ //这句是ajax方式提交名为user的键值对,后面是user这一栏输入的内容 //其中要注意:$.trim是取消字符串前后的空格 user : $.trim($('input[name=user]').val()), date_from: $.trim($('input[name=date_from]').val()), date_to : $.trim($('input[name=date_to]').val()), }); }, add : function(){ $('#save,#redo').show(); if(this.editRow === undefined){ //appendRow是在当前一页的结尾添加一行 // $('#box').datagrid('appendRow',{ // user : 'abcd', // email : 'abcd@163.com', // date : '2020-01-05', // }) //insertRow是在index的位置添加一行 $('#box').datagrid('insertRow',{ index : 0, row : { // user : 'abcd', // email : 'abcd@163.com', // date : '2020-01-05', }, }); //将第一行设置为可编辑状态 $('#box').datagrid('beginEdit',0); this.editRow = 0 ; } }, save : function(){ //这里结束编辑后,会触发下面的onAfterEdit方法 $('#box').datagrid('endEdit',this.editRow); }, redo : function(){ //回 滚 所 有 从 创 建 或 上 一 次 调 用acceptChanges 函数后更改的数据 $('#box').datagrid('rejectChanges'); this.editRow = undefined ; $('#save,#redo').hide(); }, edit :function () { //首先要知道哪几行被选中了,getSelections可以返回被选中的行组成的数组 var rows = $('#box').datagrid('getSelections'); if(rows.length === 1){ //只有选中一行时才能编辑 if(obj.editRow !== undefined){ $('#box').datagrid('endEdit',obj.editRow); this.editRow = undefined; } if(obj.editRow === undefined){ //注意这个getRowIndex方法使用必须要把该行对象传进去,才能得到他的索引,不是根据鼠标位置来的 var index = $('#box').datagrid('getRowIndex',rows[0]); $('#save,#redo').show(); $('#box').datagrid('beginEdit',index); this.editRow = index; //unselectRow这个方法取消指定选择的行,??? $('#box').datagrid('unselectRow',index); } } else { $.messager.alert('警告','修改只能选中一行'); } }, remove : function () { //原理:通过rows[i].id 可以获得第i个被选中元素的id值 var rows = $('#box').datagrid('getSelections'); if(rows.length > 0){ $.messager.confirm('确定操作','您确定要删除选中的数据吗',function (flag) { if(flag){ var ids = []; for(var i=0,l=rows.length;i<l;i++){ ids.push(rows[i].id); } $.ajax({ type : 'POST', url : 'delete.php', data : { //向后台提交 ids 键的内容 ids : ids.join(','), }, //提交成功之前loading显示载入状态。 beforeSend : function () { $('#box').datagrid('loading'); }, // 提交成功后loaded隐藏载入状态。load是重新刷新页面 success : function (data) { //data是后台php返回来的数据 if(data){ $('#box').datagrid('loaded'); $('#box').datagrid('load'); //unselectAll取消所有选定,放置被删除的造成影响 $('#box').datagrid('unselectAll'); $.messager.show({ title : '提示', msg : data + '条用户已被删除', }); } }, }); } }); } else { $.messager.alert('警告','请选择要删除的记录'); } }, }; $('#box').datagrid({ // url : 'content.json', //通过ajax来请求php文件,上面是直接从json文件中得到数据,两种当时二选一 url : 'user.php', // method : 'get', width : 600, title : '用户列表', iconCls : 'icon-search', //斑马线效果,各行交替变换颜色 striped : true , fitColumns : true, //当文字显示不全是,是换行显示还是隐藏 // nowrap : false, //当未从外部引入数据时,默认是显示data这里的数据 // data : [ // { // user : '手工用户', // email : '手工邮件', // date : '2020-1-3', // } // ], //load时的提示讯息 // loadMsg : '努力展开中', // rownumbers : true, // singleSelect : true, //设置列的一些属性 columns : [[ { field : 'id', title : '编号', //设置这一列是否可以点击排序 sortable : true , width : 100, //加一个多选框用来删除 checkbox : true, }, { field : 'user', title : '账号', //设置这一列是否可以点击排序 sortable : true , //将第一行设置为可编辑状态,并且设置这个类型是text文本框还是validatebox验证框,或者直接是email这种样式 editor : { type : 'validatebox', options : { required : true, }, }, width : 100, }, { field : 'email', width : 100, title : '邮件', sortable : true , //自定义排序-本质是冒泡排序,是客户端自己通过冒泡排序方式进行排序,使用该功能时要设置remoteSort : false, // sorter : function(a,b){ // console.log(a,b) // }, editor : { type : 'validatebox', options : { required : true, validType : 'email', }, } }, { field : 'date', title : '注册时间', sortable : true , width : 100, editor : { type : 'datetimebox', //这个类型是通过上面的函数添加的,本来没有这个类型的 options : { required : true, }, } } ]], toolbar : '#tb', pagination : true , //设置每页显示多少条 pageSize : 10, pageList : [10,20,30], pageNumber : 1, // pagePosition : 'bottom', //设置哪些列可以排序(因为刚打开网页时,默认是按照下面排序的,之后就可以根据上面设置的sortable进行点击排序) sortName : 'date', sortOrder : 'DESC', //上面的endEdit方法执行后这个方法会被调用 onAfterEdit : function(rowIndex,rowData,changes){ //为了区分是新增一行还是编辑已有的行,需要做区分, // 如果是新增一行,inserted里就是新增行的对象,如果是编辑,updated就是编辑行的对象 var inserted = $('#box').datagrid('getChanges','inserted'); var updated = $('#box').datagrid('getChanges','updated'); //新增用户 var url = ''; var info = ''; if(inserted.length > 0){ url = 'add.php'; info = '新增'; } //修改用户 if(updated.length > 0){ url = 'update.php'; info = '修改'; } $.ajax({ type : 'POST', url : url, data : { //向后台提交新增的内容 row : rowData, }, //提交成功之前loading显示载入状态。 beforeSend : function () { $('#box').datagrid('loading'); }, // 提交成功后loaded隐藏载入状态。load是重新刷新页面 success : function (data) { //data是后台php返回来的数据 if(data){ $('#box').datagrid('loaded'); $('#box').datagrid('load'); //unselectAll取消所有选定,放置被删除的造成影响 $('#box').datagrid('unselectAll'); $.messager.show({ title : '提示', msg : data + '条用户已'+info+'', }); obj.editRow = undefined ; } }, }); $('#save,#redo').hide(); //这个数据可以通过ajax方式与后台进行交互 // console.log(rowData); }, onDblClickRow :function(rowIndex,rowData){ if(obj.editRow !== undefined){ $('#box').datagrid('endEdit',obj.editRow); obj.editRow = undefined; } if(obj.editRow === undefined){ $('#save,#redo').show(); $('#box').datagrid('beginEdit',rowIndex); obj.editRow = rowIndex; } }, }); });
user.php:
<?php // sleep(1); $connection = mysqli_connect('127.0.0.1','root','123456','datagrid demo'); if (!$connection) { //链接数据库失败 exit('<h1>链接数据库失败</h1>'); } /*page是列表组件的当前页码,通过根据每次请求时的页码,来计算第一个数据从数据库的哪行开始获取, 比如当前是第二页,每页五个数据,那么5*(2-1), $first=5,从第五个数据开始抓,抓取5个数据 limit 第一个参数是第几位开始查询,默认从第0位开始,第二个参数是查询多少个数据 */ $page = $_POST['page']; $pageSize = $_POST['rows']; $first = $pageSize * ($page - 1); //下面两个是和排序有关的 $order = $_POST['order']; $sort = $_POST['sort']; $user = ''; $sql = ''; $date_from = ''; $date_to = ''; // sql查询语句: "SELECT * FROM test WHERE user LIKE '%德玛%' AND date >= '2020-01-14' // 找出test表user列中有“德玛”两个字的项和date列日期大于2020-01-14的项 // $query = mysqli_query($connection,"SELECT * FROM test WHERE user LIKE '%德玛%' AND date >= '2020-01-14' ORDER BY $sort $order LIMIT $first,$pageSize"); if(isset($_POST['user']) && !empty($_POST['user'])){ $user = "user LIKE '%{$_POST['user']}%' AND "; $sql .= $user; } if(isset($_POST['date_from']) && !empty($_POST['date_from'])){ $date_from = "date >='{$_POST['date_from']}' AND "; $sql .= $date_from; } if(isset($_POST['date_to']) && !empty($_POST['date_to'])){ $date_to = "date <='{$_POST['date_to']}' AND "; $sql .= $date_to; } if(!empty($sql)){ $sql = 'WHERE '.substr($sql,0,-4); } //php中多用双引号,双引号会解释变量的值,而单引号会把它当做字符串输出 //ORDER是依照组件提交的$order,$sort这两个参数,在数据库中排序后返回到php文件,再返回给组件 // $query = mysqli_query($connection,"SELECT * FROM test WHERE user LIKE '%德玛%' AND date >= '2020-01-14' ORDER BY $sort $order LIMIT $first,$pageSize"); $query = mysqli_query($connection,"SELECT * FROM test $sql ORDER BY $sort $order LIMIT $first,$pageSize"); $json = ''; while ($row = mysqli_fetch_assoc($query)) { //.=是连续定义的意思,并且给每句后面加上逗号 $json .= json_encode($row).','; } //动态获取数据总条数,不写死 $total = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM test $sql")); //要将多行对象拼接成json格式,去除末尾的, //footer部分是设定footer部分的内容都有什么,要注意写法 $json = '{"total": '.$total.',"rows":['.substr($json,0,-1).'],"footer":[{"user": "统计","email": "统计","date": "统计"}]}'; echo $json; mysqli_close($connection);
增删改三部分php代码,大同小异,主要是sql语句不同
add.php
<?php sleep(2); //先链接数据库 $connection = mysqli_connect('127.0.0.1','root','123456','datagrid demo'); if (!$connection) { //链接数据库失败 exit('<h1>链接数据库失败</h1>'); } $row = $_POST['row']; $user = $row['user']; $email = $row['email']; $date = $row['date']; //print_r($row); mysqli_query($connection,"INSERT INTO test (user,email,date) VALUES ('$user','$email','$date')"); //echo 'ok'; echo mysqli_affected_rows($connection); mysqli_close($connection);
update.php:
<?php sleep(2); //先链接数据库 $connection = mysqli_connect('127.0.0.1','root','123456','datagrid demo'); if (!$connection) { //链接数据库失败 exit('<h1>链接数据库失败</h1>'); } $row = $_POST['row']; $id = $row['id']; $user = $row['user']; $email = $row['email']; $date = $row['date']; //print_r($row); mysqli_query($connection," UPDATE test SET user='$user',email='$email',date='$date' WHERE id='$id'"); echo mysqli_affected_rows($connection); mysqli_close($connection);
delete.php:
<?php sleep(2); //先链接数据库 $connection = mysqli_connect('127.0.0.1','root','123456','datagrid demo'); if (!$connection) { //链接数据库失败 exit('<h1>链接数据库失败</h1>'); } $ids = $_POST['ids']; mysqli_query($connection,"DELETE FROM test WHERE id IN ($ids)"); //输出受影响的行数 //echo mysql_affected_rows($connection); echo mysqli_affected_rows($connection); mysqli_close($connection);
30.DataGrid数据表格组件(8)
这部分是几个属性和方法的使用,
1.属性列表
这个功能是将columns中某几列放在里面,当总宽度不够时可以将这几列单独用进度条展示,其他列全部显示不受影响
frozenColumns : [[ // { // field : 'id', // title : '编号', // //设置这一列是否可以点击排序 // sortable : true , // width : 100, // //加一个多选框用来删除 // checkbox : true, // }, // { // field: 'user', // title: '账号', // //设置这一列是否可以点击排序 // sortable: true, // //将第一行设置为可编辑状态,并且设置这个类型是text文本框还是validatebox验证框,或者直接是email这种样式 // editor: { // type: 'validatebox', // options: { // required: true, // }, // } // } ]],
formatter是列属性:可以编辑每列内容的样式,写在某列下面
两个时间都是列菜单和列内容的右击事件,使用方便,注意先关闭鼠标默认事件e.preventDefault
formatter : function (value,rowData,rowIndex) { return '['+value+']' ; }, //右击某一列会有执行,filed是当前列名 onHeaderContextMenu : function (e,filed) { console.log(filed); }, onRowContextMenu :function (e,rowIndex,rowData) { e.preventDefault(); $('#menu').menu('show',{ left : e.pageX, top : e.pageY, }) },
30.DataGrid数据表格组件(9)
这部分是剩下的属性和方法的使用
1.属性列表
太多了,省略了,用的时候查表就行,下面附上典型的一些方法
onClickRow : function () { alert('你好'); }, onClickCell : function () { alert('单击单元格触发'); }, //取消勾选时触发 onUnselect : function () { alert('取消选择'); } onCancelEdit : function () { alert('取消编辑'); }, onSortColumn : function (sort,order) { alert('开始'+sort+'的'+order+'排序'); }, */ function clickManual() { // $('#box').datagrid('deleteRow',3); // $('#box').datagrid('checkAll'); // $('#box').datagrid('highlightRow',2); $('#box').datagrid('mergeCells',{ //index表示合并第几行 index : 2, //index表示合并哪一列 field : 'user', //横向/纵向合并几列 rowspan : 2 , colspan : 2 , }); }
31.Combobox下拉列表框组件
这个组件依赖于Combo(自定义下拉框)组件
1.属性列表
2.事件列表
3.方法列表
<input id="box" name="box"> <input type="button" value="按钮" onclick="abc()"> index.js: $(function () { $('#box').combobox({ valueFiled : 'id', textField : 'user', // url : 'content.json', url : 'user.php', //根据某一项分组,比如按名字或email groupField : 'email', //设定分组group的样式 groupFormatter : function(group){ return '['+group+']'; }, //直接把数据显示在这里,不用引入json或从后台获取 // data : [ // { // "id" : 1, // "user" : "蜡笔小新", // "email" : "xiaoxin@163.com", // "date" : "2020-01-01" // }, // { // "id" : 2, // "user" : "蜡笔中新", // "email" : "xiaoxin@163.com", // "date" : "2020-01-01" // }, // { // "id" : 3, // "user" : "蜡笔大新", // "email" : "xiaoxin@163.com", // "date" : "2020-01-01" // } // ], //当设置为“remote”模式时,用户输入将被发送到名为'q'的 HTTP 请求参数到服务器检索新数据。 mode : 'remote', //当mode是local时可以用filter过滤本地数据,q是输入的关键词,row是行数据对象 // filter: function(q, row){ // var opts = $(this).combobox('options'); // return row[opts.textField].indexOf(q) >= 0; // }, formatter : function(row){ var opts = $(this).combobox('options'); return '['+row[opts.textField]+']'; }, onSelect : function(record){ alert('选择一个项时触发'); console.log(record); }, onUnselect : function(record){ alert('取消选择一个项时触发'); console.log(record); }, }); }); function abc() { // $('#box').combobox('unselect',1); $('#box').combobox('reload'); } user.php: <?php // sleep(1); $connection = mysqli_connect('127.0.0.1','root','123456','datagrid demo'); if (!$connection) { //链接数据库失败 exit('<h1>链接数据库失败</h1>'); } $query = mysqli_query($connection,"SELECT * FROM test"); //接受查询的id值,在sql语句中查询 if(isset($_POST['q']) && !empty($_POST['q'])){ $q = $_POST['q']; $query = mysqli_query($connection,"SELECT * FROM test WHERE id='$q'"); } $json = ''; while ($row = mysqli_fetch_assoc($query)) { //.=是连续定义的意思,并且给每句后面加上逗号 $json .= json_encode($row).','; } $json = substr($json,0,-1); echo '['.$json.']'; mysqli_close($connection);
32.ComboGrid数据表格下拉框组件
这个组件是把 Combo(自定义下拉框)和 DataGrid(数据表格)组件结合起来,点击下拉框会把DataGrid(数据表格)显示出来
1.属性列表
2.方法列表
<input id="box" name="box"> <input type="button" value="按钮" onclick='abc()'> index.js: $(function () { $('#box').combogrid({ panelWidth : 600, idField : 'id', textField : 'user', url : 'user.php', loadMsg : '加载中', //自适应布局 fitColumns : true, //设定可以复选 multiple : true, mode : 'remote', columns : [[ { field : 'id', title : '编号', width : 100, checkbox : true, }, { field : 'user', title : '账号', width : 100, }, { field : 'email', width : 100, title : '邮件', }, { field : 'date', title : '注册时间', width : 100, } ]] }); }); function abc() { //清空输入框的内容 // $('#box').combogrid('clear'); //将index为2的值显示为输入框的value值 $('#box').combogrid('setValue',2); } user.php部分代码同上个组件
33.propertygrid属性表格组件
这个组件依赖是于 DataGrid(数据表格)
属性表格扩展自 datagrid(数据表格)。它的行数据格式和数据表格相同。作为一个属性行,按下面格式写成json数据:
name:字段名称。
value:字段值。
group:分组字段值。
editor:在编辑属性值的时候使用的编辑器对象。
属性和方法
<table id="box" style="300px;"></table> <input type="button" value="按钮" onclick="abc()"> index.js: $(function () { $('#box').propertygrid({ url : 'content.json', //按照数据中的group项分组数据 showGroup : true, groupFormatter : function (group,row) { return '['+group+']'; } }); }); function abc(){ //折叠某一行 $('#box').propertygrid('collapseGroup',0); } content.json: [ { "name" : "PHP 版本", "value" : "5.4", "group" : "系统信息", "editor" : "text" }, { "name" : "CPU 核心", "value" : "双核四线程", "group" : "系统信息", "editor" : "text" }, { "name" : "超级管理员", "value" : "Admin", "group" : "管理信息", "editor" : "text" }, { "name" : "管理密码", "value" : "******", "group" : "管理信息", "editor" : "text" } ]
34.tree树组件(1)
这个组件主要是用来做目录的,它依赖于 Draggable(拖动)和 Droppable(放置)组件
属性和方法
注意content.json的套娃(嵌套)格式,也可以加属性在json文件中
<ul id="box"></ul> index.js : $(function () { $('#box').tree({ url : 'content.json', //展开子目录有动画效果 animate : true, //定义在所有项前是否显示复选框 checkbox : true, //点击复选框时不会关联 cascadeCheck : false, //取消目录的复选框 onlyLeafCheck : true, //加虚线 lines : true, //添加拖拽功能,很强大 dnd : true, data : [{ "text" : "本地节点", }], formatter : function (node) { return '['+node.text+']'; } }); }); content.json: [ { "id" : 1, "text" : "系统管理", "iconCls" : "icon-save", "children" : [ { "text" : "主机信息", "state" : "closed", "children" : [ { "text" : "版本信息" }, { "text" : "数据库信息" } ] }, { "text" : "更新管理" }, { "text" : "程序信息" } ] }, { "id" : 2, "text" : "会员管理", "children" : [ { "text" : "新增会员", "checked" : true }, { "text" : "审核会员" } ] } ]
34.tree树组件(2)
在数据库中,每一项的id值在点击时候会发送给后台,所以我们就知道点击的是哪一项,这时候我们通过tid来进行子目录的设计
如果前台没有传过来id值,说明网页时第一次打开或者没点击某一项,这时候数据库将tid是0的返回,网页上显示的就是系统管理和会员信息这两个主目录。
这时候如果我们点击系统管理,前台就会返回id=1,后台根据id值匹配tid=1,这时候主机信息,更新信息和程序信息就会变成系统管理的子目录。
state是设定该项是否可以展开的,设定系统管理这项的id是1,那么主机信息这项的tid也设置为1,这样点击真开系统管理时,php文件中sql语句根据tid为1查找的就是主机信息这项。
<ul id="box"></ul> $(function () { $('#box').tree({ /* url : 'content.json', //展开子目录有动画效果 animate : true, //定义在所有项前是否显示复选框 checkbox : true, //点击复选框时不会关联 cascadeCheck : false, //取消目录的复选框 onlyLeafCheck : true, //加虚线 lines : true, //添加拖拽功能,很强大 dnd : true, data : [{ "text" : "本地节点", }], formatter : function (node) { return '['+node.text+']'; } */ url : 'user.php', lines : true, //data是主目录下的项对象 onLoadSuccess : function (node,data) { //这部分是根据后台设定的closed属性,展开它们 if(data){ $(data).each(function(index,value){ if(this.state == 'closed'){ $('#box').tree('expandAll'); } }); } } }); });
<?php // sleep(1); $connection = mysqli_connect('127.0.0.1','root','123456','demo'); if (!$connection) { //链接数据库失败 exit('<h1>链接数据库失败</h1>'); } $id=0; //接受查询的id值,在sql语句中查询 if(isset($_POST['id']) && !empty($_POST['id'])){ $id = $_POST['id']; } $query = mysqli_query($connection,"SELECT * FROM tree WHERE tid=$id"); $json = ''; while ($row = mysqli_fetch_assoc($query)) { //.=是连续定义的意思,并且给每句后面加上逗号 $json .= json_encode($row).','; } $json = substr($json,0,-1); echo '['.$json.']'; mysqli_close($connection);
35.ComboTree( 树型下拉框) 组件
这个组件依赖于Combo(下拉框)和 Tree(树)组件,该组件就是把下拉框和tree合在一起,没啥新增的方法
属性和方法
<input type="text" id="box"> <input type="button" value="按钮" onclick="abc()"> $(function () { $('#box').combotree({ url : 'content.json', required : true, editable : true, }); }); function abc() { //这里的t是整个下拉框树形对象,可以通过.tree()来使用tree组件的功能 /* var t= $('#box').combotree('tree'); console.log(t.tree('getSelected')); $('#box').combotree('loadData',[ { text : '加载' } ]); $('#box').combotree('reload'); $('#box').combotree('clear'); */ $('#box').combotree('setValues',[1,2]); }
36.TreeGrid( 树形表格) 组件(最后一个组件)
这个组件就是表格datagrid,只不过每列的内容变成了树形的数据,需要注意的是html和js的两种写法,以及idField和treeField的代表的意思
属性和方法
html的写法: <!--这里的idField是向后台发送的id,而treeField是把json文件中哪一项作为树形结构显示--> <!--<table class="easyui-treegrid" data-options="url:'content.json',idField:'id',treeField:'name'">--> <!-- <thead>--> <!-- <tr>--> <!-- <!–这里只是规定菜单导航这个题目下显示哪一项,和上面的设定没啥关系–>--> <!-- <th data-options="field:'name'">菜单导航</th>--> <!-- <th data-options="field:'date'">创建时间</th>--> <!-- </tr>--> <!-- </thead>--> <!--</table>--> <table id="box"></table> js的写法: $(function () { $('#box').treegrid({ url : 'content.json', width : 400, idField : 'id', treeField : 'name', columns : [[ { field : 'name', title : '菜单名称', width : 180, }, { field : 'date', title : '创建时间', width : 180, }, ]] }); });
content.json:
[ { "id" : 1, "name" : "系统管理", "date" : "2015-05-10", "children" : [{ "id" : 2, "name" : "主机信息", "date" : "2015-05-11" }] }, { "id" : 3, "name" : "会员管理", "date" : "2015-05-10", "children" : [{ "id" : 4, "name" : "认证审核", "date" : "2015-05-11" }] } ]