摘要: 折腾了一天,NHibernate1.2在VS2005下的配置,终于通了,做个简单的备忘吧,以防以后再走弯路。
1、首先,我使用的是单独的配置文件hibernate.cfg.xml,我觉得这样更合理些,比较把那些配置都放在Web.config里更合理点吧,文件内容是这样的:
阅读全文
posted @ 2007-01-24 11:13 HenryZhang 阅读(1413) 评论(6)
编辑
摘要: ASP.NET AJAX中的服务端Timer控件的简单使用
这个例子比较有意思了,如果想弄个网页时钟的话,用这种方式简直易如反掌呀,呵呵
在UpdatePanel中放一个Label和一个Timer,当然,这个Timer是Ajax Extensions中的,双击Timer,添加Tick事件Label1.Text = "Panel refreshed at:" + DateTime.Now.ToLongTimeString();
,好了,运行吧,噢,对,还得设置Timer的Interval,原例中设10000,我设1000,也就是一秒一次了,这才像时钟呀,OK,运行,效果不错
TerryLee在文中还说Timer控件可以作为UpdatePanel的触发器不管是否在UpdatePanel中,没错,我试着把Timer拖出了UpdatePanel,还是能触发,不过嘛,整个页面刷新了
阅读全文
posted @ 2007-01-24 11:12 HenryZhang 阅读(138) 评论(0)
编辑
摘要: 在母版页中使用UpdatePanel控件
这个例子很简单了,在母版页中放一个ScriptManager,注意不要放在ContentPlaceHolder里面,然后在一个Content Page页中,加入一个UpdatePanel,并在UpdatePanel里放一个日历控件,运行显示,点日历控件中的上下月时,页面并没有刷新。
通过Master Page刷新UpdatePanel
这个例子也不难,不过做起来步骤多些:
先在MasterPage里放两个按钮,一个加,一个减
并在MasterPage的Page_Load里加入
ScriptMa
阅读全文
posted @ 2007-01-24 11:11 HenryZhang 阅读(243) 评论(0)
编辑
摘要: 在服务器端自定义异常处理
在页面上放置ScriptManager和UpdatePanel,并在UpdatePanel里放置两个文本框一个标签和一个按钮,用于输入两个数,并计算相除后的结果,按钮的Click事件如下:
阅读全文
posted @ 2007-01-24 11:10 HenryZhang 阅读(138) 评论(0)
编辑
1、首先,在UpdatePanel和UpdateProgress外面放一个Button
<asp:Button ID="Panel1Trigger" runat="server" OnClick="Panel1Trigger_Click" Text="Trigger" />
事件定义如前:
protected void Panel1Trigger_Click(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(3000);
Label1.Text = DateTime.Now.ToString() + " - trigger";
}
2、设置UpdatePanel的Tigger
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Label ID="Label1" runat="server" Text="Panel Rendered"></asp:Label>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Refresh" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Panel1Trigger" />
</Triggers>
</asp:UpdatePanel>
根据例子的步骤,这里实际上是通过设计器设置的Tiggers:
选择UpdatePanel控件,在属性窗口中Triggers属性行单击ellipsis (…)。
创建一个异步更新触发器,并设置控件ID为Panel1Trigger。
3、下面是关键部分,添加脚本:
var prm = Sys.WebForms.PageRequestManager.getInstance();
function CancelAsyncPostBack() {
if (prm.get_isInAsyncPostBack()) {
prm.abortPostBack();
}
}
prm.add_initializeRequest(InitializeRequest);
prm.add_endRequest(EndRequest);
var postBackElement;
function InitializeRequest(sender, args) {
if (prm.get_isInAsyncPostBack()) {
args.set_cancel(true);
}
postBackElement = args.get_postBackElement();
if (postBackElement.id = 'Panel1Trigger') {
$get('UpdateProgress1').style.display = 'block';
}
}
function EndRequest(sender, args) {
if (postBackElement.id = 'Panel1Trigger') {
$get('UpdateProgress1').style.display = 'none';
}
}
以上是例子中的原码,然后就出了一些问题,当然,我也遇到了,一是Sys未定义,开始的解决方案是重装2.0或把var Sys放在function里面,但在这里似乎不实用了,
prm.add_initializeRequest(InitializeRequest);
prm.add_endRequest(EndRequest);
这两名话能放在哪个里面?哪个也不行,最终的解决方法是把段JS放在页面后面,正如阿蒙所说:
“我想你的原因可能是这样:
你的ScriptManager控件放在body中
而你的javascript代码放在了ScriptManager控件之前的位置
因为html是逐行加载的
由于var prm = Sys.PageRequestManager.getInstance();在加载ScriptManager控件的js代码之前就被调用了,所以就出现了Sys未定义的情况
但是如果你把这行代码放在每个function中,或者把整段js代码放在ScriptManager控件之后,就不会出现这个问题了!”
这最终解决了这个问题。
再看看代码的含义:
prm.add_initializeRequest(InitializeRequest);//设置初始化时调用的函数
prm.add_endRequest(EndRequest);//设置请求完毕后调用的函数
if (prm.get_isInAsyncPostBack()) {
args.set_cancel(true);
}//在初始化的时候设置可以取消
$get('UpdateProgress1').style.display//设置进度信息是否显示。
OK 了!
posted @ 2007-01-24 11:09 HenryZhang 阅读(65) 评论(0)
编辑
摘要: 上一篇学习了UpdateProgress,现在看看用JS脚本来控件它。
首先,用JS脚本控制它取消更新
先在UpdateProgress里放一个Html按钮,并设置它的onclick为自己定义的函数,如下:
阅读全文
posted @ 2007-01-24 11:09 HenryZhang 阅读(95) 评论(0)
编辑
摘要: UpdateProgress控件
把例子都做完了,才知道,这个是显示进度用的,英语太差了。
简单应用:
在页面上放置ScriptManager、UpdatePanel、UpdateProgress,在UpdatePanel里添加一个标签和一个按钮,设置相关属性如下:
UpdateProgress的文本:Progress……
阅读全文
posted @ 2007-01-24 11:08 HenryZhang 阅读(416) 评论(0)
编辑
问题终于解决了,先看看我的问题:
var u = window.location.toString();
想把地址栏中的某个参数清除掉,包括&,参数名=参数值,其中,参数值还有可能是汉字
用了这样的方法:
u = u.replace(/&addExJobTitle=(.+)&?/g,'');
查了半天才弄出来的,解释一下:
要替换的参数是:addExJobTitle
“.” (可能是)表示任何字符
“+” 表示匹配一次或多次
后面的“&” 表示该参数的结尾处,因为可能后面还有参数,或没有参数了,所以使用
“?” 表示零次或一次
“/g” 表示全局匹配
posted @ 2007-01-24 11:07 HenryZhang 阅读(154) 评论(0)
编辑
这两天和JS的正则表达式干上了,问题还没解决,先把搜到的有用的东西存一下:
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正则表达式:(^\s*)|(\s*$)(像vbscript那样的trim函数)
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a"
$ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A"
* 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa
+ 匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa
? 匹配前面元字符0次或1次,/ba*/将匹配b,ba
(x) 匹配x保存x在名为$1...$9的变量中
x|y 匹配x或y
{n} 精确匹配n次
{n,} 匹配n次以上
{n,m} 匹配n-m次
[xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符)
[^xyz] 不匹配这个集合中的任何一个字符
[\b] 匹配一个退格符
\b 匹配一个单词的边界
\B 匹配一个单词的非边界
\cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M
\d 匹配一个字数字符,/\d/ = /[0-9]/
\D 匹配一个非字数字符,/\D/ = /[^0-9]/
\n 匹配一个换行符
\r 匹配一个回车符
\s 匹配一个空白字符,包括\n,\r,\f,\t,\v等
\S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/
\t 匹配一个制表符
\v 匹配一个重直制表符
\w 匹配一个可以组成单词的字符
posted @ 2007-01-24 11:07 HenryZhang 阅读(102) 评论(1)
编辑
用编程的方法控制UpdatePanel,先看一个例子,通过ScriptManager的RegisterAsyncPostBackControl()方法注册一个异步提交的控件:
<div>
<asp:ScriptManager ID="sm1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="up1" runat="server">
<ContentTemplate>
<asp:Label ID="lblInfo" runat="server" Text="更新时间:"></asp:Label>
<asp:Label ID="lblTime" runat="server" ForeColor="red"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
<asp:Button ID="btnTest" runat="server" Text="测试" OnClick="btnTest_Click" />
</div>
protected void Page_Load(object sender, EventArgs e)
{
sm1.RegisterAsyncPostBackControl(btnTest);
}
protected void btnTest_Click(object sender, EventArgs e)
{
lblTime.Text = DateTime.Now.ToString();
}
注意,btnTest并没有在UpdatePanel里,而是通过代码里的RegisterAsyncPostBackControl注册地。
再注意,在CLICK事件里只有一句lblTime.Text=.....,而且,UpdatePanel 没有设置UpdateMode,这是我无意之间忘了,没想到效果竟然也对,原例中是这样的
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
void Button1_Click(object sender, EventArgs e)
{
this.Label2.Text = DateTime.Now.ToString();
this.UpdatePanel1.Update();
}
设置了UpdateMode="Conditional",Update方法才管用,两者都设置,程序才能正常运行,为什么?
UpdatePanel还可以嵌套使用,即在一个UpdatePanel的ContentTemplate中还可以放入另一个UpdatePanel。当最外面的UpdatePanel被触发更新时,它里面的子UpdatePanel也随着更新,里面的UpdatePanel触发更新时,只更新它自己,而不会更新外层的UpdatePanel,例子太简单了,不用写了。
同一页面上使用多个UpdatePanel
由于UpdatePanel默认的UpdateMode是Always,如果页面上有一个局部更新被触发,则所有的UpdatePanel都将更新,这是我们不愿看到的,我们只需要UpdatePanel在它自己的触发器触发的时候更新就可以了,所以需要把UpdateMode设置为Conditional。
例子很长,就不粘过来了,核心的地方有以下几点:
1、<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true" />
2、每个UpdatePanel的UpdateMode="Conditional"
3、因为触发服务器事件的控件可能全在其中一个UpdatePanel中,所以,在需要的地方(其它UpdatePanel)使用Triggers来指定当前的UpdatePanel由哪个控件激发。
OK,今天就到这了,感谢TerryLee的教程。
posted @ 2007-01-24 11:06 HenryZhang 阅读(54) 评论(0)
编辑
开始学习UpdatePanel控件,好像是个非常常用的控件。
先看一下基本的结构:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<!---->
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger />
<asp:PostBackTrigger />
</Triggers>
</asp:UpdatePanel>
该控件的强大之处在于不用编写任何客户端脚本,只要在一个页面上添加几个UpdatePanel控件和一个ScriptManager控件就可以自动实现局部更新。
ContenteTemplate标签用来定义UpdatePanel的内容,在它里面可以放任何ASP.NET元素。如果你想要使用编程的手法来控制UpdatePanel中的内容,就需要使用ContenteTemplateContainer
ContenteTemplate太简单了,只需要像平时使用控件一样往里堆就可以了,控件的事件也没有什么特殊的,但是如果要使用编程的手法去设置UpdatePanel中的内容,需要创建一个UpdatePanel,并且添加控件到ContentTemplateContainer,而不能直接添加控件到ContentTemplate,如果想直接设置ContentTemplate,则需要编写一个自定义的Template,并去实现位于System.Web.UI命名空间下的接口ITemplate
看一个使用ContentTemplateContainer的例子:
protected void Page_Load(object sender, EventArgs e)
{
UpdatePanel up1 = new UpdatePanel();
up1.ID = "UpdatePanel1";
up1.UpdateMode = UpdatePanelUpdateMode.Conditional;
Button button1 = new Button();
button1.ID = "Button1";
button1.Text = "Submit";
button1.Click += new EventHandler(Button_Click);
Label label1 = new Label();
label1.ID = "Label1";
label1.Text = "A full page postback occurred.";
up1.ContentTemplateContainer.Controls.Add(button1);
up1.ContentTemplateContainer.Controls.Add(label1);
Page.Form.Controls.Add(up1);
}
protected void Button_Click(object sender, EventArgs e)
{
((Label)Page.FindControl("Label1")).Text = "Panel refreshed at " +
DateTime.Now.ToString();
}
不用多解释了,只要知道创建好控件后,加到ContentTemplateContainer里:)
再来看看Triggers属性:
在ASP.NET AJAX中有两种Triggers:分别为AsyncPostBackTrigger和PostBackTrigger,简单地说,AsyncPostBackTrigger就是异步调用、局部更新,和我们预想的Ajax效果一样,PostBackTrigger就是整个页面都要刷新(还不理解,既然整个页都刷新了,为什么还要用这个:( ),还是看一个例子:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<div>
<asp:Button ID="Button1" runat="server" Text="异步回送" OnClick="Button1_Click"/>
<asp:Button ID="Button2" runat="server" Text="整页回送" OnClick="Button2_Click"/><br />
<br />
<asp:Label ID="Label1" runat="server" Text="当前时间" Font-Bold="True" Font-Size="Large"></asp:Label></div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Button1"/>
<asp:PostBackTrigger ControlID="Button2" />
</Triggers>
</asp:UpdatePanel>
TerryLee的UpdatePanel(一)就到这,咱也先抄到这吧,HOHO!
posted @ 2007-01-24 11:05 HenryZhang 阅读(68) 评论(0)
编辑
/// 除去所有在html元素中标记
public static string striphtml(string strhtml)
{
string stroutput=strhtml;
Regex regex = new Regex(@"<[^>]+>|</[^>]+>");
stroutput = regex.Replace(stroutput,"");
return stroutput;
}
posted @ 2007-01-24 11:03 HenryZhang 阅读(24) 评论(0)
编辑
今天在QQ群里有人发了个不错的方法,以前写这个总觉得麻烦,下面这个确实不错
if (num1 > "G的单位")
{
text2 = Math.Round(((double) num1) / 1073741824, 2) + " GB";
}
else if (num1 > "M的单位")
{
text2 = Math.Round(((double) num1) / 1048576, 2) + " MB";
}
else if (num1 > "K的单位")
{
text2 = Math.Round(((double) num1) / 1024, 2) + " KB";
}
else
{
text2 = num1 + " Byte";
}
posted @ 2007-01-24 11:03 HenryZhang 阅读(170) 评论(0)
编辑
和第二天一起出来了,不是真正意义上的天了,算次吧

继续学习中...............................
ScriptManager对WebService的应用:
先新建一个WebService用于测试WebServiceSample.asmx,
[ScriptService]
public class WebServiceSample : System.Web.Services.WebService {
public WebServiceSample()
{
}
[WebMethod]
public string EchoString(String s)
{
return "Hello " + s;
}
}
千万不要忘了ScriptService,更不要忘了using System.Web.Script.Services;ScriptService的名称空间,TerryLee的文章中没有写using,可能是认为太简单了吧,害得我搜到另一篇文章才知道滴:)
废话少说,看一下完整代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<script type="text/javascript" language="JavaScript">
function OnbuttonGo_click()
{
requestSimpleService = WebServiceSample.EchoString(
document.getElementById('inputName').value, //params
OnRequestComplete //Complete event
);
return false;
}
function OnRequestComplete(result)
{
alert(result);
}
</script>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="WebServiceSample.asmx"/>
</Services>
</asp:ScriptManager>
<div>
<input type="text" id="inputName" size=20/>
<input id="button" type="button" value="调 用" onclick="return OnbuttonGo_click()" /></div>
</form>
</body>
</html>
一个客户端的事件,调用服务器端的方法,返回结果到客户端,这就是Ajax
,需要注意的是WebServiceSample.EchoString(document.getElementById('inputName').value, OnRequestComplete);中的OnRequestComplete,表示的是调用完成后执行的方法,可不是EchoString需要的参数哟,当然OnRequestComplete(result)中,你不用result肯定没问题。
噢,对,文章中还提示了可以用
ServiceReference sr = new ServiceReference();
sr.Path = "WebServiceSample.asmx";
ScriptManager1.Services.Add(sr);
代替直接在页面设置ScriptManager的Services属性。
至于ScriptManagerProxy,实在是和ScriptManager太像了,只不过,由于一个ASPX页面上只能有一个ScriptManager控件,所以在有母版页的情况下,如果需要在Master-Page和Content-Page中需要引入不同的脚本时,这就需要在Content-page中使用ScriptManagerProxy,而不是ScriptManager。
posted @ 2007-01-24 11:02 HenryZhang 阅读(71) 评论(0)
编辑
ScriptManager控件包括在ASP.NET 2.0 AJAX Extensions中,它用来处理页面上的所有组件以及页面局部更新,所有需要支持ASP.NET AJAX的ASP.NET页面上有且只能有一个ScriptManager控件。TerryLee 的第一个例子中,放了一个ScriptManager控件,但实际使用的是UpdatePanel控件,是每个页面必须有一个ScriptManager控件呢,还是在这个例子里可以没有呢?
再说UpdatePanel控件,其实很简单,只是在ContentTemplate里放了两个服务器端控件,使用方法和平时一样,但这样就实现了控件执行服务器端事件而无刷新,呵呵,是挺方便的。
第二个例子,是一个错误处理的例子,在页面回传时如果发生了异常AsyncPostBackError事件将被触发,错误信息的处理依赖于AllowCustomErrors属性、AsyncPostBackErrorMessage属性和Web.config中的<customErrors>配置区,先看一下完整的代码:
郁闷!这里发文章居然有字数限制,代码粘不上来:(
例子中有一个ScriptManager控件ScriptManager1,设置了OnAsyncPostBackError="ScriptManager1_AsyncPostBackError",也就是当发生异常时,调用ScriptManager1_AsyncPostBackError方法。
protected void ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e)
{
ScriptManager1.AsyncPostBackErrorMessage = "异常信息为:" + e.Exception.Message;
}
在UpdatePanel中放了一个Lable和两个Button,Label用来显示信息,Button分别触发一个成功和一个抛出异常的方法:
protected void ErrorProcessClick_Handler(object sender, EventArgs e)
{
throw new ArgumentException();
}
protected void SuccessProcessClick_Handler(object sender, EventArgs e)
{
UpdatePanelMessage.Text = "The asynchronous postback completed successfully.";
}
可以看到,成功,则设置Label的属性,失败则抛出异常,ScriptManager遇到异常后,设置了AsyncPostBackErrorMessage属性。
看一下两个按钮:
<asp:Button runat="server" ID="Button1" Text="Submit Successful Async Postback"
OnClick="SuccessProcessClick_Handler" OnClientClick="ClearErrorState()" />
<asp:Button runat="server" ID="Button2" Text="Submit Async Postback With Error"
OnClick="ErrorProcessClick_Handler" OnClientClick="ClearErrorState()" />
除了设置OnClick外,还设置了OnClientClick,以前真不知道这个东西到底有什么用,是先执行OnClientClick再执行OnClick?还是?看完这个例子,也不太明白,呵呵,ClearErrorState做的事就是清除了出错的信息,
页面上的JS如下:
<script type="text/javascript" language="javascript">
var divElem = 'AlertDiv';
var messageElem = 'AlertMessage';
var errorMessageAdditional = 'Please try again.';
var bodyTag = 'bodytag';
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
function ToggleAlertDiv(visString)
{
if (visString == 'hidden')
{
$get(bodyTag).style.backgroundColor = 'white';
}
else
{
$get(bodyTag).style.backgroundColor = 'gray';
}
var adiv = $get(divElem);
adiv.style.visibility = visString;
}
function ClearErrorState() {
$get(messageElem).innerHTML = '';
ToggleAlertDiv('hidden');
}
function EndRequestHandler(sender, args)
{
if (args.get_error() != undefined && args.get_error().httpStatusCode == '500')
{
var errorMessage = args.get_error().message
args.set_errorHandled(true);
ToggleAlertDiv('visible');
$get(messageElem).innerHTML = '"' +
errorMessage + '" ' + errorMessageAdditional;
}
}
</script>
很简单,有点糊涂的是 Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);这句话,页面调用完要执行的吗?还是?......看来还是有很多基础的东东要学呀
posted @ 2007-01-24 11:01 HenryZhang 阅读(131) 评论(0)
编辑
发布有段时间了,早就看到了TerryLee的文章,一直没好好看,现在是时候好好研究一下了,首先,先看看官方网站提供的相关组件的下载
安装程序:下载
相关Released文档:Doc版本 PDF版本
从Atlas CTP版本升级到ASP.NET Ajax向导文档:下载
记得以前装过,检查一下,先装上工具再说。
在ASP.NET AJAX官方网站上有三个下载:
1.ASP.NET AJAX:这部分是ASP.NET AJAX的核心部分,包括了核心AJAX类型系统,网络协议层(networking stack),组件模型,扩展器(extender)基类,以及与ASP.NET集成的服务器端功能(包括广受欢迎的ScriptManager,UpdatePanel,和 Timer控件)。
2.ASP.NET AJAX “Value-Add”CTP:ASP.NET AJAX社区支持的“增值”CTP部分,包括了以前各个Atlas CTP版本包含的,但并不在完全支持的“核心”1.0 版本内的额外的高级特性。通过进一步的反馈,这些将会逐步稳定的增加到核心1.0中去
3.ASP.NET AJAX Control Toolkit:包含了基于ASP.NET AJAX 1.0 版“核心”下载版本的28个非常酷的免费AJAX控件。它是一个开源项目,由微软和非微软开发人员共同开发的,去CodePlex下载代码
下一步,可以创建项目了,安装完成后,打开VS2005,新建网站,在项目模板中会出现一项ASP.NET AJAX-enabled Web site,直接选择它就可以了
新建完成的项目中会自动在Web.config中做好相关的配置,并且AJAXExtensionToolbox.dll已经添加到了VS的工具箱中,不需要再手工添加
posted @ 2007-01-24 11:00 HenryZhang 阅读(93) 评论(0)
编辑
想到了自己从作程序以来的学习经历,发现总是今天想学这个,明天想学那个,学哪个都是三天打鱼两天晒网,到今天,就是没有一样精通的,学过几天控件开发,学过几天JAVA,学过几天C,起初的想法都是觉得这些东西很有用,想学好,但都没坚持下来,经高人指点,顿时醒悟,这些东西没有最终学下去,一方面的原因就是这些知识没有和手上的工作直接关联,导致过几天就没兴趣了,再就是自己做事不够坚持,反省了一下,决定还是从和自己工作相关的先入手,DOTNET有很多自己还不了解不熟悉的地方,一个一个来,AJAX,水晶报表,控件等等,本应是都该支的东东,何必再挑三捡四,先搞通一样再说,好,现从AJAX开始,NOW。
posted @ 2007-01-24 10:58 HenryZhang 阅读(87) 评论(0)
编辑
最近的项目接近完工了,可昨天在一次测试中竟然出现这样的问题,单独浏览站点时,没有任何问题,可当模拟多个用户并发访问时,出错了,查了半天,原来是代码中static的问题,static 表示静态,在内存中占据固定的存储空间,当把变量声明为static后,无论哪个用户来访问,取到的都是相同的值,这样当然有问题了,以前不知道这个东西到底是什么作用,只知道加上它后就能obj. 点出东西来,现在算是明白点了,以后注意。
当时将变量声明为static的原因是,在ajax方法中要使用页面上的一些值,但不能直接得到,于是想到将这些值存在static的变量中,这样在ajax方法中便能得到了,最后的解决方法是,将这些需要的值存于页面的hidden中,调用ajax的方法时,将这些hidden的值作为参数传入,问题解决。
posted @ 2007-01-24 10:57 HenryZhang 阅读(181) 评论(2)
编辑
早上来了,就看到一篇提高JS加载速度的文章,原名为“提高js加载速度的完美解决方案”,看了后觉得标题实在夸大了,不过还有值得借鉴的地方,实际要解决的事实是,在页面中如果要通过加载JS来显示部分内容(例如:广告),可通过以下方式:
<span id="myjs1">kk.fitdown 精彩内容载入中...</span> (此处是要显示内容的地方)
接下来,在页面底部:
<span id="span_myjs1">
<script src="/js/topjs.js"></script>
</span>
<script type="text/javascript">
myjs1.innerHTML=span_myads1.innerHTML;
span_myjs1.innerHTML="";
</script>
这样就能实现文章载入完后在载入广告,提高的文档的显示速度。
实际做的事情就是,把原来要显示内容的地方先放一个提示的信息,如“加载中...”,然后在自己定义的一个位置载入JS,再通过代码设置目标位置的内容,呵呵,不知道说没说明白:)
posted @ 2007-01-24 10:56 HenryZhang 阅读(737) 评论(1)
编辑
前两天在开发中遇到了截取字符串的问题,使用C#中的SubString时,不论汉字还是字母,全角还是半角,都当做一个字符处理,无法适应页中显示的要求,于是自己写了个StringSub,截取时全角字符计为两个长度,而半角字符计为一个,未经严格测试

,代码如下:
/// <summary>
/// 对指定字符串取指定长度,考虑了全角半角的问题
/// </summary>
/// <param name="str"></param>
/// <param name="len"></param>
/// <returns></returns>
public static string StringSub(string str, int len)
{
string temp = "";
System.Text.ASCIIEncoding n = new System.Text.ASCIIEncoding();
byte[] b = n.GetBytes(str);
int i = 0;
int j = 0;
while (i < len && j < b.Length)
{
temp += str.Substring(0, 1);
str = str.Substring(1);
if (b[j] >= 63)
i = i + 2;
else
i++;
j++;
}
return temp;
}
posted @ 2007-01-24 10:54 HenryZhang 阅读(219) 评论(0)
编辑
今天在网上看到了一个不错的日历控件
原作者:
CSDN 网友 KimSoft :http://blog.csdn.net/kimsoft/archive/2006/05/24/753225.aspx
经寒羽枫作了完善和修改,可以进行灵活的设置和修改,最重要的,就是兼容 IE、 FireFox
Js源码如下:WebCalendar.js
<!--
var cal;
var isFocus=false; //是否为焦点
//以上为 寒羽枫 2006-06-25 添加的变量
//选择日期 → 由 寒羽枫 2006-06-25 添加
function SelectDate(obj,strFormat)
{
var date = new Date();
var by = date.getFullYear()-50; //最小值 → 50 年前
var ey = date.getFullYear()+50; //最大值 → 50 年后
//cal = new Calendar(by, ey,1,strFormat); //初始化英文版,0 为中文版
cal = (cal==null) ? new Calendar(by, ey, 0) : cal; //不用每次都初始化 2006-12-03 修正
cal.dateFormatStyle = strFormat;
cal.show(obj);
}
/**//**//**//**
* 返回日期
* @param d the delimiter
* @param p the pattern of your date
2006-06-25 由 寒羽枫 修改为根据用户指定的 style 来确定;
*/
//String.prototype.toDate = function(x, p) {
String.prototype.toDate = function(style) {
/**//**//**//*
if(x == null) x = "-";
if(p == null) p = "ymd";
var a = this.split(x);
var y = parseInt(a[p.indexOf("y")]);
//remember to change this next century ;)
if(y.toString().length <= 2) y += 2000;
if(isNaN(y)) y = new Date().getFullYear();
var m = parseInt(a[p.indexOf("m")]) - 1;
var d = parseInt(a[p.indexOf("d")]);
if(isNaN(d)) d = 1;
return new Date(y, m, d);
*/
var y = this.substring(style.indexOf('y'),style.lastIndexOf('y')+1);//年
var m = this.substring(style.indexOf('M'),style.lastIndexOf('M')+1);//月
var d = this.substring(style.indexOf('d'),style.lastIndexOf('d')+1);//日
if(isNaN(y)) y = new Date().getFullYear();
if(isNaN(m)) m = new Date().getMonth();
if(isNaN(d)) d = new Date().getDate();
var dt ;
eval ("dt = new Date('"+ y+"', '"+(m-1)+"','"+ d +"')");
return dt;
}
/**//**//**//**
* 格式化日期
* @param d the delimiter
* @param p the pattern of your date
* @author meizz
*/
Date.prototype.format = function(style) {
var o = {
"M+" : this.getMonth() + 1, //month
"d+" : this.getDate(), //day
"h+" : this.getHours(), //hour
"m+" : this.getMinutes(), //minute
"s+" : this.getSeconds(), //second
"w+" : "天一二三四五六".charAt(this.getDay()), //week
"q+" : Math.floor((this.getMonth() + 3) / 3), //quarter
"S" : this.getMilliseconds() //millisecond
}
if(/(y+)/.test(style)) {
style = style.replace(RegExp.$1,
(this.getFullYear() + "").substr(4 - RegExp.$1.length));
}
for(var k in o){
if(new RegExp("("+ k +")").test(style)){
style = style.replace(RegExp.$1,
RegExp.$1.length == 1 ? o[k] :
("00" + o[k]).substr(("" + o[k]).length));
}
}
return style;
};
/**//**//**//**
* 日历类
* @param beginYear 1990
* @param endYear 2010
* @param lang 0(中文)|1(英语) 可自由扩充
* @param dateFormatStyle "yyyy-MM-dd";
* @version 2006-04-01
* @author KimSoft (jinqinghua [at] gmail.com)
* @update
*/
function Calendar(beginYear, endYear, lang, dateFormatStyle) {
this.beginYear = 1990;
this.endYear = 2010;
this.lang = 0; //0(中文) | 1(英文)
this.dateFormatStyle = "yyyy-MM-dd";
if (beginYear != null && endYear != null){
this.beginYear = beginYear;
this.endYear = endYear;
}
if (lang != null){
this.lang = lang
}
if (dateFormatStyle != null){
this.dateFormatStyle = dateFormatStyle
}
this.dateControl = null;
this.panel = this.getElementById("calendarPanel");
this.container = this.getElementById("ContainerPanel");
this.form = null;
this.date = new Date();
this.year = this.date.getFullYear();
this.month = this.date.getMonth();
this.colors = {
"cur_word" : "#FFFFFF", //当日日期文字颜色
"cur_bg" : "#00FF00", //当日日期单元格背影色
"sel_bg" : "#FFCCCC", //已被选择的日期单元格背影色 2006-12-03 寒羽枫添加
"sun_word" : "#FF0000", //星期天文字颜色
"sat_word" : "#0000FF", //星期六文字颜色
"td_word_light" : "#333333", //单元格文字颜色
"td_word_dark" : "#CCCCCC", //单元格文字暗色
"td_bg_out" : "#EFEFEF", //单元格背影色
"td_bg_over" : "#FFCC00", //单元格背影色
"tr_word" : "#FFFFFF", //日历头文字颜色
"tr_bg" : "#666666", //日历头背影色
"input_border" : "#CCCCCC", //input控件的边框颜色
"input_bg" : "#EFEFEF" //input控件的背影色
}
this.draw();
this.bindYear();
this.bindMonth();
this.changeSelect();
this.bindData();
}
/**//**//**//**
* 日历类属性(语言包,可自由扩展)
*/
Calendar.language = {
"year" : [[""], [""]],
"months" : [["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],
["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"]
],
"weeks" : [["日","一","二","三","四","五","六"],
["SUN","MON","TUR","WED","THU","FRI","SAT"]
],
"clear" : [["清空"], ["CLS"]],
"today" : [["今天"], ["TODAY"]],
"close" : [["关闭"], ["CLOSE"]]
}
Calendar.prototype.draw = function() {
calendar = this;
var mvAry = [];
//mvAry[mvAry.length] = ' <form name="calendarForm" style="margin: 0px;">'; //因 <form> 不能嵌套, 2006-12-01 由寒羽枫改用 Div
mvAry[mvAry.length] = ' <div name="calendarForm" style="margin: 0px;">';
mvAry[mvAry.length] = ' <table width="100%" border="0" cellpadding="0" cellspacing="1">';
mvAry[mvAry.length] = ' <tr>';
mvAry[mvAry.length] = ' <th align="left" width="1%"><input style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:16px;height:20px;" name="prevMonth" type="button" id="prevMonth" value="<" /></th>';
mvAry[mvAry.length] = ' <th align="center" width="98%" nowrap="nowrap"><select name="calendarYear" id="calendarYear" style="font-size:12px;"></select><select name="calendarMonth" id="calendarMonth" style="font-size:12px;"></select></th>';
mvAry[mvAry.length] = ' <th align="right" width="1%"><input style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:16px;height:20px;" name="nextMonth" type="button" id="nextMonth" value=">" /></th>';
mvAry[mvAry.length] = ' </tr>';
mvAry[mvAry.length] = ' </table>';
mvAry[mvAry.length] = ' <table id="calendarTable" width="100%" style="border:0px solid #CCCCCC;background-color:#FFFFFF" border="0" cellpadding="3" cellspacing="1">';
mvAry[mvAry.length] = ' <tr>';
for(var i = 0; i < 7; i++) {
mvAry[mvAry.length] = ' <th style="font-weight:normal;background-color:' + calendar.colors["tr_bg"] + ';color:' + calendar.colors["tr_word"] + ';">' + Calendar.language["weeks"][this.lang][i] + '</th>';
}
mvAry[mvAry.length] = ' </tr>';
for(var i = 0; i < 6;i++){
mvAry[mvAry.length] = ' <tr align="center">';
for(var j = 0; j < 7; j++) {
if (j == 0){
mvAry[mvAry.length] = ' <td style="cursor:default;color:' + calendar.colors["sun_word"] + ';"></td>';
} else if(j == 6) {
mvAry[mvAry.length] = ' <td style="cursor:default;color:' + calendar.colors["sat_word"] + ';"></td>';
} else {
mvAry[mvAry.length] = ' <td style="cursor:default;"></td>';
}
}
mvAry[mvAry.length] = ' </tr>';
}
mvAry[mvAry.length] = ' <tr style="background-color:' + calendar.colors["input_bg"] + ';">';
mvAry[mvAry.length] = ' <th colspan="2"><input name="calendarClear" type="button" id="calendarClear" value="' + Calendar.language["clear"][this.lang] + '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:100%;height:20px;font-size:12px;"/></th>';
mvAry[mvAry.length] = ' <th colspan="3"><input name="calendarToday" type="button" id="calendarToday" value="' + Calendar.language["today"][this.lang] + '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:100%;height:20px;font-size:12px;"/></th>';
mvAry[mvAry.length] = ' <th colspan="2"><input name="calendarClose" type="button" id="calendarClose" value="' + Calendar.language["close"][this.lang] + '" style="border: 1px solid ' + calendar.colors["input_border"] + ';background-color:' + calendar.colors["input_bg"] + ';width:100%;height:20px;font-size:12px;"/></th>';
mvAry[mvAry.length] = ' </tr>';
mvAry[mvAry.length] = ' </table>';
//mvAry[mvAry.length] = ' </from>';
mvAry[mvAry.length] = ' </div>';
this.panel.innerHTML = mvAry.join("");
/**//******** 以下代码由寒羽枫 2006-12-01 添加 **********/
var obj = this.getElementById("prevMonth");
obj.onclick = function () {calendar.goPrevMonth(calendar);}
obj.onblur = function () {calendar.onblur();}
this.prevMonth= obj;
obj = this.getElementById("nextMonth");
obj.onclick = function () {calendar.goNextMonth(calendar);}
obj.onblur = function () {calendar.onblur();}
this.nextMonth= obj;
obj = this.getElementById("calendarClear");
obj.onclick = function () {calendar.dateControl.value = "";calendar.hide();}
this.calendarClear = obj;
obj = this.getElementById("calendarClose");
obj.onclick = function () {calendar.hide();}
this.calendarClose = obj;
obj = this.getElementById("calendarYear");
obj.onchange = function () {calendar.update(calendar);}
obj.onblur = function () {calendar.onblur();}
this.calendarYear = obj;
obj = this.getElementById("calendarMonth");
with(obj)
{
onchange = function () {calendar.update(calendar);}
onblur = function () {calendar.onblur();}
}this.calendarMonth = obj;
obj = this.getElementById("calendarToday");
obj.onclick = function () {
var today = new Date();
calendar.date = today;
calendar.year = today.getFullYear();
calendar.month = today.getMonth();
calendar.changeSelect();
calendar.bindData();
calendar.dateControl.value = today.format(calendar.dateFormatStyle);
calendar.hide();
}
this.calendarToday = obj;
/**//******** 以上代码由寒羽枫 2006-12-01 添加 **********/
/**//*
//this.form = document.forms["calendarForm"];
this.form.prevMonth.onclick = function () {calendar.goPrevMonth(this);}
this.form.nextMonth.onclick = function () {calendar.goNextMonth(this);}
this.form.prevMonth.onblur = function () {calendar.onblur();}
this.form.nextMonth.onblur = function () {calendar.onblur();}
this.form.calendarClear.onclick = function () {calendar.dateControl.value = "";calendar.hide();}
this.form.calendarClose.onclick = function () {calendar.hide();}
this.form.calendarYear.onchange = function () {calendar.update(this);}
this.form.calendarMonth.onchange = function () {calendar.update(this);}
this.form.calendarYear.onblur = function () {calendar.onblur();}
this.form.calendarMonth.onblur = function () {calendar.onblur();}
this.form.calendarToday.onclick = function () {
var today = new Date();
calendar.date = today;
calendar.year = today.getFullYear();
calendar.month = today.getMonth();
calendar.changeSelect();
calendar.bindData();
calendar.dateControl.value = today.format(calendar.dateFormatStyle);
calendar.hide();
}
*/
}
//年份下拉框绑定数据
Calendar.prototype.bindYear = function() {
//var cy = this.form.calendarYear;
var cy = this.calendarYear;//2006-12-01 由寒羽枫修改
cy.length = 0;
for (var i = this.beginYear; i <= this.endYear; i++){
cy.options[cy.length] = new Option(i + Calendar.language["year"][this.lang], i);
}
}
//月份下拉框绑定数据
Calendar.prototype.bindMonth = function() {
//var cm = this.form.calendarMonth;
var cm = this.calendarMonth;//2006-12-01 由寒羽枫修改
cm.length = 0;
for (var i = 0; i < 12; i++){
cm.options[cm.length] = new Option(Calendar.language["months"][this.lang][i], i);
}
}
//向前一月
Calendar.prototype.goPrevMonth = function(e){
if (this.year == this.beginYear && this.month == 0){return;}
this.month--;
if (this.month == -1) {
this.year--;
this.month = 11;
}
this.date = new Date(this.year, this.month, 1);
this.changeSelect();
this.bindData();
}
//向后一月
Calendar.prototype.goNextMonth = function(e){
if (this.year == this.endYear && this.month == 11){return;}
this.month++;
if (this.month == 12) {
this.year++;
this.month = 0;
}
this.date = new Date(this.year, this.month, 1);
this.changeSelect();
this.bindData();
}
//改变SELECT选中状态
Calendar.prototype.changeSelect = function() {
//var cy = this.form.calendarYear;
//var cm = this.form.calendarMonth;
var cy = this.calendarYear;//2006-12-01 由寒羽枫修改
var cm = this.calendarMonth;
for (var i= 0; i < cy.length; i++){
if (cy.options[i].value == this.date.getFullYear()){
cy[i].selected = true;
break;
}
}
for (var i= 0; i < cm.length; i++){
if (cm.options[i].value == this.date.getMonth()){
cm[i].selected = true;
break;
}
}
}
//更新年、月
Calendar.prototype.update = function (e){
//this.year = e.form.calendarYear.options[e.form.calendarYear.selectedIndex].value;
//this.month = e.form.calendarMonth.options[e.form.calendarMonth.selectedIndex].value;
this.year = e.calendarYear.options[e.calendarYear.selectedIndex].value;//2006-12-01 由寒羽枫修改
this.month = e.calendarMonth.options[e.calendarMonth.selectedIndex].value;
this.date = new Date(this.year, this.month, 1);
this.changeSelect();
this.bindData();
}
//绑定数据到月视图
Calendar.prototype.bindData = function () {
var calendar = this;
var dateArray = this.getMonthViewArray(this.date.getYear(), this.date.getMonth());
var tds = this.getElementById("calendarTable").getElementsByTagName("td");
for(var i = 0; i < tds.length; i++) {
//tds[i].style.color = calendar.colors["td_word_light"];
tds[i].style.backgroundColor = calendar.colors["td_bg_out"];
tds[i].onclick = function () {return;}
tds[i].onmouseover = function () {return;}
tds[i].onmouseout = function () {return;}
if (i > dateArray.length - 1) break;
tds[i].innerHTML = dateArray[i];
if (dateArray[i] != " "){
tds[i].onclick = function () {
if (calendar.dateControl != null){
calendar.dateControl.value = new Date(calendar.date.getFullYear(),
calendar.date.getMonth(),
this.innerHTML).format(calendar.dateFormatStyle);
}
calendar.hide();
}
tds[i].onmouseover = function () {
this.style.backgroundColor = calendar.colors["td_bg_over"];
}
tds[i].onmouseout = function () {
this.style.backgroundColor = calendar.colors["td_bg_out"];
}
if (new Date().format(calendar.dateFormatStyle) ==
new Date(calendar.date.getFullYear(),
calendar.date.getMonth(),
dateArray[i]).format(calendar.dateFormatStyle)) {
//tds[i].style.color = calendar.colors["cur_word"];
tds[i].style.backgroundColor = calendar.colors["cur_bg"];
tds[i].onmouseover = function () {
this.style.backgroundColor = calendar.colors["td_bg_over"];
}
tds[i].onmouseout = function () {
this.style.backgroundColor = calendar.colors["cur_bg"];
}
//continue; //若不想当天单元格的背景被下面的覆盖,请取消注释 → 2006-12-03 寒羽枫添加
}//end if
//设置已被选择的日期单元格背影色 2006-12-03 寒羽枫添加
if (calendar.dateControl != null && calendar.dateControl.value == new Date(calendar.date.getFullYear(),
calendar.date.getMonth(),
dateArray[i]).format(calendar.dateFormatStyle)) {
tds[i].style.backgroundColor = calendar.colors["sel_bg"];
tds[i].onmouseover = function () {
this.style.backgroundColor = calendar.colors["td_bg_over"];
}
tds[i].onmouseout = function () {
this.style.backgroundColor = calendar.colors["sel_bg"];
}
}
}
}
}
//根据年、月得到月视图数据(数组形式)
Calendar.prototype.getMonthViewArray = function (y, m) {
var mvArray = [];
var dayOfFirstDay = new Date(y, m, 1).getDay();
var daysOfMonth = new Date(y, m + 1, 0).getDate();
for (var i = 0; i < 42; i++) {
mvArray[i] = " ";
}
for (var i = 0; i < daysOfMonth; i++){
mvArray[i + dayOfFirstDay] = i + 1;
}
return mvArray;
}
//扩展 document.getElementById(id) 多浏览器兼容性 from meizz tree source
Calendar.prototype.getElementById = function(id){
if (typeof(id) != "string" || id == "") return null;
if (document.getElementById) return document.getElementById(id);
if (document.all) return document.all(id);
try {return eval(id);} catch(e){ return null;}
}
//扩展 object.getElementsByTagName(tagName)
Calendar.prototype.getElementsByTagName = function(object, tagName){
if (document.getElementsByTagName) return document.getElementsByTagName(tagName);
if (document.all) return document.all.tags(tagName);
}
//取得HTML控件绝对位置
Calendar.prototype.getAbsPoint = function (e){
var x = e.offsetLeft;
var y = e.offsetTop;
while(e = e.offsetParent){
x += e.offsetLeft;
y += e.offsetTop;
}
return {"x": x, "y": y};
}
//显示日历
Calendar.prototype.show = function (dateObj, popControl) {
if (dateObj == null){
throw new Error("arguments[0] is necessary")
}
this.dateControl = dateObj;
//if (dateObj.value.length > 0){
//this.date = new Date(dateObj.value.toDate());
//this.date = new Date(dateObj.value.toDate(this.dateFormatStyle));//由寒羽枫修改,带入用户指定的 style
this.date = (dateObj.value.length > 0) ? new Date(dateObj.value.toDate(this.dateFormatStyle)) : new Date() ;//2006-12-03 寒羽枫添加 → 若为空则显示当前月份
this.year = this.date.getFullYear();
this.month = this.date.getMonth();
this.changeSelect();
this.bindData();
//}
if (popControl == null){
popControl = dateObj;
}
var xy = this.getAbsPoint(popControl);
this.panel.style.left = xy.x -25 + "px";
this.panel.style.top = (xy.y + dateObj.offsetHeight) + "px";
//由寒羽枫 2006-06-25 修改 → 把 visibility 变为 display,并添加失去焦点的事件
//this.setDisplayStyle("select", "hidden");
//this.panel.style.visibility = "visible";
//this.container.style.visibility = "visible";
this.panel.style.display = "";
this.container.style.display = "";
dateObj.onblur = function(){calendar.onblur();}
this.container.onmouseover = function(){isFocus=true;}
this.container.onmouseout = function(){isFocus=false;}
}
//隐藏日历
Calendar.prototype.hide = function() {
//this.setDisplayStyle("select", "visible");
//this.panel.style.visibility = "hidden";
//this.container.style.visibility = "hidden";
this.panel.style.display = "none";
this.container.style.display = "none";
isFocus=false;
}
//焦点转移时隐藏日历 → 由寒羽枫 2006-06-25 添加
Calendar.prototype.onblur = function() {
if(!isFocus){this.hide();}
}
//以下由寒羽枫 2006-06-25 修改 → 用<iframe> 遮住 IE 的下拉框
/**//**//**//*
//设置控件显示或隐藏
Calendar.prototype.setDisplayStyle = function(tagName, style) {
var tags = this.getElementsByTagName(null, tagName)
for(var i = 0; i < tags.length; i++) {
if (tagName.toLowerCase() == "select" &&
(tags[i].name == "calendarYear" ||
tags[i].name == "calendarMonth")){
continue;
}
//tags[i].style.visibility = style;
tags[i].style.display = style;
}
}
*/
//document.write('<div id="ContainerPanel" style="visibility:hidden"><div id="calendarPanel" style="position: absolute;visibility: hidden;z-index: 9999;');
document.write('<div id="ContainerPanel" style="display:none"><div id="calendarPanel" style="position: absolute;display: none;z-index: 9999;');
document.write('background-color: #FFFFFF;border: 1px solid #CCCCCC;width:175px;font-size:12px;"></div>');
if(document.all)
{
document.write('<iframe style="position:absolute;z-index:2000;width:expression(this.previousSibling.offsetWidth);');
document.write('height:expression(this.previousSibling.offsetHeight);');
document.write('left:expression(this.previousSibling.offsetLeft);top:expression(this.previousSibling.offsetTop);');
document.write('display:expression(this.previousSibling.style.display);" scrolling="no" frameborder="no"></iframe>');
}
document.write('</div>');
//var calendar = new Calendar(); //此句被 寒羽枫注释,否则 IE 将报错
//调用calendar.show(dateControl, popControl);
//-->
调用方法
1、引用 WebCalendar.js
<script src="js/WebCalendar.js" type="text/javascript"></script>
2、编写触发的脚本事件
this.Txt_Date.Attributes["onclick"] = "SelectDate(this,'yyyy-MM-dd')";
<input name="Txt_Date" type="text" maxlength="10" id="Txt_Date" onclick="SelectDate(this,'yyyy/MM/dd')" />
相关的修改可以在new Calendar时通过改变其参数实现,SelectDate(this,'yyyy-MM-dd')将指定其显示的格式。
posted @ 2007-01-24 10:51 HenryZhang 阅读(1193) 评论(0)
编辑
三天的假期,去了女朋友家,见到了很多亲戚,既紧张又兴奋的感觉,回来已经累得动弹不了了,但今天上班却是精神得很,想想以往的假期,一个一个的“黄金周”,好像还是这半个周过得最有意义,也最充实了,看来休息放松的最好方式不是睡觉呀:)
posted @ 2007-01-24 10:48 HenryZhang 阅读(22) 评论(0)
编辑
1、美特斯邦威:不加寻常班
2、特步: 加班,死一般的感觉
3、百事:加班无极限
4、森马:上什么公司,加什么班
5、脑白金:今年过节不加班,加班只加节假日
6、汇仁肾宝:他加我也加
7、李宁:加班,一切皆有可能
8、旺旺:你加,我加,大家加,加加
9、农夫山泉:加班确实有点烦
10、好迪:大家加,才是真的加
11、白加黑:白天加白班,不瞌睡;晚上加晚班,睡不着
12、联想:公司不加班,公司会怎么样
13、娃哈哈:妈妈~~我也要加班!
14、清嘴:你知道加班的味道吗?
15、安踏:我加班,我喜欢!
16、NIKE:Just 加 it!
17、钙中钙:现在的加班啊,它含金量高,加一天顶过去五天,实惠!你瞧我,一口气加了5天,不费劲
posted @ 2007-01-24 10:45 HenryZhang 阅读(31) 评论(0)
编辑
飘来飘去的感觉。。。。。。
很久以前就在园子里注册了用户,一直也没写什么东东,也在别的地方注册过博客,一直也没好好用过哪个,呵呵,前几天看到了百度的个人空间,感觉不错,于是决定坚持用下去,这段时间做得还不错,原则就是不能把别人的东西一通地粘过来,因为以前粘过来几乎就再也不看了,所以决定只写看过的看懂的总结,因个人水平有限,原创的东西还是很少的,不过能把别人的东西学好写下来也不错吧,嘿,这几天在学TerryLee的一系列文章,还有DLL的Nhibernate,才知道这么多高手,写了这么多好文章,都在园子里,或在CSDN里,所以就想把百度的东西搬过来,先把以前的都清一下,好好在这两个地方写一些自己的学习结果,任何一件事,坚持才重要!
posted @ 2007-01-24 10:44 HenryZhang 阅读(76) 评论(0)
编辑