原创汉化官方API,shadow实行绘画

使用box-shadow实行绘画(品质优化终结者)

2018/06/01 · CSS ·
box-shadow

原稿出处: 贾顺名   

近些年忽然想做一些妙趣横生的事物,找来找去,想到了事先早已在网上看看过有人用box-shadow画了一副蒙娜Lisa出来
深感那些挺有意思,正好趁机周末,本人也搞一波

不久前突然想做一些诙谐的事物,找来找去,想到了前边已经在网上来看过有人用box-shadow画了一副蒙娜Lisa出来
感到这几个挺好玩,正好趁机周末,本人也搞一波

DataGrid

废话少说间接进去正题,
报表效能:
1、添加
2、删除
3、获取值
肆 、动态填充数据
伍 、动态设置要点
陆 、键盘左右上下键控制单元格大旨
七 、单元格添加正则印证功能
WebForm4.aspx

前言

前言

  继承自 $.fn.panel.defaults,覆盖私下认可值 $.fn.datagrid.defaults.

复制代码 代码如下:

在线地址:

优化前的版本
优化后的本子
源码仓库地址

不提议上传大图片。。喜欢听电脑引擎声的除外


第贰,并不打算单纯的落到实处某一张图纸(那样太枯燥了),而是通过上传图片,来动态变化box-shadow的数据。
所以,你要求驾驭那个事物:

  1. box-shadow
  2. canvas

在线地址:

优化前的本子
优化后的版本
源码仓库地址

不建议上传大图片。。喜欢听电脑引擎声的不外乎


先是,并不打算单纯的实现某一张图片(那样太干燥了),而是经过上传图片,来动态变化box-shadow的数据。
据此,你需求通晓那一个事物:

  1. box-shadow
  2. canvas

 

<%@ Page Language=”C#” AutoEventWireup=”true”
CodeBehind=”WebForm4.aspx.cs” Inherits=”table.WebForm4″ %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“;
<html xmlns=”” >
<head runat=”server”>
<title></title>
<script src=”jquery-1.3.2-vsdoc2.js”
type=”text/javascript”></script>
<script src=”jquery-1.3.2.js”
type=”text/javascript”></script>
<script src=”jquery.DynamicTable.js”
type=”text/javascript”></script>
<link href=”style2.css” type=”text/css” rel=”Stylesheet”/>
<script type=”text/javascript”>
var rowtmplate = “<tr><td class=’TableData’><input
type=’text’ style=’border:0px; width:98%;’/></td>”;
rowtmplate += “<td class=’TableData’><input type=’text’
style=’border:0px; width:98%;’/></td>”;
rowtmplate += “<td class=’TableData’><input type=’text’
style=’border:0px; width:98%;’/></td>”;
rowtmplate += “<td class=’TableData’><input type=’text’
style=’border:0px; width:98%;’/></td>”;
原创汉化官方API,shadow实行绘画。rowtmplate += “<td class=’TableData’><input type=’text’
style=’border:0px; width:98%;’/></td>”;
rowtmplate += “<td class=’TableData’><a href=’#’
>删除</a></td></tr>”;
$(document).ready(function() {
$(this).bind(‘keyup’, function(e) {
switch (e.keyCode) {
case 38: //上 ↑
var arr = $.fn.getFocus();
var rowIndex = arr[0] – 1;
$.fn.setFocus({ rowIndex: rowIndex, colIndex: arr[1] });
$.fn.setCellsFocus();
break;
case 40: //下 ↓
var arr = $.fn.getFocus();
var rowIndex = arr[0] + 1;
$.fn.setFocus({ rowIndex: rowIndex, colIndex: arr[1] });
$.fn.setCellsFocus();
break;
default:
break;
}
});
$(‘#mytbl’).DynamicTable({
rowCount: 3, //添加行数
identity: 1, //第③列自动编号
arrFocus: [2, 1], //第一个单元格设置为典型
rowTmplate: rowtmplate //行模版
});
$(‘#mytbl’).BindEvent({
eventName: “click”,
colIndex: 1,
fn: alertMsg
}); //暗中同意给第2列绑定click事件
$(‘#mytbl’).setCellsFocus(); //设置第③个单元格为纽带
$(‘#mytbl’).deleteRow(); //暗中认可给第五列绑定删除事件
$(‘#mytbl’).AutoFillData({ colIndex: 2, fn: getData });
//暗中同意给第①列绑定自动填写数据
$(‘#mytbl’).Identity({ colIndex: 1 }); //暗许给第壹列自动排序
$(‘#mytbl’).validationText({ reg: /^((\d+\.\d{2})|\d+)$/, colIndex:
5, defalutValue: 0.00 }); //私下认可给第①列添加验证(只可以输入money格式)
});
//添加行
function addRow(count) {
$(‘#mytbl’).addRow({ rowCount: count });
$(‘#mytbl’).Identity();
$.fn.deleteRow();
}
//获取活动填写数据
function getData(key) {
var arr = [];
arrFoucs = $.fn.getFocus();
$.ajax({
type: “post”,
async: false, //控制同步
url: “getData.ashx”,
dataType: “json”,
cache: false,
success: function(data) {
var idx = arrFoucs[0] – 2;
arr.push(data[idx].id);
arr.push(data[idx].Name);
arr.push(data[idx].Code);
arr.push(data[idx].Units);
arr.push(data[idx].Price);
},
Error: function(err) {
alert(err);
}
});
$.fn.setCellsFocus({ rowIndex: arrFoucs[0], colIndex: 4 });
return arr;
}
function alertMsg() {
arrFoucs = $.fn.getFocus();
alert(‘你单击了坐标X:’+arrFoucs[0]+’
Y:’+arrFoucs[1]+’的单元格’);
}
</script>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>
<table cellpadding=”0″ cellspacing=”0″ class=”tablestyle1″
id=”mytbl”>
<tr>
<td class=”TableData”>序号</td>
<td class=”TableData”>产品名称</td>
<td class=”TableData”>产品代码</td>
<td class=”TableData”>单位</td>
<td class=”TableData”>单价</td>
<td class=”TableData”><a href=”#”
onclick=”addRow(5);”>添加5行</a></td>
</tr>
</table>
<input type=”button” value=”获取值”
onclick=”javascript:alert($.fn.getValue({}));” />
</div>
</form>
</body>
</html>

box-shadow

box-shadow能够让大家本着任意多少个html标签生成阴影,大家能够操纵影子的偏移量、模糊半径、实际半径、颜色等一名目繁多属性。
语法如下:

selector { /* offset-x | offset-y | color */ box-shadow: 60px -16px
teal; /* offset-x | offset-y | blur-radius | color */ box-shadow: 10px
5px 5px black; /* offset-x | offset-y | blur-radius | spread-radius |
color */ box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2); /* inset |
offset-x | offset-y | color */ box-shadow: inset 5em 1em gold; /* Any
number of shadows, separated by commas */ box-shadow: 3px 3px red, -1em
0 0.4em olive; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
selector {
  /* offset-x | offset-y | color */
  box-shadow: 60px -16px teal;
 
  /* offset-x | offset-y | blur-radius | color */
  box-shadow: 10px 5px 5px black;
 
  /* offset-x | offset-y | blur-radius | spread-radius | color */
  box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2);
 
  /* inset | offset-x | offset-y | color */
  box-shadow: inset 5em 1em gold;
 
  /* Any number of shadows, separated by commas */
  box-shadow: 3px 3px red, -1em 0 0.4em olive;
}

这里是MDN的box-shadow讲述,里边有局地示范。

box-shadow

box-shadow能够让大家针对任意1个html标签生成阴影,大家得以决定影子的偏移量、模糊半径、实际半径、颜色等一名目繁多属性。
语法如下:

selector {
  /* offset-x | offset-y | color */
  box-shadow: 60px -16px teal;

  /* offset-x | offset-y | blur-radius | color */
  box-shadow: 10px 5px 5px black;

  /* offset-x | offset-y | blur-radius | spread-radius | color */
  box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2);

  /* inset | offset-x | offset-y | color */
  box-shadow: inset 5em 1em gold;

  /* Any number of shadows, separated by commas */
  box-shadow: 3px 3px red, -1em 0 0.4em olive;
}

 

这里是MDN的box-shadow讲述,里边有局地示范。

 

jquery.DynamicTable.js

canvas

是的,咱们还索要canvas,因为大家要求将图纸能源转存到canvas中,再生成咱们实际须求的多少格式。
在那边并不会拿canvas去做渲染之类的,单纯的是要运用canvas的某些API。

canvas

是的,大家还亟需canvas,因为大家要求将图纸能源转存到canvas中,再生成大家实在须求的数码格式。
在此地并不会拿canvas去做渲染之类的,单纯的是要接纳canvas的某些API。

 

复制代码 代码如下:

首版规划

刚初叶的设计大概是那般的:

  1. 大家上传一张图纸
  2. 创造多个Image对象收取上传的图形能源
  3. Image对象放入canvas
  4. 通过canvas生成图片文件对应的rgba数据
  5. 处理rgba数码转换为box-shadow属性
  6. done

首版规划

刚开端的统一筹划差不多是那样的:

  1. 笔者们上传一张图片
  2. 创造贰个Image目的吸收上传的图样财富
  3. Image指标放入canvas
  4. 通过canvas生成图片文件对应的rgba数据
  5. 处理rgba多少转换为box-shadow属性
  6. done

  DataGrid控件显示数据以表格的格局提供了丰盛的挑三拣四,扶助排序,组和编写制定数据。

///<reference path=”jquery-1.3.2-vsdoc2.js” />
2
3 (function($) {
4 var rowtmplate = “”;
5 var arrFocus = [];
6
7 $.fn.DynamicTable = function(options) {
//定义插件的名目,这里为userCp
8 var deafult = {
9 //以下为该插件的属性及其暗中认可值
rowCount: 5, //添加行数
identity: 1, //第2列自动编号
arrFocus: [2, 1], //第三个单元格设置为典型
rowTmplate: “” //行模版
};
var ops = $.extend(deafult, options);
rowtmplate = ops.rowTmplate;
arrFocus = ops.arrFocus;
$(this).addRow(ops.rowCount);
};
/*由此行模版添加多行至表格最终一行前面*/
/*count–添加行数*/
$.fn.addRow = function(options) {
var deafult = {
rowCount: 5
};
var ops = $.extend(deafult, options);
var rowData = “”;
var count = ops.rowCount;
for (var i = 1; i <= count; i++) {
rowData += rowtmplate;
}
$(this).find(‘tr:last-child’).after(rowData);
CellsFocus();
};
/*动态给某列绑定事件,事件被触发时执行fn函数*/
/*eventName–事件名称;colIndex–列索引(从1开首);fn–触发函数*/
$.fn.BindEvent = function(options) {
var deafult = {
eventName: ‘click’,
colIndex: 1,
fn: function() { alert(‘你单击了此单元格!’) }
};
var ops = $.extend(deafult, options);
eventName = ops.eventName;
colIndex = ops.colIndex;
fn = ops.fn;
$(“tr:gt(0) td:nth-child(” + colIndex + “)”).bind(eventName, fn);
};
/*给某列绑定单击删除事件*/
/*colIndex–列索引(从1开始)*/
$.fn.deleteRow = function(options) {
var deafult = {
colIndex: 6
};
var ops = $.extend(deafult, options);
var colIndex = ops.colIndex;
$(“tr:gt(0) td:nth-child(” + colIndex + “)”).bind(“click”, function()
{
var obj = $(this).parent(); //获取tr子节点指标
if (confirm(‘您鲜明要删减吗?’))
obj.remove();
});
};
/*机动给钦定列填充序号*/
/*colIndex–列索引(从1开始)*/
$.fn.Identity = function(options) {
var deafult = {
colIndex: 1
};
var ops = $.extend(deafult, options);
var colIndex = ops.colIndex;
var i = 1;
$(“td:nth-child(” + colIndex + “)”).find(‘input’).each(function() {
$(this).attr(‘value’, i)
i++;
});
};
/*赢得关节单元格坐标*/
$.fn.getFocus = function() {
return arrFocus;
};
/*安装要点单元格坐标*/
/*rowIndex–行索引(从1开始);colIndex–列索引(从1开始)*/
$.fn.setFocus = function(options) {
var deafult = {
rowIndex: 2,
colIndex: 1
};
var ops = $.extend(deafult, options);
var rowIndex = ops.rowIndex;
var colIndex = ops.colIndex;
arrFocus[0] = rowIndex;
arrFocus[1] = colIndex;
};
/*当某些单元格中输入数据,按Enter键后自行依照输入的值从后台检索数据填充到该行对应列*/
/*colIndex–第几列输入数据按Enter键触发事件;fn–带参的回调函数*/
$.fn.AutoFillData = function(options) {
colIndex = options.colIndex;
fn = options.fn;
$(“td:nth-child(” + colIndex + “)”).bind(“keyup”, function() {
var obj = $(this).parent(); //获取tr子节点目的
$(this).find(‘input’).each(function() {
if (event.keyCode == 13) {
var vl = $(this).val();
var arr = new Array();
arr = fn(vl);
var i = 0;
obj.find(“td”).each(function() {
$(this).find(“input”).each(function() {
$(this).attr(‘value’, arr[i]);
i++;
});
});
}
});
});
};
/*安装有个别单元格为热点*/
/*rowIndex–行索引(从1开始);colIndex–列索引(从1开始)*/
$.fn.setCellsFocus = function(options) {
var deafult = {
rowIndex: arrFocus[0],
colIndex: arrFocus[1]
};
var ops = $.extend(deafult, options);
var rowIndex = ops.rowIndex;
var colIndex = ops.colIndex;
$(“tr:nth-child(” + rowIndex + “) td:nth-child(” + colIndex +
“)”).each(function() {
$(this).find(‘input’).each(function() {
$(this)[0].focus();
$(this).attr(‘value’, $(this).attr(‘value’));
arrFocus = [];
arrFocus.push(rowIndex);
arrFocus.push(colIndex); //更新宗旨数组值
});
});
};
/*安装有个别单元格文本值为当选状态*/
/*rowIndex–行索引(从1开始);colIndex–列索引(从1开始)*/
$.fn.setCellsSelect = function(options) {
var deafult = {
rowIndex: arrFocus[0],
colIndex: arrFocus[1]
};
var ops = $.extend(deafult, options);
var rowIndex = ops.rowIndex;
var colIndex = ops.colIndex;
$(“tr:nth-child(” + rowIndex + “) td:nth-child(” + colIndex +
“)”).each(function() {
$(this).find(‘input’).each(function() {
$(this)[0].select();
});
});
};
/*有个别单元格添加验证成效*/
/*reg–正则表明式;colIndex–列索引(从1发端);defaultValue–验证退步私下认可给单元格赋值*/
$.fn.validationText = function(options) {
var deafult = {
reg: /^((\d+\.\d{2})|\d+)$/,
colIndex: 2,
defaultValue: 0
};
var ops = $.extend(deafult, options);
var reg = ops.reg;
var colIndex = ops.colIndex;
var defaultValue = ops.defaultValue;
$(“tr:gt(0) td:nth-child(” + colIndex + “)”).each(function() {
$(this).find(‘input’).each(function() {
//验证
$(this).bind(‘blur’, function() {
var vl = $(this).attr(‘value’);
if (!reg.test(vl))
$(this).attr(‘value’, defaultValue);
});
});
});
};
/*获取表格中的值*/
$.fn.getValue = function(options) {
var deafult = {
rowIndex: 0, //行坐标(从2开始)
colIndex: 0 //列坐标(从1开始)
};
var ops = $.extend(deafult, options);
rowIndex = ops.rowIndex;
colIndex = ops.colIndex;
var val = “”;
if (rowIndex == 0) { //获取所有行的数额
$(‘tr:gt(0)’).each(function() {
$(this).find(“td”).each(function() {
$(this).find(“input”).each(function() {
val += $(this).attr(‘value’) + “&”;
});
});
val = val.substring(0, val.length – 1) + “|”;
});
}
else {
if (colIndex == 0) { //获取某行数据
$(‘tr:nth-child(‘ + rowIndex + ‘)’).each(function() {
$(this).find(“td”).each(function() {
$(this).find(“input”).each(function() {
val += $(this).attr(‘value’) + “&”;
});
});
val = val.substring(0, val.length – 1) + “|”;
});
}
else { //获取有个别单元格的值
$(“tr:nth-child(” + rowIndex + “) td:nth-child(” + colIndex +
“)”).each(function() {
$(this).find(‘input’).each(function() {
val += $(this).attr(‘value’);
});
});
}
}
return val;
};
/*某些单元格获取关节后更新难题坐标*/
function CellsFocus() {
var colCount = $(“tr:nth-child(1) td”).size();
//获取每行共有多少个单元格
$(“tr:gt(0) td”).each(function() {
var obj = $(this);
$(this).find(‘input’).each(function() {
$(this).bind(‘focus’, function() {
var cellTotal = $(‘td’).index(obj); //获取某单元格的目录
arrFocus[0] = parseInt(cellTotal / colCount) + 1; //第几行
arrFocus[1] = cellTotal % colCount + 1; //第几列
});
});
});
};
})(jQuery);

怎么着选取图片文件数量

笔者们在监听input[type="file"]change事件时,可以在target当中获得三个files的对象。
该对象为本次上传传入的公文列表集合,一般的话大家取第3个因素正是了。
笔者们得到了3个File项指标指标,接下去正是用Image来接收那几个File对象了。

那边会用到三个浏览器提供的大局对象URLURL提供了二个createObjectURL的方法。
方法接收2个Blob品类的参数,而File则是继承自Blog,所以大家一向传入就足以了。
接下来再利用三个Image目的开始展览吸收就足以了:

$input.addEventListener(‘change’, ({target: {files: [file]}}) => {
let $img = new Image() $img.addEventListener(‘load’, _ => {
console.log(‘we got this image’) }) $img.src = URL.createObjectURL(file)
})

1
2
3
4
5
6
7
8
9
$input.addEventListener(‘change’, ({target: {files: [file]}}) => {
  let $img = new Image()
 
  $img.addEventListener(‘load’, _ => {
    console.log(‘we got this image’)
  })
 
  $img.src = URL.createObjectURL(file)
})

MDN关于URL.createObjectURL的介绍

什么样吸收图片文件数量

我们在监听input[type="file"]change事件时,可以在target里头得到2个files的对象。
该目的为本次上传传入的文书列表集合,一般的话大家取第叁个因素就是了。
我们得到了二个File品种的指标,接下去便是用Image来接收这一个File对象了。

那边会用到1个浏览器提供的大局对象URLURL提供了一个createObjectURL的方法。
方法接收2个Blob品类的参数,而File则是继承自Blog,所以大家平昔传入就足以了。
接下来再利用三个Image目的开展吸收就足以了:

$input.addEventListener('change', ({target: {files: [file]}}) => {
  let $img = new Image()

  $img.addEventListener('load', _ => {
    console.log('we got this image')
  })

  $img.src = URL.createObjectURL(file)
})

 

MDN关于URL.createObjectURL的介绍

 

getData.ashx

经过canvas获取大家想要的数码

canvas能够一贯渲染图片到画布中,能够是四个Image对象、HTMLImageElement及越来越多媒体相关的价签对象。
因而大家上面会把数量暂存到八个Image对象中去。
大家在调用drawImage时索要传入xywidthheight八个参数,前三个自然是0了,关于后面八个本性,正好当我们的Image指标加载成功后,直接读取它的widthheight即使真性的数目:

let context = $canvas.getContext(‘2d’) $img.addEventListener(‘load’, _
=> { context.drawImage($img, 0, 0, $img.width, $img.height) })

1
2
3
4
let context = $canvas.getContext(‘2d’)
$img.addEventListener(‘load’, _ => {
  context.drawImage($img, 0, 0, $img.width, $img.height)
})

当大家把图纸渲染至canvas后,我们得以调用另二个API获取rgba连锁的数量。

经过canvas获取大家想要的数码

canvas能够从来渲染图片到画布中,能够是二个Image对象、HTMLImageElement及愈多媒体相关的竹签对象。
之所以大家上面会把多少暂存到1个Image对象中去。
咱俩在调用drawImage时索要传入xywidthheight多个参数,前两个肯定是0了,关于前边几个天性,正好当大家的Image目的加载成功后,直接读取它的widthheight不畏实事求是的数目:

let context = $canvas.getContext('2d')
$img.addEventListener('load', _ => {
  context.drawImage($img, 0, 0, $img.width, $img.height)
})

 

当大家把图纸渲染至canvas后,大家得以调用另一个API获取rgba连锁的数量。

  DataGrid控件被规划来减弱开销时间和须要开发商并未一定的文化。它是轻量级的和成效丰裕的。合并单元格,多列标题,冻结列和页脚是仅局地多少个特点。

复制代码 代码如下:

getImageData

大家调用getImageData会回到如下几个参数:

  1. data
  2. width
  3. height

data为贰个数组,每相邻的多少个成分为叁个像素点的rgba描述。
一个类似那样结构的数组:[r, g, b, a, r, g, b, a]

MDN关于context.drawImage的介绍
MDN关于context.getImageData的介绍

getImageData

作者们调用getImageData会回到如下多少个参数:

  1. data
  2. width
  3. height

data为三个数组,每相邻的多个要素为3个像素点的rgba描述。
2个好像那样结构的数组:[r, g, b, a, r, g, b, a]

MDN关于context.drawImage的介绍
MDN关于context.getImageData的介绍

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace table
{
/// <summary>
/// $codebehindclassname$ 的摘要表达
/// </summary>
[WebService(Namespace = “]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class getData : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.Clear();
string value = GetResult();
context.Response.Write(value);
context.Response.End();
}
private string GetResult()
{
string result = string.Empty;
result = @”
[{“”id””:””1″”,””Name””:””绿茶””,””Code””:””1371″”,””Units””:””斤””,””Price””:””200″”},
{“”id””:””2″”,””Name””:””红茶””,””Code””:””1372″”,””Units””:””斤””,””Price””:””300″”},
{“”id””:””3″”,””Name””:””茶具””,””Code””:””1373″”,””Units””:””台””,””Price””:””20000″”},
{“”id””:””4″”,””Name””:””铁观音””,””Code””:””1374″”,””Units””:””瓶””,””Price””:””400″”},
{“”id””:””5″”,””Name””:””袋泡茶””,””Code””:””1375″”,””Units””:””盒””,””Price””:””500″”},
{“”id””:””6″”,””Name””:””茶食品””,””Code””:””1376″”,””Units””:””盒””,””Price””:””400″”},
{“”id””:””7″”,””Name””:””包装袋””,””Code””:””1377″”,””Units””:””盒””,””Price””:””100″”}]”;
return result;
}
public bool IsReusable
{
get
{
return false;
}
}
}
}

处理rgba数据并转移为box-shadow

在上方大家得到了2个一维数组,接下去就是将它处理为更客观的构造。
P.S. 一维数组是从左到右从上到下排列的,而不是从上到下从左到右

作者们能够发现,widthheight相乘正好是data数组的length
而数组的一一则是先遵照x轴实行充实的,所以我们如此处理获得的多少:

function getRGBA (pixels) { let results = [] let {width, height, data}
= pixels for (let i = 0; i < data.length / 4; i++) { results.push({
x: i % width | 0, y: i / width | 0, r: data[i * 4], g: data[i * 4 +
1], b: data[i * 4 + 2], a: data[i * 4 + 3] }) } return results }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function getRGBA (pixels) {
  let results = []
  let {width, height, data} = pixels
  for (let i = 0; i < data.length / 4; i++) {
    results.push({
      x: i % width | 0,
      y: i / width | 0,
      r: data[i * 4],
      g: data[i * 4 + 1],
      b: data[i * 4 + 2],
      a: data[i * 4 + 3]
    })
  }
 
  return results
}

我们将length除以4作为循环的最大尺寸,然后在变化各类像素点的叙说时
由此当前下标对图纸宽度取余获得当前像素点在图片中的x轴下标
透过当前下标对图纸宽度取商获得当前像素点在图纸中的y轴下标
再便是塞入rgba多少个值,那样我们就会获得2个看似那样结构的多寡:

[{ x: 0, y: 0, r: 255, g: 255, b: 255, a: 255 }]

1
2
3
4
5
6
7
8
[{
  x: 0,
  y: 0,
  r: 255,
  g: 255,
  b: 255,
  a: 255
}]

拍卖rgba数据并转移为box-shadow

在上边大家得到了一个一维数组,接下去正是将它处理为更合理的社团。
P.S. 一维数组是从左到右从上到下排列的,而不是从上到下从左到右

咱俩得以窥见,widthheight相乘正好是data数组的length
而数组的各类则是先依据x轴进行追加的,所以大家如此处理获得的数码:

function getRGBA (pixels) {
  let results = []
  let {width, height, data} = pixels
  for (let i = 0; i < data.length / 4; i++) {
    results.push({
      x: i % width | 0,
      y: i / width | 0,
      r: data[i * 4],
      g: data[i * 4 + 1],
      b: data[i * 4 + 2],
      a: data[i * 4 + 3]
    })
  }

  return results
}

 

我们将length除以4作为循环的最大尺寸,然后在扭转每一个像素点的叙说时
由此当前下标对图纸宽度取余获得当前像素点在图片中的x轴下标
透过当前下标对图纸宽度取商获得当前像素点在图片中的y轴下标
再便是塞入rgba两个值,那样大家就会获得1个接近这样结构的数码:

[{
  x: 0,
  y: 0,
  r: 255,
  g: 255,
  b: 255,
  a: 255
}]

 

 

style2.css

将数据生成为box-shadow格式的多少

box-shadow是支持多组属性的,两组属性之间接纳,拓展剪切。
之所以,大家获得下边包车型客车多少今后,直接遍历拼接字符串就能够生成大家想要的结果:

let boxShadow = results.map(item => `${item.x}px ${item.y}px
rgba(${item.r}, ${item.g}, ${item.b}, ${item.a})` ).join(‘,’)

1
2
3
let boxShadow = results.map(item =>
  `${item.x}px ${item.y}px rgba(${item.r}, ${item.g}, ${item.b}, ${item.a})`
).join(‘,’)

效果图:
澳门葡京 1

即使如此就做出来了,但是对浏览器来说太不友善了。因为是每二个像素点对应的三个box-shadow属性。
奇异的童鞋能够选拔F12检查成分查看该div(反正苹果本是扛不住)
所以为了我们能够健康使用F12,大家下一步的操作正是统一相邻同色值的box-shadow,减少box-shadow属性值的数目。

将数据生成为box-shadow格式的数码

box-shadow是永葆多组属性的,两组属性之间采取,进行划分。
由此,大家获得上面的数码未来,直接遍历拼接字符串就能够生成我们想要的结果:

let boxShadow = results.map(item =>
  `${item.x}px ${item.y}px rgba(${item.r}, ${item.g}, ${item.b}, ${item.a})`
).join(',')

 

效果图:
澳门葡京 2

即便如此就做出来了,可是对浏览器来说太不谐和了。因为是每三个像素点对应的二个box-shadow属性。
咋舌的童鞋可以选取F12检查成分查看该div(反正苹果本是扛不住)
故而为了大家能够健康使用F12,大家下一步的操作就是统一相邻同色值的box-shadow,减少box-shadow属性值的数据。

 

复制代码 代码如下:

联合相邻的单元格

固然图片只怕是由种种颜色不规则的组合而成,但到底依然会有无数是重复颜色的。
据此我们要总括出某一种颜色可统一的最大面积。
本着某一种颜色,用表格表示大概是那般的:
澳门葡京 3
就如在图中所示,大家最优异的合并格局应该是如此的 (radius的取值意味着大家只可以设置1个星型)
澳门葡京 4
于是。。假若计算出来这一块面积就变成了三个难点-.-

当下的思绪是,将数组转换为二维数组,而不是然则的在指标中用xy标识。
据此,大家对拍卖数组的函数实行如下修改:

function getRGBA (pixels) { let results = [] let {width, height, data}
= pixels for (let i = 0; i < data.length / 4; i++) { let x = i %
width | 0 let y = i / width | 0 let row = results[y] = results[y] ||
[] row[x] = { rgba: `${data.slice(i * 4, i * 4 + 4)}` //
为了有利于后续的相持统一同样颜色,直接再次回到二个字符串 } } return results }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function getRGBA (pixels) {
  let results = []
  let {width, height, data} = pixels
  for (let i = 0; i < data.length / 4; i++) {
    let x = i % width | 0
    let y = i / width | 0
    let row = results[y] = results[y] || []
    row[x] = {
      rgba: `${data.slice(i * 4, i * 4 + 4)}` // 为了方便后续的对比相同颜色,直接返回一个字符串
    }
  }
 
  return results
}

此时大家就能博得3个比照xy排列的二维数组,下一步的操作就是以任意点为原点,进行匹配周围的cell
参照上面包车型大巴表格示例,咱们会获得三个类似那样的数据 (仅作示范)

[ [1, 1, 1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1], [1, 1, 1, 1, 1],
[1, 1, 1, 1], [1, 1], [1, 1, 1, 1, 1, 1], ]

1
2
3
4
5
6
7
8
9
[
  [1, 1, 1, 1, 1, 1],
  [1, 1, 1, 1],
  [1, 1, 1],
  [1, 1, 1, 1, 1],
  [1, 1, 1, 1],
  [1, 1],
  [1, 1, 1, 1, 1, 1],
]

集合相邻的单元格

虽说图片也许是由各个颜色不规则的组合而成,但究竟照旧会有成百上千是双重颜色的。
为此大家要总计出某一种颜色可统一的最大面积。
本着某一种颜色,用表格表示大概是那般的:
澳门葡京 5
仿佛在图中所示,大家最卓越的合并格局应该是如此的 (radius的取值意味着大家只能设置2个圆锥形)
澳门葡京 6
于是乎。。如若总括出来这一块面积就成为了三个标题-.-

时下的思路是,将数组转换为二维数组,而不是仅仅的在目的中用xy标识。
为此,我们对处理数组的函数实行如下修改:

function getRGBA (pixels) {
  let results = []
  let {width, height, data} = pixels
  for (let i = 0; i < data.length / 4; i++) {
    let x = i % width | 0
    let y = i / width | 0
    let row = results[y] = results[y] || []
    row[x] = {
      rgba: `${data.slice(i * 4, i * 4 + 4)}` // 为了方便后续的对比相同颜色,直接返回一个字符串
    }
  }

  return results
}

 

那儿我们就能博取三个依照xy排列的二维数组,下一步的操作正是以任意点为原点,举行匹配周围的cell
参照上面的表格示例,大家会得到二个类似那样的数据 (仅作示范)

[
  [1, 1, 1, 1, 1, 1],
  [1, 1, 1, 1],
  [1, 1, 1],
  [1, 1, 1, 1, 1],
  [1, 1, 1, 1],
  [1, 1],
  [1, 1, 1, 1, 1, 1],
]

 

 

/* ———- 页面样式定义 ———- */
body
{
background-color:#ffffff;
MARGIN:0px;
font-size: 10pt; /* 字体大小 */
font-family:Verdana; /* 字体名称 */
}
/* ———- 文字链接 - 链接的一般状态 ———- */
A:link {
color: #0000FF;
TEXT-DECORATION: none;}
/* ———- 文字链接 - 已被访问链接 ———- */
A:visited {
COLOR: #0000FF;
TEXT-DECORATION: none}
/* ———- 文字链接 - 处于活动状态链接 ———- */
A:active {
COLOR: #澳门葡京,3333ff;
TEXT-DECORATION: none}
/* ———- 文字链接 - 指针在链接上 ———- */
A:hover {
COLOR: #ff0000;
text-decoration: underline;}
/* ———- 表格样式1(普通表格) ———- */
.tablestyle1{
font-size: 9pt; /* 表格内字体大小 */
width: 100%; /* 表格宽度 */
border: 0px none; /* 表格边框宽度 */
background-color: #0077B2; /* 表格线颜色 */
cellSpacing:expression(this.cellSpacing=1); /* 五个单元格之间的离开
*/
cellPadding:expression(this.cellPadding=3); }
.TableData {
BACKGROUND: #FFFFFF;
FONT-SIZE: 10pt;
}

得到可统一的最大半径

当下选用的是递归的法门,从0,0原点处初阶物色,获取当前原点的色值,然后与周围展开比较,获取四个最大半径的长方形:

/** * 依照给定范围取得匹配当前节点的正方形 * @param {Array} matrix
二维矩阵数组 * @param {Object} tag 当前要合营的节点 * @param {Number}
[startRowIndex=0] 开首的行下标,暗许为1 * @param {Number}
[startColIndex=0] 早先的列下标,暗中同意为1 * <a
href=”;
{Number} 再次回到贰个一点都不大范围 */ function range (matrix, tag, startRowIndex
= 0, startColIndex = 0) { let results = [] rows: for (let rowIndex =
startRowIndex; rowIndex < matrix.length; rowIndex++) { let row =
matrix[rowIndex] for (let colIndex = startColIndex; colIndex <
row.length; colIndex++) { let item = row[colIndex] if (item.rgba !==
tag.rgba) { if (colIndex === startColIndex) { break rows //
这几个代表在某一行的率先列就合作失败了,没有供给再拓展持续的拾壹分,直接`break`到最外层
} else { results.push(colIndex – startColIndex) break //
将眼下下标放入集合,终止当前循环 } } else if (colIndex === row.length –
1) { results.push(colIndex – startColIndex) //
那里表示一整行都得以与当下元素匹配 } } } //
对富有的x、y轴的值实行相比获取最小的值 let count = Math.min.apply(Math,
[results.length].concat(results)) return count }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
* 根据给定范围获取匹配当前节点的正方形
* @param  {Array}  matrix            二维矩阵数组
* @param  {Object} tag               当前要匹配的节点
* @param  {Number} [startRowIndex=0] 开始的行下标,默认为1
* @param  {Number} [startColIndex=0] 开始的列下标,默认为1
* <a href="http://www.jobbole.com/members/wx1409399284">@return</a> {Number}                   返回一个最小范围
*/
function range (matrix, tag, startRowIndex = 0, startColIndex = 0) {
  let results = []
  rows:
  for (let rowIndex = startRowIndex; rowIndex < matrix.length; rowIndex++) {
    let row = matrix[rowIndex]
    for (let colIndex = startColIndex; colIndex < row.length; colIndex++) {
      let item = row[colIndex]
 
      if (item.rgba !== tag.rgba) {
        if (colIndex === startColIndex) {
          break rows
          // 这个表示在某一行的第一列就匹配失败了,没有必要再进行后续的匹配,直接`break`到最外层
        } else {
          results.push(colIndex – startColIndex)
          break
          // 将当前下标放入集合,终止当前循环
        }
      } else if (colIndex === row.length – 1) {
        results.push(colIndex – startColIndex)
        // 这里表示一整行都可以与当前元素匹配
      }
    }
  }
 
  // 对所有的x、y轴的值进行比较获取最小的值
  let count = Math.min.apply(Math, [results.length].concat(results))
 
  return count
}

函数会从源点开首按梯次遍历全体的要素,在蒙受不一致盟的节点后,就会break进去下次轮回,并将眼下的下标存入数组中。
在遍历达成后,大家将数组全部的item以及数组的长度(能够认为是y轴的值)一同放入Math.min得到三个细小的值。
本条小小的值就是大家以近来节点为原点时能够生成的最大范围的长方形了。
P.S. 这么些总计格局并不是很好,还不够利索

获取可统一的最大半径

脚下利用的是递归的办法,从0,0原点处起先查找,获取当前原点的色值,然后与周围展开对比,获取3个最大半径的星型:

/**
 * 根据给定范围获取匹配当前节点的正方形
 * @param  {Array}  matrix            二维矩阵数组
 * @param  {Object} tag               当前要匹配的节点
 * @param  {Number} [startRowIndex=0] 开始的行下标,默认为1
 * @param  {Number} [startColIndex=0] 开始的列下标,默认为1
 * @return {Number}                   返回一个最小范围
 */
function range (matrix, tag, startRowIndex = 0, startColIndex = 0) {
  let results = []
  rows:
  for (let rowIndex = startRowIndex; rowIndex < matrix.length; rowIndex++) {
    let row = matrix[rowIndex]
    for (let colIndex = startColIndex; colIndex < row.length; colIndex++) {
      let item = row[colIndex]

      if (item.rgba !== tag.rgba) {
        if (colIndex === startColIndex) {
          break rows
          // 这个表示在某一行的第一列就匹配失败了,没有必要再进行后续的匹配,直接`break`到最外层
        } else {
          results.push(colIndex - startColIndex)
          break
          // 将当前下标放入集合,终止当前循环
        }
      } else if (colIndex === row.length - 1) {
        results.push(colIndex - startColIndex)
        // 这里表示一整行都可以与当前元素匹配
      }
    }
  }

  // 对所有的x、y轴的值进行比较获取最小的值
  let count = Math.min.apply(Math, [results.length].concat(results))

  return count
}

 

函数会从起源初始按顺序遍历全体的因素,在际遇不匹配的节点后,就会break进入下次循环,并将近期的下标存入数组中。
在遍历完成后,大家将数组全数的item以及数组的长短(能够认为是y轴的值)一同放入Math.min取得三个微小的值。
本条非常的小的值正是大家以近期节点为原点时能够转移的最大范围的星型了。
P.S. 这一个计算情势并不是很好,还不够利索

[依赖于]

是因为不知道怎么上传文件 所以只能把代码贴出来 请各位见谅!!!

递归总括剩余面积

因为下边也只是联合了四个正方形,还会剩下好多面积没有被查看。
据此大家用递归的措施来总计剩余面积,在率先次匹配甘休后,是大体那些样子的:
澳门葡京 7

故此大家在递归处拆分出了两块会有双重数据的面积:
澳门葡京 8澳门葡京 9

以及后来的递归也是参考那个样子来的,那样能保证拥有的节点都会被照顾到,不会井底之蛙。(如若有更好的措施,求回复)。

那样合营着如今拿到的半径数据,很自在的就能够组建出合并后的汇集,下一步就是将其渲染到DOM中了。

递归计算剩余面积

因为下面也只是联合了3个星型,还会剩下好多面积没有被翻动。
之所以大家用递归的不二法门来计量剩余面积,在第二遍匹配截止后,是大致这一个样子的:
澳门葡京 10
从而大家在递归处拆分出了两块会有再度数据的面积:

澳门葡京 11 澳门葡京 12

以及之后的递归也是参考这一个样子来的,那样能担保全体的节点都会被照顾到,不会管窥之见。(如若有更好的不二法门,求回复)。

诸如此类合作着前方得到的半径数据,很轻松的就能够组建出合并后的集结,下一步即是将其渲染到DOM中了。

 

你可能感兴趣的篇章:

  • jQuery达成表格行和列的动态增加与删除方法【测试可用】
  • 原生JS和JQuery动态拉长、删除表格行的措施
  • JQuery动态拉长和删除表格行的格局
  • JQuery实现表格动态扩张行并对新行添加事件
  • 基于jQuery的动态表格插件
  • JQuery
    Ajax动态生成Table表格
  • Jquery
    动态循环输出表格具体方法
  • jquery动态扩张删除表格行的小例子
  • jQuery完成html表格动态增进新行的方法
  • Jquery
    动态变化表格示例代码
  • jQuery实现的差不离动态拉长、删除表格效能示例

渲染到box-shadow中

当今我们曾经获得了想要的数额,关于转变box-shadow属性处大家也要举办部分改动,在此以前因为是1个像素对应1个属性值,可是未来做了有的集合,所以,生成属性值的操作大概是这么些样子的:

$output.style.boxShadow = results.map(item => `${item.x}px
${item.y}px 0px ${item.radius}px rgba(${item.target.rgba})` ).join(‘,’)

1
2
3
$output.style.boxShadow = results.map(item =>
  `${item.x}px ${item.y}px 0px ${item.radius}px rgba(${item.target.rgba})`
).join(‘,’)

P.S. xy的值要求求丰硕半径的值,不然会出现错位,因为box-shadow是从主题开端渲染的,而不是左上角

渲染到box-shadow中

今昔我们曾经获得了想要的多寡,关于变更box-shadow属性处大家也要开始展览局地改动,在此之前因为是多个像素对应3个属性值,但是以后做了一部分联合,所以,生成属性值的操作差不多是其一样子的:

$output.style.boxShadow = results.map(item =>
  `${item.x}px ${item.y}px 0px ${item.radius}px rgba(${item.target.rgba})`
).join(',')

P.S. xy的值必须求加上半径的值,不然会现出错位,因为box-shadow是从大旨发轫渲染的,而不是左上角

panel

姣好后的服从相比较

原图&三种达成格局的效应比较:
澳门葡京 13

大家拿合并前后变化的CSS存为了文件,并查阅了文件大小,效果在有的背景不是太复杂的图样上依然很鲜明的,减弱了2/3反正的体量。
假如将rgba替换为hex,还会再小一些
澳门葡京 14

近来再开始展览检查成分不会崩溃了,可是照旧会卡:)

形成后的效益相比较

原图&三种达成格局的法力比较:
澳门葡京 15

我们拿合并前后变化的CSS存为了文本,并查看了文件大小,效果在一部分背景不是太复杂的图形上依旧很显眼的,裁减了2/3左右的体量。
要是将rgba替换为hex,还会再小片段
澳门葡京 16

明日再进行检讨成分不会崩溃了,不过依旧会卡:)

resizable

参考资料

  • box-shadow
  • drawImage
  • getImageData
  • createObjectURL

    1 赞 收藏
    评论

澳门葡京 17

参考资料

  • box-shadow
  • drawImage
  • getImageData
  • createObjectURL

linkbutton

pagination

 

[应用实例]

在HTML标签中,从现有的要素创立表成分、定义列、行中的数据:

 

复制代码

 1 <table class=”easyui-datagrid”>  

 2     <thead>  

 3         <tr>  

 4             <th data-options=”field:’code'”>Code</th>  

 5             <th data-options=”field:’name'”>Name</th>  

 6             <th data-options=”field:’price'”>Price</th>  

 7         </tr>  

 8     </thead>  

 9     <tbody>  

10         <tr>  

11            
<td>001</td><td>name1</td><td>2323</td>
 

12         </tr>  

13         <tr>  

14            
<td>002</td><td>name2</td><td>4612</td>
 

15         </tr>  

16     </tbody>  

17 </table>  

复制代码

 

 

经过<table>标签创造DataGrid,在table表格里嵌套<th>标签定义。

 

复制代码

 1 <table class=”easyui-datagrid” style=”width:400px;height:250px”  

 2        
data-options=”url:’datagrid_data.json’,fitColumns:true,singleSelect:true”>
 

 3     <thead>  

 4         <tr>  

 5             <th
data-options=”field:’code’,width:100″>Code</th>  

 6             <th
data-options=”field:’name’,width:100″>Name</th>  

 7             <th
data-options=”field:’price’,width:100,align:’right'”>Price</th>
 

 8         </tr>  

 9     </thead>  

10 </table>  

复制代码

 

 

动用Javascript也得以成立DataGrid:

 

1 <table id=”dg”></table>  

复制代码

1 $(‘#dg’).datagrid({   

2     url:’datagrid_data.json’,   

3     columns:[[   

4         {field:’code’,title:’Code’,width:100},   

5         {field:’name’,title:’Name’,width:100},   

6         {field:’price’,title:’Price’,width:100,align:’right’}   

7     ]]   

8 });  

复制代码

 

 

采纳一些参数查询数据:

 

1 $(‘#dg’).datagrid(‘load’, {   

2     name: ‘easyui’,   

3     address: ‘ho’  

4 });  

 

 

转移多少到服务器后,更新从前的多寡:

 

1 $(‘#dg’).datagrid(‘reload’);    // 重新加载当前页的数据 

 

 

[DataGrid 属性]

属性持续自 panel 面板,上边是从 panel 新增的性质列表:

 

名称 类型

描述 默认值

columns
array
DataGrid列的配备对象,越来越多详细请参见列属性。 undefined

frozenColumns
array
相同列的性质,可是这个列会被冷冻在左边。 undefined

fitColumns
boolean
为“true”则自动 展开/减少列的轻重缓急,为了活动填充Grid的宽窄,幸免出现水平滚动条。 false

autoRowHeight
boolean
定义是还是不是基于行的情节设置行高,设置“false”能够增强加载质量。 true

toolbar
array,selector DataGrid面板顶部的 ToolBar
工具条,能够安装的值如下:

1) 1个数组,种种options项是同等的LinkButton。

2) 一个 selector 选择器 指定 ToolBar 工具条。

运用<div>标签定义 ToolBar 工具条:

 

复制代码

 1 $(‘#dg’).datagrid({

 2     toolbar: ‘#tb’

 3 });

 4 <div id=”tb”>

 5   <a href=”#” 

 6       class=”easyui-linkbutton” 

 7       data-options=”iconCls:’icon-edit’,plain:true”></a>

 8   <a href=”#” 

 9       class=”easyui-linkbutton” 

10       data-options=”iconCls:’icon-help’,plain:true”></a>

11 </div>

复制代码

 

 

经过数组定义 ToolBar:

 

复制代码

1 $(‘#dg’).datagrid({

2     toolbar: [{

3         iconCls: ‘icon-edit’,

4         handler: function(){alert(‘edit’)}

5     },’-‘,{

6         iconCls: ‘icon-help’,

7         handler: function(){alert(‘help’)}

8     }]

9 });

复制代码

null

striped
boolean
设置“True”实现各行变色的法力。 false

method
string
那几个方法须求长途数据类型。 post

nowrap
boolean
设置为“True”则将数据展现在一行内,设置为“True”能够加强加载品质。 true

idFieldstring
钦点哪些字段是标识字段。 null

url
string
二个用以请求远程站点的U路虎极光L路径。 null

loadMsg
string
当从远程站点加载数据时,彰显叁个提示音讯。 Processing,
please wait …

pagination
boolean
设置为“True”则在DataGrid底部显示分页工具条按钮。 false

rownumbers
boolean
设置为“True”则展现行数列。 false

singleSelect
boolean
设置为“True”则只同意选拔一行。 false

checkOnSelect
boolean

比方设置为“True”,当用户点击一行时 选中/撤销选中 该复选框。

 

若果设置为“False”,当用户准确点击复选框时,选中/裁撤选中 该复选框。

本条特性时1.3本子之后可用的。

 

true

selectOnCheck
boolean

假若设置为True,点击复选框将总会选取行。

 

假定设置为False,选中行将不会中选该复选框。

本条本性在1.3本子后可用。

 

true

pagePosition
string
定义分页工具条的岗位,有效值是:’top’,’bottom’,’both’。

那个特性在1.3本子后可用。 bottom

pageNumber
number
当设置分页的属性时,起头化页面数量。 1

pageSize
number
当设置分页属性时,开头化页面大小。 10

pageList
array
当设置分页属性时,开头化页面大小选拔列表、
[10,20,30,40,50]

queryParams
object
当请求远程数据时,附带发送额外的参数。

代码示例:

 

1 $(‘#dg’).datagrid({

2     queryParams: {

3         name: ‘easyui’,

4         subject: ‘datagrid’

5     }

6 });

{}

sortName
string
定义哪些列能够被排序。 null

sortOrder
string
定义列的排序方式,只好是升序“asc”或降序“desc”。 asc

remoteSort
boolean
定义是或不是接受来自远程服务器的排序数据。 true

showHeader
boolean
定义是还是不是出示行的页眉。 true

showFooter
boolean
定义是或不是出示行的页脚。 false

scrollbarSize
number
滚动条的款(当是垂直滚动条时) 只怕 高(当是水平滚动条的时候) 18

rowStyler
function
再次回到例如 ‘background:red’ 一样的风骨样式,这些措施带三个参数:

rowIndex: 行的下标索引,从0开首

rowData: 符合记录数的行

代码示例:

 

复制代码

1 $(‘#dg’).datagrid({

2     rowStyler: function(index,row){

3         if (row.listprice>80){

4             return ‘background-color:#6293BB;color:#fff;’;

5         }

6     }

7 });

复制代码

 

loader
function

概念怎样从远程服务器加载数据,重临“false”能够告一段落这一个请求。

 

本条函数要求以下参数:

param: 向远程服务器传递的参数对象。

success(data): 那一个回调函数会在搜索数据成功后调用。

error(): 那一个函数会在物色数据战败时调用。

 

json loader

loadFilter
function

呈现重临过滤后的数额。那个函数带3个参数 ‘data’,它表示原本数据。

 

你能够将原有数据源更改为正式的数量格式。

 

其一函数必须重回二个饱含“total”和“rows”属性的正规数据对象。

 

代码示例:

 

复制代码

 1 // 从 ASP.NET Web Service Json 输出中去除“d”对象

 2 $(‘#dg’).datagrid({

 3     loadFilter: function(data){

 4         if (data.d){

 5             return data.d;

 6         } else {

 7             return data;

 8         }

 9     }

10 });

复制代码

 

editors
object
定义编辑行时的编辑器。 predefined editors

view
object
定义DataGrid的View视图。 default view

 

 

 

 

 

 

 

[列属性]

DataGrid的列是2个数组对象,它的因素也是二个数组。元素的因素数组是3个布局对象,它定义了每一列的字段。

 

 

 

代码示例:

 

复制代码

 1 columns:[[   

 2     {field:’itemid’,title:’Item
ID’,rowspan:2,width:80,sortable:true},   

 3     {field:’productid’,title:’Product
ID’,rowspan:2,width:80,sortable:true},   

 4     {title:’Item Details’,colspan:4}   

 5 ],[   

 6     {field:’listprice’,title:’List
Price’,width:80,align:’right’,sortable:true},   

 7     {field:’unitcost’,title:’Unit
Cost’,width:80,align:’right’,sortable:true},   

 8     {field:’attr1′,title:’Attribute’,width:100},   

 9     {field:’status’,title:’Status’,width:60}   

10 ]]  

复制代码

名称
类型
描述
默认值

title
string
列的标题文本。 undefined

田野先生string
列的字段名称。 undefined

width
number
列的幅度,假诺没有定义,宽度将会活动扩张以包容其剧情。 undefined

rowspan
number
表示应该占据多少行。 undefined

colspan
number
表示应当占据多少列。 undefined

align
string
代表什么排列对齐列数据,能够用的值有:’left’,’right’,’center’。 undefined

sortable
boolean
设置为“True”则钦点列能够排序。 undefined

resizable
boolean
设置为“True”则能够调动列的尺寸。 undefined

hidden
boolean
设置为“True”则隐藏列。 undefined

checkbox
boolean
设置为“True”则显得多个复选框,该复选框有定位的增幅。 undefined

formatter
function
单元格格式化的函数,带有八个参数:

value: 字段值

rowData: 行数据记录

rowIndex: 行下标

代码示例:

 

复制代码

 1 $(‘#dg’).datagrid({

 2     columns:[[

 3         {field:’userId’,title:’User’, width:80,

 4             formatter: function(value,row,index){

 5                 if (row.user){

 6                     return row.user.name;

 7                 } else {

 8                     return value;

 9                 }

10             }

11         }

12     ]]

13 });

复制代码

undefined

styler
function
单元格样式函数,再次来到例如 ‘background:red’
一样的用户自定义的体制字符串。这几个函数带有多少个参数:

value: 字段值

rowData: 行数据记录

rowIndex: 行下标

代码示例:

 

复制代码

 1 $(‘#dg’).datagrid({

 2     columns:[[

 3         {field:’listprice’,title:’List Price’, width:80,
align:’right’,

 4             styler: function(value,row,index){

 5                 if (value < 20){

 6                     return ‘background-color:#ffee00;color:red;’;

 7                 }

 8             }

 9         }

10     ]]

11 });

复制代码

undefined

sorter
function
用来做一些排序的自定义字段的排序成效,带有七个参数:

a: 第四个字段值

b: 第三个字段值

代码示例:

 

复制代码

 1 $(‘#dg’).datagrid({

 2     remoteSort: false,

 3     columns: [[

 4        
{field:’date’,title:’Date’,width:80,sortable:true,align:’center’,  

 5             sorter:function(a,b){  

 6                 a = a.split(‘/’);  

 7                 b = b.split(‘/’);  

 8                 if (a[2] == b[2]){  

 9                     if (a[0] == b[0]){  

10                         return (a[1]>b[1]?1:-1);  

11                     } else {  

12                         return (a[0]>b[0]?1:-1);  

13                     }  

14                 } else {  

15                     return (a[2]>b[2]?1:-1);  

16                 }  

17             }  

18         }

19     ]]

20 });

复制代码

undefined

editor
string,object
彰显编辑类型,当字符串指明了编制类型,对象涵盖几个天性:

type:
string,编辑的档次,能够是的值:text,textarea,checkbox,numberbox,validatebox,datebox,combobox,combotree.

options: object, 对应于编辑类型的编写器选项。 undefined

 

 

 

 

 

 

 

Editor

重写暗中同意值 $.fn.datagrid.defaults.editors.

 

 

 

每一个 editor 编辑器都有以下行为:

 

名称
参数
描述

init
container, options 早先化 艾德itor 编辑器,并赶回目的对象。

destroy
target
即便有须要则摧毁 艾德itor 编辑器。

getValue
target
从 艾德itor 编辑器获取数据值。

setValue
target , value 设置 艾德itor 编辑器的数据值。

resize
target , width 若是急需则调整 艾德itor 编辑器。

诸如,在艾德itor编辑器中如下概念:

 

复制代码

 1 $.extend($.fn.datagrid.defaults.editors, {   

 2     text: {   

 3         init: function(container, options){   

 4             var input = $(‘<input type=”text”
class=”datagrid-editable-input”>’).appendTo(container);   

 5             return input;   

 6         },   

 7         getValue: function(target){   

 8             return $(target).val();   

 9         },   

10         setValue: function(target, value){   

11             $(target).val(value);   

12         },   

13         resize: function(target, width){   

14             var input = $(target);   

15             if ($.boxModel == true){   

16                 input.width(width – (input.outerWidth() –
input.width()));   

17             } else {   

18                 input.width(width);   

19             }   

20         }   

21     }   

22 });  

复制代码

 

 

 

 

 

[DataGrid View]

重写暗中认可值:$.fn.datagrid.defaults.view.

 

该视图是一个对象,它会报告DataGrid中如何显示行反革命。该指标必须定义了刹那间功力函数:

 

名称
参数
描述

render
target, container, frozen 数据加载时调用。

target: Dom对象,DataGrid对象。

container: 行容器。

frozen: 表示是不是突显冻结容器。

renderFooter
target, container, frozen 那是1个可选的功效,呈现页脚。

renderRow
target, 田野同志s, frozen, rowIndex, rowData
那是贰个可选的意义,函数将会被render调用。

refreshRow
target, rowIndex 定义怎么着刷新内定的行。

onBeforeRender
target, rows
视图Render前触发。

onAfterRender
target
视图在Render后触发。

[事件]

以此日子持续自 panel 面板,一下是DataGrid另增的轩然大波:

 

名称
参数
描述

onLoadSuccess
data
数据加载时接触。

onLoadError
none
当加载远程数据时爆发局地荒谬的时候接触。

onBeforeLoad
param
在四个呼吁加载数据从前接触,假使回去“false”则撤除加载操作。

onClickRow
rowIndex, rowData 当用户点击一行时接触,那一个参数包罗:

rowIndex: 单击行的目录,从0初叶。

rowData: 对应单击的行记录

onDblClickRow
rowIndex, rowData 当用户双击行时触发,那几个参数包含:

rowIndex: 单击行的目录,从0伊始。

rowData: 对应点击的行记录

onClickCell
rowIndex, 田野(field), value 当用户点击单元格时触发。

onDblClickCell
rowIndex, 田野(field), value 当用户双击单元格时触发。

代码示例:

 

复制代码

1 // 当双击2个单元格时,赋予艾德itor编辑器宗旨,以开头编写制定

2 $(‘#dg’).datagrid({

3     onDblClickCell: function(index,field,value){

4         $(this).datagrid(‘beginEdit’, index);

5         var ed = $(this).datagrid(‘getEditor’,
{index:index,field:field});

6         $(ed.target).focus();

7     }

8 });

复制代码

onSortColumn
sort, order
当用户排序一列时接触,那些参数蕴含:

sort: 排序的列的字段名称

order: 排体系的各类

onResizeColumn
田野先生, width
当用户调整列大时辰触发。

onSelect
rowIndex, rowData 当用户挑选一行时接触,那个参数包括:

rowIndex: 采纳行的目录,从0伊始

rowData: 对应着所采纳的行记录

onUnselect
rowIndex, rowData 当用户撤消选用行时触发,那几个参数包蕴:

rowIndex: 撤消选用的行下标,从0发轫

rowData: 对应的吊销选择的行记录。

onSelectAll
rows
当用户采用具有行时触发。

onUnselectAll
rows
当用户撤消选中全体行时触发。

onCheck
rowIndex,rowData 当用户勾选一行时接触,那一个参数蕴含:

rowIndex: 勾选的行下标,从0开端

rowData: 对应着勾选的行记录

其一事件在1.3本子后灵光。

onUncheck
rowIndex,rowData 当用户撤消勾选一行时接触,那个参数包蕴:

rowIndex: 撤废选中的行下标,从0初始

rowData: 撤消选中的行记录

以此事件在1.3本子后生效

onCheckAll
rows
当用户勾选全体行时触发,这一个事件在1.3版本后灵光。

onUncheckAll
rows
当用户打消勾选全部行时触发,那么些事件在1.3本子后生效

onBefore艾德it
rowIndex, rowData 当用户初步编写制定一行时接触,那些参数包括:

rowIndex: 编辑行的下标,从0初叶

rowData: 对应着编辑的行记录

onAfter艾德it
rowIndex, rowData, changes 当用户达成编写制定时触发,那一个参数包涵:

rowIndex: 编辑的行下标,从0开首

rowData: 编辑的行记录

changes: 更改的 字段/值 对。

onCancel艾德it
rowIndex, rowData 当用户撤销编辑一行时接触,这一个参数包罗:

rowIndex: 编辑的行下标,从0起首

rowData: 对应着编辑的行记录

onHeaderContextMenu
e, 田野当DataGrid的题目是右键点击时接触。

onRowContextMenu
e, rowIndex, rowData 当行时右键点击时接触。

[方法]

名称
参数
描述

options
none
重临options选项对象。

getPager
none
重临paper页面对象。

getPanel
none
再次来到panel面板对象、

getColumnFields
frozen
重返列字段。借使冻结设置为true,则冻结列字段再次回到。

代码示例:

1 var opts = $(‘#dg’).datagrid(‘getColumnFields’);    // 获取非冻结列

2 var opts = $(‘#dg’).datagrid(‘getColumnFields’, true); // 获取冻结列

getColumnOption
田野再次来到内定列的选项option设置。

resize
param
做调整,做布局。

load
param

加载并出示在第二页的行,假诺‘param’钦赐了,那么它便会趁着QueryParams属性取代。

 

常备经过传递2个参数做二个查询,那个办法能够改为从服务器加载新数据。

 

1 $(‘#dg’).datagrid(‘load’,{

2     code: ’01’,

3     name: ‘name01’

4 });

reload
param
重新加载行,和“load”方法同样,然则停留在现阶段页面。

reloadFooter
footer
重新加载页脚行,代码示例:

复制代码

 1 // update footer row values and then refresh

 2 var rows = $(‘#dg’).datagrid(‘getFooterRows’);

 3 rows[0][‘name’] = ‘new name’;

 4 rows[0][‘salary’] = 60000;

 5 $(‘#dg’).datagrid(‘reloadFooter’);

 6 

 7 // update footer rows with new data

 8 $(‘#dg’).datagrid(‘reloadFooter’,[

 9     {name: ‘name1’, salary: 60000},

10     {name: ‘name2’, salary: 65000}

11 ]);

复制代码

loading
none
显示加载状态。

loaded
none
隐藏加载状态。

fitColumns
none
使列自动 展开/缩小 以适应网格的大幅。

fixColumnSize
田野同志固定列的大下,假使‘田野同志’参数没有被分配,则兼具列大小都将是定位的。

代码示例:

 

1 $(‘#dg’).datagrid(‘fixColumnSize’, ‘name’);  // 固定‘name’列的高低

2 $(‘#dg’).datagrid(‘fixColumnSize’);  // 固定全部列大小

fixRowHeight
index
固定钦定的行高,即便“index”参数没有分配,则持有行高都将是稳定的。

autoSizeColumn
田野(field)调整列宽度以适应其内容,这么些艺术在1.3版本之后可用。

loadData
data
加载本地数据,旧的行会被剔除。

getData
none
重回加载的多寡。

getRows
none
再次回到当前页的行。

getFooterRows
none
重返页脚行。

getRowIndex
row
再次来到钦点行的目录,row行参数能够是一个行记录或七个id字段值。

getChecked
none
重临复选框被选中的保有行,那么些措施在1.3版本后可用。

getSelected
none
再次来到第一个选定行的笔录或null。

getSelections
none
再次回到全部选定的行,当没有入选记录的时候,将重返三个空数组。

clearSelections
none
清除所有的选料。

selectAll
none
采用当前页面全体的行。

unselectAll
none
撤废选拔当前页面包车型地铁具有行。

selectRow
index
采纳一行,行下标从0开首。

selectRecord
idValue
通过id值参数选中一行。

unselectRow
index
裁撤选中央银行。

checkAll
none
当选当前页面全数行,这些主意从1.3版本之后可用。

uncheckAll
none
撤除选中当前页全体行,那一个方法从1.3版本之后可用。

checkRow
index
选中一行,行下标从0起首,这些点子从1.3版本之后可用。

uncheckRow
index
撤废选中一行,行下标从0初步,该情势从1.3本子之后可用。

begin艾德it
index
先导编辑行。

end艾德it
index
停止编辑行。

cancel艾德it
index
废除编辑行

get艾德itors
index
获得钦命的行编辑器,每一种编辑器具有以下属性:

actions: 该编辑器能够做的action动作,和编辑器定义一样。

target: 指标编辑器的jQuery对象。

田野: 字段名称。

type: 编辑器类型,例如’text’,’combobox’,’datebox’, 等.

get艾德itor
options
拿到钦定的编辑器,该选用包括五个脾气:

index: 行下标索引

田野(field): 字段名称

代码示例:

 

1 // 得到 Date博克斯 编辑器,并且更改它的值

2 var ed = $(‘#dg’).datagrid(‘getEditor’, {index:1,field:’birthday’});

3 $(ed.target).datebox(‘setValue’, ‘5/4/2012’);

refreshRow
index
刷新行。

validateRow
index
验证钦命的行,再次回到“true”时有效。

updateRow
param
更新钦点的行,该参数包括以下属性:

index: 要更新的行下标索引。

row: 新行的数码。

代码示例:

 

复制代码

1 $(‘#dg’).datagrid(‘updateRow’,{

2     index: 2,

3     row: {

4         name: ‘new name’,

5         note: ‘new note message’

6     }

7 });

复制代码

appendRow
row
拼接二个新行,那一个新行将会被追加在终极的职分:

1 $(‘#dg’).datagrid(‘appendRow’,{

2     name: ‘new name’,

3     age: 30,

4     note: ‘some messages’

5 });

insertRow
param

陈设一个新行,该参数包涵以下属性:

index: 要插入新行的下标索引地方,假设没有点名,则在后头拼接新增。

row: 要新增的行数据,

 

代码示例如下:

 

复制代码

1 // 在第③行插入新行

2 $(‘#dg’).datagrid(‘insertRow’,{

3     index: 1,    // index start with 0

4     row: {

5         name: ‘new name’,

6         age: 30,

7         note: ‘some messages’

8     }

9 });

复制代码

deleteRow
index
删除一行。

getChanges
type

得到自从上次交由后的发生更改的行。

 

这么些类型参数指明哪些项目变更了行,只怕的值如下:inserted,deleted,updated,等.

 

当类型参数没有点名时,重回全部变更的行。

 

acceptChanges
none
提交全数的改变,从它被加载恐怕上次 acceptChanges 被调用。

rejectChanges
none
回滚自其成立后具备变更的数量,大概从近日一回 acceptChanges
被调用。

mergeCells
options
合并有些列为二个列,这几个选项包涵以下属性:

index: 行下标

田野: 字段名称

rowspan: 要合并的行数

colspan: 要联合的列数

showColumn
field展现钦点的列。

hideColumn
田野同志隐藏钦命的列。

 

继承自 $.fn.panel.defaults,覆盖暗中认可值
$.fn.datagrid.defaults.
DataGrid控件展现数据以表格的花样提供了拉长的采用,协理排序,组和编排数据…

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website