datagrid是在 table的基础上变化而来的, 而不是在div的基础上来的。 从div来变成 datagrid,样式的设置仍是是比较麻烦的。php
dg=datagrid 的标题 来源于 columns 属性, 其内容 来源于 url属性。 关键是, 必定要设置这样的属性, 才能给你显示标题和内容, 不然即便你写了 tr等都不会显示css
dg的url 最后输出的内容 必须是 json格式: 若是是php的, 则要用echo, 若是是 其余文件,就要用 json数据html
并且ajax的方式好像都是 post方式。
好比: 分页, 前端 须要 向 后台 传递数据: 一个是page(当前页码,便是第几页?), 一个是 pageSize(一页多少条数据)。 而后后台post获取到 页码和页数, 在 mysql的查询语句中 ,用 limit start rowsCount, 来规范限定 返回的数据。
并且, 后台 除了返回 当前页面须要的部分 rows数据外, 还要返回一个 total总页数。
最后的 返回结果 要写成 json格式的: 这种 类型: {"total": $total, "rows": .....}
前端
一个是加载 dg的内容, 并完成分页;
二个是, 排序,能够只作 初始化的时候 排序;
三是: 设置dg的样式, 有striped, rowNumbers, singSelected为true等等.mysql
isset是判断 $_POST的某个 变量名 是否设置了的, 主要是 用来 判断 按钮 是否被 单击了的, 主要是 防止 页面刷新时 执行代码;
而 !empty 是判断 $_POST的变量名的值是否为空, 主要是用来判断搜索框中是否有输入 内容的, 经常使用的判断就是:
if(isset($_POST['name']) && !empty($_POST['name'])){...}
ajax
主要有三种情形:sql
$str{5}
能够输出字符串中的 第n 个字符。经常使用来判断字符串的长度:if(!isset($str{5})){...}
==============================================数据库
$('#btn1, #btn2'). show(); $('#btn1, #btn2'). hide();
而有些操做是, 共同的: 好比 开始编辑的操做是: beginEdit, 结束编辑的操做是: endEdit.json
==========================================bootstrap
[{"id": 1, "name": "foo"}, .....]
的形式. 若是 php返回的格式 不是这样的, 将不会加载数据 进来.public function dgcontent(){ $sort = I('post.sort'); $order = I('post.order'); $page = I('post.page'); $pageSize = I('post.rows'); $from = $pageSize*($page-1); $dg = M('dg'); $total = $dg -> count(); $result = $dg->field('id, dept, class, name')->order("$sort $order")->limit($from,$pageSize)->select(); $json=""; for($i=0, $j=count($result); $i<$j; $i++){ $json .= json_encode($result[$i]).','; } $json ='{"total":'.$total.',"rows":['. substr($json, 0 , -1).']}'; echo $json; }
==========================================
strip和stripe的区别?
按照汉字的拼音排序,用的比较可能是在人名的排序中,按照姓氏的拼音字母,从A到Z排序; 若是存储姓名的字段采用的是GBK字符集,那就好办了,由于GBK内码编码时自己就采用了拼音排序的方法(经常使用一级汉字3755个采用拼音排序,二级汉字就不是了,但考虑到人名等都是经常使用汉字,所以只是针对一级汉字能正确排序也够用了)。 直接在查询语句后面 添加 order by name asc; 查询结果按照姓氏的升序排序; 若是存储姓名的字段采用的是 utf8字符集,须要在排序的时候对字段进行转码;对于的代码是 order by convert(name using gbk) asc; 一样,查询的结果也是按照姓氏的升序排序(因此, 若是存储的是utf8字符集, 由于有一个转码的过程, 因此看到的排序和想象中的不同.
count(1),其实就是计算一共有多少符合条件的行。
1并非表示第一个字段,而是表示一个固定值。
其实就能够想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1.
同理,count(2),也能够,获得的值彻底同样,count('x'),count('y')都是能够的。同样的理解方式。在你这个语句理均可以使用,返回的值彻底是同样的。就是计数。
count(*),执行时会把星号翻译成字段的具体名字,效果也是同样的,不过多了一个翻译的动做,比固定值的方式效率稍微低一些。
=====================================
主要仍是从 语义和你的用途上来区分,虽然都能实现相同的效果。
什么时候应当使用margin: - 不须要在border外侧添加空白时。 - 空白处不须要背景(色)时。 - 上下相连的两个盒子之间的空白,须要相互抵消时。如15px + 20px的margin,将获得20px的空白。 什么时候应当时用padding: - 须要在border内测添加空白时。 - 空白处须要背景(色)时。 - 上下相连的两个盒子之间的空白,但愿等于二者之和时。如15px + 20px的padding,将获得35px的空白。 ::: margin是用来隔开元素与元素的间距;padding是用来隔开元素与内容的间隔。 margin用于布局分开元素使元素与元素互不相干;“老死不相往来” 是两家人 padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元素之间有一段“呼吸距离”。 是一家人
======================================
/*在js中定义变量,并非必须加var的! 并且, 不加var表示的是 "全局变量", 是顶级对象window的成员变量
//这里的obj没有加var, 就是全局对象window的属性 obj={ rowEdit : undefined, search: function(){ }, add: function(){ }, update: function(){ }, remove: function(){ }, save:function(){ }, };
https://blog.csdn.net/u012739535/article/details/17621247
, https://www.cnblogs.com/yangzhx/p/4019073.html
)包括: undefined, '', 0, null, false. 这些都叫 假值或空值, 在 if判断中都是假. 可是它们仍是有区别的:
typeof( var_name)
能够知道: undefined 的类型是: undefined, 0 的类型是: number, '' 的类型是string, null的类型是: object, 也就是说 null是对象的空值; false是boolean类型的.这些空值相互之间 用 == 判断 , 的结果 是 : 0, false , ''', 三者之间是相等的: 即 0 == false == '' 的结果是true的. 能够认为这三个是 " 假值". 而 undefined==null , 能够认为它们是空值. 可是 undefined和 null 跟 数字相加的结果是不一样的: 好比: 10+null =10, 10+undefined = NaN.
全部的假值 用 == 和 空值 比较的 结果 都是 false.
假值 , 有一个实际的对象, 因此 能够用 .toString() 方法.
而空值, 连对象都没有, 因此 不能用 .toString 方法, 不然将抛出异常
undefined表示 无效对象, 当定义一个变量未被初始化时, 就是undefined, 而 null是已经被初始化 为空对象. 可是全部的空值和假值 用 === 判断 都是false.
obj={ rowEdit : undefined, search: function(){ .... add: function(){ if(!this.rowEdit){ // 这里要加this $('#save, #cancel').show(); $('#box').datagrid('insertRow',{ index: 0, row: { } });
参考 : https://www.cnblogs.com/langhua/p/3672820.html
=================================================
url: "{:U('xscontent')}"+'/?class={$class}',
就行了. /*datagrid的返回结果, 来填充 前台的 数据行,必须严格要求json格式, 并且json的格式和属性名必须是: * "rows:": json_object_array, 即必须是rows, 后面的数据必须是数组, 每一个数组元素必须是json格式的对象 * echo '{"total":"11","rows":[{"id":"100", "class":"A_class", "name":"the_Name", "account":"the_account"}]}'; */
==============================================
好比: 在 dg的 onAfterEdit事件中, 就要判断 url 是否为空, 而后才去调用 ajax.
onAfterEdit: function(rowIndex, rowData, changes){ var inserted = $('#box').datagrid('getChanges', 'inserted'); var updated = $('#box').datagrid('getChanges', 'updated'); var url=info=''; if(inserted.length>0){ url='{:U("add")}'; info='新增'; } if(updated.length>0){ url='{:U("update")}'; info='修改'; } /* 这里很重要 , 要判断一下 url是否为空, 不然 即便任意地 双击 一行记录, 再去 双击另一行记录, 即便没有和数据库进行 修改操做, 也会提示 ajax的success提示信息 , 然而这个时错误的! */ if(url!='' && info != ''){ $.ajax({ type: 'post', url: url, data: {row: rowData,}, beforeSend: function(){ $('#box').datagrid('loading'); }, success: function(data){ if(data !== false){ $('#box').datagrid('loaded'); $('#box').datagrid('load'); $('#box').datagrid('unselectAll'); $.messager.show({ title: '消息', msg: '1个班级 '+ info +' 成功', showType: 'slide', timeout: 3000 }); obj.rowEdit = undefined; } }, });
===================================================
https://blog.csdn.net/Dzq_Boyka/article/details/78531217
主要思想是, 在 onClickRow 和 onDblClickRow 事件中 , 必须显示的调用 $('#box').datagrid('unselectRow', rowIndex)
方法, 不能只是 简单地 返回 return.
要想使dg 在 新增的时候, 不能选择行或 双击行 操做, 那么 能够设置一个 标识变量: isAdded , 当 每次 新增的时候, 都从新设置 isAdded = false, 而后, 判断 onClickRow 和 onDblClickRow 事件中 的 isAdded是否 为false, 或者 true
可是又要保证 初次载入 datagrid的时候, 若是不点击 新增的时候, 要可以 选择单行, 或 双击单行操做, 就要 初始化 obj的 isAdded 为true.
obj={ rowEdit : undefined, isAdded: true, // 这里是 关键! add: function(){ // 一旦增长的时候, 就要从新初始化isAdded为false, 由于只要保存/取消一次后, isAdded就失效了 this.isAdded=false; .... } onDblClickRow: function(rowIndex, rowData){ // 在新增记录的时候, 禁止单击选行 和 双击选行 if(!obj.isAdded){ $('#box').datagrid('unselectRow', rowIndex); return; } // 双击某一行的时候, 首先要关闭以前可能被修改的行 if(obj.rowEdit != undefined){ $('#box').datagrid('endEdit', obj.rowEdit); obj.rowEdit = undefined; } ............ }, onClickRow: function(rowIndex, rowData){ if(!obj.isAdded){ $('#box').datagrid('unselectRow', rowIndex); return; } },
=====================================================
https://blog.csdn.net/H12KJGJ/article/details/53672096
pageList 类型array 用法: 用户能改变页面尺寸。pageList 属性定义了能改为多大的尺寸。 代码实例: $('#pp').pagination({ pageList: [10,20,50,100] });
分页器中 的一个 页面 由两个 因素来决定: 一个是: pageSize( 每个页面的最大尺寸), pageNumber(页数), 因此 每一页的第一条数据的索引值就是: pageSize*(pageNumber-1);
这个就是用来 作 数据库的limit的 依据的:
所以 : onSelectPage 事件, 就是 当从新改变了pageSize , 从新选择了 pageNumber后所获得的页面.
总共有4个 ajax事件: onSelectPage, onBeforeRefresh, onRefresh, onChangePageSize... 所以, 在dg中改变分页尺寸的事件是 : onChangePageSize的回调函数中写
===========================================
https://blog.csdn.net/peng_hong_fu/article/details/70662979
https://blog.csdn.net/amyleeYMY/article/details/63685330
由四位数字 组成:
!important =1000,
id的优先级=100,
类, 伪类, 属性的优先级 =10,
元素, 伪元素的优先级=1
这些优先级, 无论层次, 只要有一个就 加上相应的 优先级 数值. 最后 算 总和.
可是要注意:
伪元素 只有四个, 即 :before, :after, : first-letter, :first-line , 主要是表示位置的
伪类 有更多, 只要是表示 "状态"的, 好比 :link, :active, :visited, :hover, :focus, :first-child 等
若是有多个 相互冲突的 css规则 同时做用在同一个 元素上, 则最终 起做用的是: 以 定义这些类样式的前后顺序为准, 后定义的样式 会 覆盖 先前定义的样式, 即 后定义的样式 最终 将起做用. 而跟 该元素上 , 多个类样式 书写的前后顺序无关.
异步, 表示 它是 "非模态的", 虽然有 "遮照" 样式, 可是 它并不会阻止 该消息框 后续的代码的执行. 相反, 在执行 消息框的 回调函数时, 主函数的 剩余代码 已经执行完毕了! 因此这就是 为何主函数中 没法获取 回调函数的 返回值的缘由
那么 要想实现 模态 框的 效果, 想要 某些代码 在 点击 "肯定" 后, 再执行, 就要把 这些代码 放在 消息框的 回调函数中, 由于 回调函数 总数在 用户 单击 "肯定" 按钮后 才执行.