IE下CSS的调试器 ,找到很久才找到。和IETester一起使用效果不错,写起CSS来腰不酸,腿不疼了。
1.http://www.debugbar.com/softwaredata/install.exe
2.http://software-files.download.com/sd/jJwvsruhNCiWd0Fb
F0RW5CSb7l8n7zfbJ7t3sKd0_3roKfuQBtMzdG9
6F1yNX5DJVZncwXctf_Uj0cShDO5-b00IncGOa3J
o/software/11094537/1032
3909/3/install.exe?lop=link&ptype=1
901&ontid=12512&siteId=4&e
dId=3&spi=324fd8b49f66d7f38b0d985275
3766fa&pid=11094537&psid=10323909
如果要制作一个相册显示页面,用户上传的图片可能非常大,通常都来自于数码相机拍摄的彩色照片,这些照片都是未经过任何压缩处理的图片,要是上传之后直接显示出来的话可能会非常的慢。于是压缩上传图片的缩略图并呈现列表图片是一个不错的办法。制作缩略图c#.net框架都有已定义好的类,可以直接使用它生成缩略图。
private void setDataImg()
{
string path = Server.MapPath("success.jpg");
string thumbsDir = Server.MapPath("thumbs/");
System.Drawing.Image img;
Bitmap bitmap = new Bitmap(path);
img = bitmap.GetThumbnailImage(100, 100, null, IntPtr.Zero);
img.Save(thumbsDir+"new.jpg",ImageFormat.Jpeg);
Response.ContentType = "image/jpeg";
img.Save(Response.OutputStream, ImageFormat.Jpeg);
Response.End();
img.Dispose();
bitmap.Dispose();
}
上次mymickey利用prototype的方法写过一个表格排序的插件,这次mymickey用jquery也对上一次写排序的插件代码做了一些细化,内部功能也做了一些扩展,增加了扩展名(后缀名)排序的双相选择,可以对后缀名和文件名排序分别制定排序方式;还增加了对表格被选中行排序的功能。
演示请看这里demo;
插件下载
【程序功能】:
- 日期排序、
- 中英文混合数字排序、
- 数据大小排序、
- 数据类型文件类型和扩展名排序、
- 选中行排序。
mymickey谈谈其制作此插件相当于上次遇到的不同情况:
【扩展名排序】:排序之后的对每一行同通类型的文件后缀名进行着色,先要取得每种数据后缀名在表格中被重复的次数
ExtensionName.strongClass
&&strong($(this),previous,this.axis,next)&&arr.push(this.axis);
初始化参数的扩展名属性的强调分类如果被设置,那么会将刷选出来的所有扩展名进行的包装如果列的单元格合法带有相应扩展名,
function strong(o,TagStart,oldText,TagEnd){
return oldText &&
o.html(o.text().replace(oldText,Array.prototype.slice.call(arguments).slice(1).join('')))
}
调用strong函数判断顺便加入需要强调着色的单元格文本。这里现将单元格匹配内容replace()替换成所需内容,以此达到文件扩展名的功能。这一个循环涉及到大量的字符串拼接如果这样做的话定会性能损耗较大<strong>+’string’+</strong>,可以使用通变的方法直接将函数参数转为
数组之后取得所需字符串join()掉便得到了理想中的结果,如果拼接成功将返回对象,那么此字符串压入一个数组,数组将计算出所有被重复过的扩展名的次数,就是对数组的元素计算元素的重复次数的计算,之后对被重复过的这些扩展名进行字母的顺序排序,选取之前数组长度讲被刷选出来的对象压入数组slice刷选出之后被压入的对象进行字母先后序列的排序,由此便得到了每个扩展名被重复的次数。
function OrderExtNum(){
var count = arr.length;
$.each($(arr).Filter(),function(i,v){
arr.push( {} );
arr[arr.length-1][v] = i;
});
return arr.slice(count).sort(function(a,b){
for(var i in a){
for(var j in b)
return -(a[i].localeCompare(b[j]))
}
})
}
$.fn.Filter=function(){
var self = this.get(),o={},result=[];
this.each(
function(index){
if( !o[self[index]] ){
o[self[index]] = 1;
}
else {
o[self[index]]++ ;
}
});
return o;
}
在排序完毕之后遍历数组,jquery自身扩展了一个slice方法用于更方便的dom元素选择,在这里正好可以派上用场。数组的长度这时候正好就是程序中需要着色次数的长度。
var j = 0 ,color = ['03c','060'],
strong = table.find('td:nth-child('+(tableData.CurrentIndex+1)+') '+target+''),;
$.each(arr,function(i){
$.each(arr[i],
function(k,v){
strong.slice(j,parseInt(k)+j).css({color:'#'+color[i%2]});
j+=parseInt(k);
})
})
【选中行排序】:选中行排序在IE6-7中当DOM元素被重新插入表格后如果dom元素中包含checkbox , input元素原来的选中状态会被重置解决办法,mymickey在这里为每个点击后的input元素的父元素添加了一个属性,排序完毕之后重新遍历为input加入选择状态就行了。
function IE6Checked(){
rows.find('td:eq('+(SelectRowOrder.index)+') input')
.each(
function(){
this.checked = parseInt($(this).parent()[0].axis);//IE6下必须被转换为数字//
}
)
}
【过滤掉不需要排序的行】:将当前表格需排序的列转换成为数组,拼接需过滤的数组使用自定义的Filter方法删除掉被重复过的数组元素。
if(NotOrder!=null){
var arr=[],Count=th.length;
filterTh={};
while(Count--)arr.push(Count);
arr = $(NotOrder.concat(arr)).Filter();
Count = arr.length;
while(Count--){filterTh[arr[Count]] = th[arr[Count]]}
}
$.fn.Filter=function(){
var self = this.get(),o={},result=[];
this.each(
function(index){
if( o[self[index]] != self[index] )
o[self[index]] = self[index];
else delete o[self[index]];
});
for(var i in o)
result.push(i);
return result
}
【其他】:在上一次使用prototype方式做的表格排序中每次反向需要把当前的行转换成为数组在调用数组的reverse()方法进行反向,实际上dom对象也可以拥有reverse()方法
Array.prototype.reverse.call(row);
原因是dom对象列表的hash结构和属性完全达到了数组对象的reverse()方法的标准所以这个可以直接使用数组对象的reverse()方法反序。
插件使用说明:文档载入后选择table对象后调用blueTable方法,$(table).blueTable();blutTable支持2个可选参数。
第一个参数为一个对象详细如下:
- 选中行排序参数:SelectRowOrder{index:number},属性为一个对象,index属性为需要排序的列的坐标值 从0算起;
- 扩展名排序参数:
ExtensionName{index:number,extension:stringID,name:stringID,strongClass:CSSClass};
index属性同上。
extension属性为点击后需排序的列中的htmlID,点击后可对此列中文件名称排序;
name属性htmlID,点击后可对此列中文件名称的扩展名排序,以上两个属性为一个HTML标签元素,包含在thead th中(详细请看demo),在文件名排序列中这两个ID必须被设置;
strongClass属性是否对文件扩展名排序后再次对分文件类型分类着色;属性值为字符串,设’ext’的话为文件后缀名分类着色,’font’的话为单元格内所有字符串着色,(mymickey觉得这个东西蛮鸡肋的所以我只设定了2个颜色);
- DataSize参数:index属性同上;
- NotOrder参数:为一个数组,可以过滤掉不需要排序的列,数组元素为不需排序的列的坐标值,
- HighLightColClass参数:属性值为一个字符串,在切换排序列的时候对当前排序的列进行高亮的CLASS,在CSS中申明;
第二个参数为排序完毕之后需要执行的函数,此函数接受两个参数,第一个的当前被排序列的坐标值,第二个为在此之前被排序列的坐标值。
继续阅读 »
最近mymickey在写一个储存过程删除关系表的时候发现sql语句中的in操作符语句竟然无效。
代码如下。
ALTER PROCEDURE deleteTb
@id varchar(50)
AS
delete from Class where 条件=@id;
delete from Board where 条件=@id;
delete from Topic where 条件 in (select Board from tb where ID=@id);
RETURN
原来是把 带有in操作符的语句放在最后面,之后返回的查询条数才2条。也就是as语句顺数下面一二条。讲第三条带有in操作符的语句换到最前面去问题就解决了。
最近在获取sql server数据库的时候,在使用fill方法充填到DataSet容器里时,IDE提示错误:
“System.Data.Common.DataAdapter.Fill(System.Data.DataTable, System.Data.IDataReader)”最匹配的重载方法具有一些无效参数”
mymickey使用的是两个参数重载,adapter.fill(ds,string)。变量声明的时候用的是DataAdapter,但是在new 的时候却是SqlDataAdapter,为什么会出错呢,原因是DataAdapter是属于System.Data.Common命名空间的,而SqlDataAdapter是属于System.Data.SqlClient命名空间的,new的时候并没有报错,充填的时候出错了,真是太大意了。
Foxmarks是firefox的在线书签插件,用户安装之后可以将自己的书签收藏的站点上传到插件提供者的服务器或者自己的服务器上面。最近mymickey收到Foxmarks发来的邮件,提示用户Foxmarks已经改了名字为Xmarks。而且在线Xmarks还提供在搜索站点预览功能,比如说在使用google搜索的时候如果用户搜索的站点被使用Xmarks在线书签插件用户收藏过的话,会在google的旁边出现一个蓝色按钮,鼠标移动上去会出去站点的截图和一些相关信息。非常人性化的功能。而且如果某网站或者博客被其他浏览者用Xmarks收藏了的话还可以在Xmarks的getsiteinof搜索中找到。
今天打开Visual Studio服务器资源管理器,连接到数据库的时候提示”事件日志文件已满”,导致数据库不能被连接,之后打开事件查看器,把里面所有项目的事件全部清除,问题解决。
不久前mymickey写过一次表格排序但是速度太慢。现在又写了一个,性能比上一次那一个好了很多而且支持很多种类型的排序,这一次写的能支持:
- 中文汉字排序、
- 中英文混合排序、
- 数据大小排序、
- 文件类型排序(后缀名排序)
- 日期时间排序、
- 价格排序、
- 中文混合数字排序;
使用方法:文档载入后new tableListSort(arguments,arguments)。
接受两个参数:第一个参数为必须的,可以是字符串ID,也可以是table对象;第二个可选参数,此参数为一个对象,{data:index,fileType:index,fn:function(){}};对象有三个可选的属性,第一个和第二个为扩展排序的数据类型,第三个参数为排序后需要执行的函数;如果表格数据中有需要排序的数据大小,如1KB 1MB 1GB 这样的数据类型的话,可以{data:index};index为表格需排序的某一列的下标值,从0开始计数,如表格的第二列为1KB MB这样的数据类型,{data:2};对象的第二个属性{fileType:index},此扩展排序为文件类型,如xml,jpg,exe这样的后缀名。index同样为列的下标值。
对象的第三个可选属性为一个排序后需执行的函数{fn:function(){执行的代码}}。
HTML代码中必须的元素为:table元素,table元素的第一行必须使用thead元素包含tr,tr中必须包含可点击排序的元素th;thead下一个sibling元素必须为tbody,tbody中需包含tr。排序数据使用td包含,table也可以包含caption和tfoot。
4月 11日, 更新:添加了排序后升序降序的标示图标。
自定义添加class 如果不打算添加 此属性可以为不设置,鼠标样式mymickey在脚本里面加好了不需要CSS添加。
table.Index为上一次被排序过的坐标值;table.Index初始化为null;
fn:fini函数仅为排序过后需要执行的函数,就算没有它也是可以排序的,这里传递一个排序过后需要执行的函数仅仅是为了添加排序down和up的标示图标.
点击这里查看demo
以下的源代码:
继续阅读 »
使用方法:文档载入后执行对象new tab(container,eventType,index,backcall)。container为选项卡对象,可选参数eventType为事件类型(click或者onmouseover),可选参数index初始化显示出来的标签0开始计数,可选函数backcall触发事件之后需要执行的函数。如new tab(“tab”,”click”,2,function(){…})或者new tab(“tab”)。
以下为源代码:demo查看
继续阅读 »
javascript中类与父类之间的继承都是由其prototype对象来链接起来继承的,默认情况下所有的类都继承Object对象,包括自定义对象,Object对象也是所有对象的最顶层对象。但这一点没有什么让人感觉惊艳的,因为大多数编程语言基本都是如此。也可以把prototype认为是所有javascript对象都拥有的一个属性,这个属性帮助对象自身继承创建此对象的构造器或者说是类的原型中所定义的属性成员和方法成员。但是javascript基于prototype的继承不像其他高级语言的继承那么繁琐,javascript的继承显得简约而又简单。
var num=new Number(100);创建一个对象之后立刻调用JS中的预先为我们定义好Number()函数,为Number()函数传递一个参数100,函数启动自身的构造器,初始化一个数字与新建的这个对象关联起来,num变量指向这个对象,同时,这个对象便获取继承到了Nunber()函数预定义好的prototype对象所指向的方法。
函数也是对象,函数也可以拥有方法(函数)和属性,Number.prototype.toFixed();返回toFixed(){…..},明显的JS已经为我们定义好了一个原型,可以拿来直接使用的,那么很自然的由Number函数构造出来的对象也将继承Number函数的prototype定义的方法,num.toFixed(index)证明其确实是这样。
prototype是javascript提供开发人员的一个显式的继承接口,那么自定义对象便有了更多的扩展空间,既然每个对象都拥有了一个显式的prototype,这样大家只要有了构造函数便就有了一直向上延伸的继承链了,Number()函数是预先为开发者定义好的函数,为这个函数定义一个新的prototype这样Number函数那些少得可怜方法就可以由我们自己扩展了,Prototype框架对Number类的扩展的一部分: 继续阅读 »