Filed Under (技术相关) by 刘 鹏 on 10-12-2008
ie6有个bug,css定义的背景图片不被缓存,今天发现a:hover定义了背景图片,只要鼠标在a上挪动一下就会发送一次请求,这是由于图片没有被缓存,于是上网搜索了下,找到了一个解决方案,很简单,代码如下
document.execCommand(‘BackgroundImageCache’, false, true);
这个bug存在于ie7以前的版本,因此可以做一个版本的判断
var userAgent = navigator.userAgent.toLowerCase(),
version = (userAgent.match( /.+(?:rv|it|ra|ie)[/: ]([d.]+)/ ) || [])[1];
if (/msie/.test( userAgent ) && version < 7) {
try {
document.execCommand(‘BackgroundImageCache’, false, true);
} catch(ex) {}
}
参考 http://bokee.shinylife.net/blog/article.asp?id=493
Filed Under (技术相关) by 刘 鹏 on 14-11-2008
最近开发一个JS的RichEdior在IE下遇到了点小麻烦,当我选中编辑区域中一段内容点击工具条上按钮时,编辑区域失去焦点,选中区域也就没了,折腾了一阵后才想起IE下每个可见元素都有OnFocus事件,都能获得焦点,我点击了按钮焦点转移到按钮,导致编辑器blur,后来看niceditor是将工具条所有元素设置了一个unselectable属性等于on,这样元素不但能不可选也没法获取焦点了,代码如下。
<div id="container" >
<div id="toolbar" unselectable="on">this’s toolbar</div>
<div id="editContent">
<iframe src="about:blank" style="border:1px solid #ccc; width:100%"
onload="this.contentWindow.document.designMode=’on’"></iframe>
</div>
</div>
Filed Under (技术相关) by 刘 鹏 on 10-08-2007
//StringBuilder构造函数
function StringBuilder(value)
{
this.strings = new Array();
this.append(value);
}
StringBuilder.prototype = {
length : 0,
append : function (value)
{
if (value)
{
this.strings.push(value);
this.length += value.length
}
},
clear : function ()
{
this.strings.length = 1;
this.length = 0;
},
toString : function ()
{
return this.strings.join("");
}
}
Javascript中执行处理字符串连接效率比较低的,今天在Codeproject发现了一个很有用JS 的类 –StringBuilder ,修改了下发到BLOG 里,其原理是将要连接的字符串push到一个数组里,最后将数组join成一个字符串,这样效率大大提高了大约8倍。以下是使用的DEMO
var sb = new StringBuilder("demo");//创建StringBuilder实例,参数是字符串初始值,可以不写
sb.append("Test1"); //追加一个字符串
sb.append("Test2"); //追加一个字符串
sb.length; //获取字符串的长度
sb.toString(); //返回StringBuilder的字符串
Filed Under (技术相关, 默认分类) by 刘 鹏 on 25-01-2007
最近开发了一个AJAX相册,是一个x2blog4.0相册的功能扩展插件。演示地址是:http://www.19870202.com/album.aspx,补丁包地址http://www.19870202.com/album.rar
安装方法如下:
一、将补丁包中的webboy.dll放在x2blog的bin目录下,然后修改web.config
<httpHandlers>
<add verb="GET" path="UserFiles/*.ashx" type="webboy.ImageHandler, webboy" />
<add verb="POST,GET" path="ajaxHandler.ashx" type="webboy.AjaxHandler, webboy" />
</httpHandlers>
这是添加两个HTTP处理器,ImageHandler是生成缩略图的,因为x2blog上传自动生成的缩略图尺寸不合适(个人感觉),AjaxHandler是用来处理相册的Ajax请求。
二、将补丁包的photo.css放在x2blog的css目录下,再将album.aspx,showPhoto.aspx放在x2blog根目录下,album.js放在js目录下,img目录下的图片copy到x2lbog的img目录下
三、在数据库的album表中加入isDefault,score两个字段的数据库类型均为整型,默认值是0,注意的是以前的记录这些刚加的字段都为空,请手动替换为0,新建一个albumComment表字段和类型如下表。
| 字段名 |
数据类型 |
| id |
自动编号 |
| content |
备注 |
| ip |
文本 |
| date |
日期/时间 |
| author |
文本 |
| parentId |
数字 |
然后建立album 和albumComment的关系,实现联级删除。
Filed Under (技术相关, 默认分类) by 刘 鹏 on 31-08-2006
ASP.NET是微软最新推出的新型体系结构.NET框架的一部分,它为构造新一代动态网站和基于网络的分布式应用提供了强有力的支持。与以前的 Web 开发模型相比,ASP.NET 提供了许多重要的优点例如: 简易性;安全性;可管理性等。而且与基于过程的ASP页面技术相比,面向对象技术在ASP.NET中得到了完全实现。用传统ASP技术建立的Web应用实例中,在页面中同时实现显示,业务逻辑和流程控制,这从工程化的角度考虑,它有许多不足之处。用户界面承担着向用户显示问题模型和与用户进行操作和I/O交互的作用。用户希望保持交互操作界面的相对稳定,但更希望根据需要改变和调整显示的内容和形式。在.NET框架下ASP.NET技术结合MVC设计模式很好地解决了上述问题。
1 MVC设计模式简介
MVC由Trygve Reenskaug提出,首先被应用在SmallTalk-80环境中,是许多交互和界面系统的构成基础。MVC结构是为那些需要为同样的数据提供多个视图的应用程序而设计的,它很好的实现了数据层与表示层的分离。MVC作为一种开发模型,通常用于分布式应用系统的设计和分析中,以及用于确定系统各部分间的组织关系。对于界面设计可变性的需求,MVC(Model-View-Controller)把交互系统的组成分解成模型、视图、控制器三种部件。
视图部件把表示模型数据及逻辑关系和状态的信息以特定形式展示给用户。它从模型获得显示信息,对于相同的信息可以有多个不同的显示形式或视图。
控制器部件是处理用户与软件的交互操作的,其职责是控制提供模型中任何变化的传播,确保用户界面于模型间的对应联系;它接受用户的输入,将输入反馈给模型,进而实现对模型的计算控制,是使模型和视图协调工作的部件。
模型部件保存由视图显示,由控制器控制的数据;它封装了问题的核心数据、逻辑和功能的计算关系,它独立于具体的界面表达和I/O操作。
模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。模型、视图、控制器三者之间的关系和各自的主要功能,如图1所示。
2 MVC设计模式的实现
ASP.NET提供了一个很好的实现这种经典设计模式的类似环境。开发者通过在ASPX页面中开发用户接口来实现视图;控制器的功能在逻辑功能代码(.cs)中实现;模型通常对应应用系统的业务部分。在ASP.NET中实现这种设计而提供的一个多层系统,较经典的ASP结构实现的系统来说有明显的优点。将用户显示(视图)从动作(控制器)中分离出来,提高了代码的重用性。将数据(模型)从对其操作的动作(控制器)分离出来可以让你设计一个与后台存储数据无关的系统。就MVC结构的本质而言,它是一种解决耦合系统问题的方法。
2.1 视图
视图是模型的表示,它提供用户交互界面。使用多个包含单显示页面的用户部件,复杂的Web页面可以展示来自多个数据源的内容,并且网页人员,美工能独自参与这些Web页面的开发和维护。
在ASP.NET下,视图的实现很简单。可以像开发WINDOWS界面一样直接在集成开发环境下通过拖动控件来完成页面开发本。本文中介绍每一个页面都采用复合视图的形式即:一个页面由多个子视图(用户部件)组成;子视图可以是最简单HTML 控件、服务器控件或多个控件嵌套构而成的Web自定义控件。页面都由模板定义,模板定义了页面的布局,用户部件的标签和数目,用户指定一个模板,平台根据这些信息自动创建页面。针对静态的模板内容,如页面上的站点导航,菜单,友好链接,这些使用缺省的模板内容配置;针对动态的模板内容(主要是业务内容),由于用户的请求不同,只能使用后期绑定,并且针对用户的不同,用户部件的显示内容进行过滤。使用由用户部件根据模板配置组成的组合页面,它增强了可重用性,并原型化了站点的布局。
视图部分大致处理流程如下:首先,页面模板定义了页面的布局;页面配置文件定义视图标签的具体内容(用户部件);然后,由页面布局策略类初始化并加载页面;每个用户部件根据它自己的配置进行初始化,加载校验器并设置参数,以及事件的委托等;用户提交后,通过了表示层的校验,用户部件把数据自动提交给业务实体即模型。
这一部分主要定义了WEB页面基类PageBase;页面布局策略类PageLayout,完成页面布局,用于加载用户部件到页面;用户部件基类UserControlBase即用户部件框架,用于动态加载检验部件,以及实现用户部件的个性化。为了实现WEB应用的灵活性,视图部分也用到了许多配置文件例如:置文件有模板配置、页面配置、路径配置、验证配置等。
2.2 控制器
为了能够控制和协调每个用户跨越多个请求的处理,控制机制应该以集中的方式进行管理。因此,为了达到集中管理的目的引入了控制器。应用程序的控制器集中从客户端接收请求(典型情况下是一个运行浏览器的用户),决定执行什么商业逻辑功能,然后将产生下一步用户界面的责任委派给一个适当的视图组件。
用控制器提供一个控制和处理请求的集中入口点,它负责接收、截取并处理用户请求;并将请求委托给分发者类,根据当前状态和业务操作的结果决定向客户呈现的视图。在这一部分主要定义了HttpReqDispatcher(分发者类)、HttpCapture(请求捕获者类)、Controller(控制器类)等,它们相互配合来完成控制器的功能。请求捕获者类捕获HTTP请求并转发给控制器类。控制器类是系统中处理所有请求的最初入口点。控制器完成一些必要的处理后把请求委托给分发者类;分发者类分发者负责视图的管理和导航,它管理将选择哪个视图提供给用户,并提供给分发资源控制。在这一部分分别采用了分发者、策略、工厂方法、适配器等设计模式。
为了使请求捕获者类自动捕获用户请求并进行处理,ASP.NET 提供低级别的请求/响应 API,使开发人员能够使用 .NET 框架类为传入的 HTTP 请求提供服务。为此,必须创作支持 System.Web.IHTTPHandler 接口和实现 ProcessRequest() 方法的类即:请求