jQuery-01 EasyUI的使用

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"
    }]
  }
]

  

原文地址:https://www.cnblogs.com/Helen-code/p/12048419.html