帮朋友招聘。公司网站http://www.fhr.cn/

工作职责:
负责公司网站程序开发与维护。

任职资格:
1、一年以上Web开发经验,有过大型网站设计经验,并有相关作品;
2、精通ASP/PHP、JavaScript、HTML、CSS,
3、精通SQL SERVER语句、ACCESS数据库;
4、在精通ASP前提下,同时熟悉ASP.NET或PHP者优先;
5、有良好的协调沟通能力,具有团队合作精神。

简历请投yaomeijing#126.com(把#换成@)

posted @ 2007-09-03 21:02 Einstein.Pang 阅读(259) | 评论 (0)编辑
一天,Microsoft, Lotus, Novell三家公司的销售经理相约比试枪法.
首先上场的是Microsoft.他一口气灌下两瓶嘉士伯,随手一扬,两个瓶子飞上天空,只听“乒!乒!“两声枪响,瓶子被打的粉碎,“NT遍地开花,Sales 轻松写意!“
Lotus销售经理也不示弱,两瓶XO下肚,轩尼诗曲线玲珑的瓶子两枪搞定..“软件所向披靡,莲花开遍全球!“
压轴出场的Novell销售经理在郁闷郁闷的喝了两瓶二锅头后,疲惫不堪的抛起两个瓶子,颤颤微微的举起枪,
两枪响过------------------------Microsoft和Novell的销售经理应声倒下.Novell的销售经理这才缓缓吐出一句话:
“没有竞争对手的生活是一种幸福。“
posted @ 2007-02-01 17:35 Einstein.Pang 阅读(46) | 评论 (0)编辑
感觉博客园的学习氛围不错,特意申请了个博客.以后和大家一起学习,共同进步!
posted @ 2006-11-09 11:52 Einstein.Pang 阅读(25) | 评论 (1)编辑
出售FreeTextBox3.1.6源代码,原版非破解,代码完整无错。
价格:50 RMB
联系:E-mail:yespgg#163.com
            QQ:913225778
posted @ 2007-12-06 17:40 Einstein.Pang 阅读(111) | 评论 (3)编辑
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
    
class Program
    {
        
static void Main(string[] args)
        {
            Console.WriteLine(
"请输入一个6位的数字");
            
int a = int.Parse(Console.ReadLine());
            
int[] b = new int[6];
            b[
5= a / 100000;
            b[
4= (a - b[5* 100000)/10000;
            b[
3= (a - b[5* 100000 - b[4* 10000)/1000;
            b[
2= (a - b[5* 100000 - b[4* 10000-b[3]*1000)/100;
            b[
1= (a - b[5* 100000 - b[4* 10000 - b[3* 1000-b[2]*100/ 10;
            b[
0= (a - b[5* 100000 - b[4* 10000 - b[3* 1000 - b[2* 100 - b[1* 10);
            
for (int x = 0; x <6 ; x++)
            {
                
if (!((b[x] & 1 )== 0))
                {
                    Console.WriteLine(b[x].ToString());
                }
            }
            Console.WriteLine(
"=================================================");
            Console.WriteLine(
"合并数组并从小到大排序:int[] i ={ 12, 54, 87, 364, 345, 97, 112, 6, 953 },int[] j ={ 57, 3456, 879, 3, 67 }");
            
int[] i =125487364345971126953 };
            
int[] j =573456879367 };
            
int[] k = new int[i.Length + j.Length];
            
for (int l = 0; l < i.Length; l++)
            {
                k[l] 
= i[l];
            }
            
for (int n = 0, m = 9; n < 5; n++, m++)
            {
                k[m] 
= j[n];
            }
            
for (int v = 0; v < k.Length - 1; v++)
            {
                
for (int z = 0; z < k.Length-1; z++)
                {
                    
int _a = k[z];
                    
int _b = k[z + 1];
                    
if (_b < _a)
                    {
                        k[z] 
= _b;
                        k[z 
+ 1= _a;
                    }
                }
            }
            
for (int w = 0; w < k.Length; w++)
            {
                Console.WriteLine(k[w].ToString());
            }
            Console.ReadLine();


        }
    }
}
posted @ 2007-11-23 10:05 Einstein.Pang 阅读(327) | 评论 (2)编辑

帮朋友招聘。公司网站http://www.fhr.cn/

工作职责:
负责公司网站程序开发与维护。

任职资格:
1、一年以上Web开发经验,有过大型网站设计经验,并有相关作品;
2、精通ASP/PHP、JavaScript、HTML、CSS,
3、精通SQL SERVER语句、ACCESS数据库;
4、在精通ASP前提下,同时熟悉ASP.NET或PHP者优先;
5、有良好的协调沟通能力,具有团队合作精神。

简历请投yaomeijing#126.com(把#换成@)

posted @ 2007-09-03 21:02 Einstein.Pang 阅读(259) | 评论 (0)编辑
目录:
  • 〇、 摘要一、 开发前的准备二、 创建空的SourceSafe数据库三、 新建项目并加入版本控制四、 获取SourceSafe中的项目五、 版本控制的几个概念六、 版本控制项目的管理七、 总结

〇、摘要
在企业开发环境中,源代码管理占据着重要的一环。本文将通过一个实例,创建一个源代码管理的项目SourceManager,来讲述如何使用Visual Studio.Net开发环境,配合Visual Source Safe 6c和IIS,创建企业团队开发环境。

一、 开发前的准备
1、 在装有Windows 2000或者Windows XP Professional的机器上安装.Net Framework SDK、Visual Studio.Net、Visual Source Safe 6C。(如果用户操作系统是Windows .Net Server,则无须安装.Net Framework SDK,.Net Server自带的IIS 6已经完全包含了对.Net的支持)这些工具在Visual Studio.Net的安装盘上都可以找到。
2、 一台专门用于存放版本控制中心数据库的服务器。该服务器不需要安装.NET Framework SDK和VS.Net,但是必须安装VSS 6C。我们称这台服务器为开发服务器DataCenter。
3、 一个主域控制器,将DataCenter服务器加入这个域,为每一个开发用户分配域帐号。这样所有小组成员可以通过登录到Window NT域来访问版本控制信息。
注意:Visual Studio 6所带的Visual Source Safe 6不支持.Net的一些文件格式。如果你安装了VSS 6,也需要再安装一次VSS 6C,否则在VS.Net环境中将源代码加入到VSS数据库中将会出现错误。

二、 创建空的SourceSafe数据库
在开始工作之前,需要建立一个空的SourceSafe数据库,来存放源代码控制数据,并为小组开发人员分配访问帐号。在DataCenter服务器上新建Source Safe数据库。步骤如下:
1、 启动"开始"——"程序"——"Microsoft Visual SourceSafe"菜单下的SourceSafe 6.0 Admin。如果你是第一次安装VSS 6C,Common数据库的Admin帐号为空。如图一所示:

图一 VSS登录窗口
2、 在Visual SourceSafe Administrator窗口中,你可以看到Source Safe默认的两个用户Admin和Guest。如果你不打算使用默认的Common数据库,而要建立一个属于自己的项目数据库。选择菜单"Tools"——"Create Database",如图二所示:

图二 VSS管理窗口
3、 在弹出的对话框中选择新数据库存放的位置。这里我们选择:C:\SourceManager\。点击OK后,提示你已经创建了数据库。
4、 选择"Users"——"Open SourceSafe Database…",使用Browser按钮,选择刚才所创建的SourceManager数据库C:\SourceManager\srcsafe.ini。
5、 使用"Users"——"Change Password"命令更改Admin帐号的密码。使用"Users"——"Add User"命令为项目小组成员创建SourceSafe帐号。
6、 将C:\SourceManager目录设置为共享。共享权限默认是Everyone完全控制。如果希望只对项目小组成员开放,不希望其他人操作数据库文件(注意:没有SourceManager帐号的人不能访问SourceSafe中的内容,但如果他有权限的话,可以删除或修改数据库中的数据),请将Everyone组从权限组中删除,并从域目录中选择可以访问该目录的域帐号或计算机。
7、 到此,一个空的项目数据库建立完毕。

三、 新建项目并加入版本控制
下面将演示在一个装有VS.Net的计算机上创建一个Windows应用程序和一个Web项目,并把它加入到上面所建的SouceManager数据库中。
1、 启动VS.NET。
2、 使用"文件"——"新建"——"空白解决方案"命令,在D:\下新建解决方案SourceManager。VS.Net会在D:\下自动创建一个SourceManager目录,该目录中有一个解决方案文件SourceManager.sln文件。
3、 使用"文件"——"新建"——"项目"命令,在项目类型中选择"Visual C#项目",在"模板"中选择"Window应用程序"。项目名称MyWindowApp。并选择"添入解决方案"选项。确定。

图三 新建Windows应用程序项目窗口
4、 使用"文件"——"新建"——"项目"命令,在项目类型中选择"Visual C#项目",在"模板"中选择"ASP.NET Web应用程序"。在"位置"栏中填写http://localhost/MyWebApp。并选择"添入解决方案"选项。确定。

图四 新建Web应用程序窗口
这样就在解决方案中建立了一个Window应用程序和一个Web应用程序。下面讲述如何将整个解决方案加入到源代码版本控制。
5、 在WebFrom1和Form1的设计器中各自加入一个Label控件,保持它的属性不变。我们将看到从另一个主机上获取的程序用户界面中也会有这一个控件。
6、 使用"文件"——"源代码管理"——"将解决方案加到源代码管理"命令。

图五 源代码管理菜单
7、 在弹出的Visual SourceSafe Login登录窗口点击"Browser"按钮,弹出打开数据库对话框,点击该对话框的"Browser"按钮,弹出如下对话框,在"文件名"中输入\\DataCenter\SourceManager\srcsafe.ini。确定后输入上面所分配的SourceSafe帐号和密码。

图六 打开VSS数据库对话框
8、 首先会弹出一个保存解决方案的提示窗口,让你选择将要保存到SourceSafe中的项目名称,默认与解决方案的名称相同。点击OK,会得到项目在数据库中不存在的提示,点击"Yes"创建该项目。

图七 在VSS中创建项目对话框
9、 接下来会让你选择Web应用程序的保存位置。如下图所示。由于Web应用程序通常保存在本地的IIS根目录下。与解决方案中的其它项目不在同一个目录中,所以需要为Web应用程序在SourceSafe中单独建立一个项目。在该窗口点击"OK"按钮接受SourceSafe的默认项目名称MyWebApp。

图八 在VSS中创建Web项目对话框
10、 到此,我们已经在SourceSafe中添加了整个解决方案,包括一个Windows应用程序和一个Web应用程序。在"解决方案资源管理器"视图中,加入源代码控制的程序旁边有一把锁(如图九所示),表示文档已签入,不可编辑。

图九 解决方案资源管理器
11、 通过菜单"文件"——"源代码管理"——"Microsoft Visual SourceSafe",打开SourceSafe,可以看到,在SourceSafe中已经加入了两个项目。如图十所示:

图十 VSS浏览器

四、 获取SourceSafe中的项目
下面的步骤中将讲述如何在另一台主机上从SourceSafe获取源代码。
1、 在另一台主机上打开Visual Studio.Net开发环境。使用菜单命令"文件"——"源代码管理"——"从源代码管理打开"。重复第三步中的第7个操作,选择SourceSafe数据库的位置。
2、 弹出"Create local poject from SourceSafe"窗口,在"Create a new project in the"输入框中填写你要保存项目的本地路径,这里我们选择"C:\MyProject"。在"SourceSafe project to"中选择SourceManager项目,单击OK按钮。如果目录C:\MyProject不存在,会询问是否创建,选择"Yes All"。

图十一 从SourceSafe获取项目对话框
3、 接下来会弹出保存Web应用程序工作副本的对话框,在工作副本位置输入框中输入你想要保存Web应用的Web文件夹,也可以接受默认设置。点击"确定"按钮接受默认设置。

图十二 从SourceSafe获取Web项目对话框
4、 通过上述步骤,我们已经成功地在另一个开发主机上获得保存在SourceSafe的工程。将来如果有新的开发人员加入,只需重复这四个步骤即可。

五、 版本控制的几个概念
在Visual Studio.Net开发环境"解决方案资源管理器"的上下文菜单或者"文件"——中有如下与文件操作有关的命令,如图十三所示:

1、 文件的"签出"(Check Out):当需要编辑一个文件时,必须将该文件"签出",SourceSafe会标志该文件已经被某个用户迁出,并确保其他用户不可编辑同一个文件。对于文件,仅当文件被签入后才有这个选项。
2、 文件的"签入"(Check In):当完成文件的编辑后,最好将文件"签入",以让其他用户可以签出或者获取最新版本。对于文件,仅当文件被签出后才有这个选项。
3、 "获取最新版本":从SourceSafe数据库中获取指定文件或项目的最新版本,而又不必签出文件。
4、 "取消签出":不在SourceSafe数据库中保存签出后所做的修改,使本地文件恢复到修改之前的状态,并且将文件签入。只有文件或项目中有文件被签出后才有这个选项。
5、 "历史记录":查看文件修改的历史记录。SourceSafe数据库会自动保存每次"签入"前后的文件内容。如果需要查看历史记录。
6、 "版本比较":可以比较当前版本与历史版本之间的差异,SourceSafe将以对照的形式将两个版本的不同之处显示出来。如图十四所示:

图十四 版本比较
7、 "Roll Back":在历史版本显示对话框中有一个Roll Back命令,即将文件恢复到历史版本。当文件编辑错误时,想让文件回到历史的某个点时,使用该命令。历史版本显示对话框中还有其它命令,这里不一一详述,请读者慢慢研究。
8、 Visual Studio.Net中关于版本控制的选项:在"工具"——"选项"命令对话框中,选择左边的"源代码管理",显示如下对话框。读者可以根据项目的情况对SourceSafe选项进行设置。

图十五 Visual Studio.Net中与版本控制相关的选项
9、 其它SourceSafe操作:读者可以从"文件"——"源代码管理"——"Microsoft Visual SourceSafe"菜单,进入"Visual SourceSafe Explorer",其中大多数主要命令基本与Visual Studio.Net相同,这里就不再累赘。

六、 版本控制项目的管理
下面将讲述版本控制相关的一些权限管理和文件映射。首先在DataCenter服务器上打开"开始"——"程序"——"Microsoft Visual SourceSafe"——"Visual Source Safe 6.0 Admin"。选择SourceManager数据库,填入Admin账号的密码。进入"SourceSafe Administrator"窗口。它有如下几个菜单。

1、 Users菜单下是关于用户操作的命令,除上面我们所使用的添加用户"Add User"、修改密码"Change Password"外,还有删除用户"Delete User"、编辑用户"Edit User"命令。"Open SourceSafe Database"命令用于更改当前SourceSafe数据库。
2、 Tools菜单下的Options对话框中包括了一些项目的设置。下面对主要的选项进行简单的说明:
(1) General页中的Allow multiple checkouts,如果选择此项,则允许多个用户同时签出文件。默认是不允许。
(2) Project Security页中的"Enable project security"复选框指明是否允许对项目使用安全性。该项默认为不允许。只有当选择了这个选项之后,Tools下的"Rights by Project"、"Right Assignments for User"和"Copy User Rights"才可用。这里我们将它选中。
(3) Shadow Folders页用于设置项目在服务器上的映射。项目在SourceSafe中以二进制码形式将文件的所有版本信息保存在文件中。要在服务器上创建一个目录,将项目文件映射到这个目录中,使用该命令。在"Set shadow folder for project"中选择在SourceSafe中的SourceManager项目,在"Set shadow folder to"中选择项目要映射到的目录,如C:\SourceManager_Shadow。
(4) Web Projects页用于设置Web项目在服务器上的映射。在This project represents a Web Site中选择SourceSafe中的MyWebApp项目,在URL中填入"http://localhost",即本地Web服务器(也可以填入其它服务器)。Virtual Tools中填入要映射的虚拟目录,在"Deployments path"填入部署目录,这个目录将成为IIS中指定虚拟目录的映射目录。
3、 Tools菜单下的"Rights by Project"管理SourceSafe中项目的权限,如图所示。用户权限共有四种,在Rights中分别对应为:R(Read)、C(Check Out/Check In)、A(Add/Rename/Delete)、D(Destroy)。在左边的"Project"框中选择一个项目,并在右边选择相应的用户,使用下面的复选框,给用户分配相应的权限。Tools菜单下的"Rights Assignments for User"用于给选定用户分配权限,操作结果与上面的命令相同。

图十九 VSS项目权限管理
4、 Archive菜单下的"Archive Projects"用于将指定项目打包成*.ssa(SourceSafe Archive)文件,并迁移到其他主机上,使用Archive的"Restore Projects"命令,将该文件恢复到其他主机。这两个命令用于项目的迁移。

总结
使用SourceSafe与VS.Net开发环境,可以为团队开发提供完整的源代码管理方案。通过源代码管理,可以记录项目开发的过程,将文件恢复到项目过程中的某一个点,而又无需在开发环境中保存太多的旧文档备份。

参考信息:
MSDN、Microsoft Visual Studio .NET 文档

作者:潘兆勇
日期:2002-11-3
posted @ 2007-03-02 14:39 Einstein.Pang 阅读(314) | 评论 (0)编辑
一天,Microsoft, Lotus, Novell三家公司的销售经理相约比试枪法.
首先上场的是Microsoft.他一口气灌下两瓶嘉士伯,随手一扬,两个瓶子飞上天空,只听“乒!乒!“两声枪响,瓶子被打的粉碎,“NT遍地开花,Sales 轻松写意!“
Lotus销售经理也不示弱,两瓶XO下肚,轩尼诗曲线玲珑的瓶子两枪搞定..“软件所向披靡,莲花开遍全球!“
压轴出场的Novell销售经理在郁闷郁闷的喝了两瓶二锅头后,疲惫不堪的抛起两个瓶子,颤颤微微的举起枪,
两枪响过------------------------Microsoft和Novell的销售经理应声倒下.Novell的销售经理这才缓缓吐出一句话:
“没有竞争对手的生活是一种幸福。“
posted @ 2007-02-01 17:35 Einstein.Pang 阅读(46) | 评论 (0)编辑
在很多语言的学习中,“事件”都是一个比较难理解,但是又是一个很重要的概念。javascript中的事件处理也是一样,正因为有了事件处理,才会出现Ajax拖动的效果。本文就讨论一下JavaScript中的事件处理,读过之后,您就会知道,很多Ajax框架实现拖动效果的原理了。
一、 IE Event对象
(一)IE Event对象的主要属性和方法
  在IE中有一个专门负责事件处理的对象Event,这个对象负责对事件的处理,含有很多的属性和方法,通过这些方法和属性的调用,就能完成很多的事件处理。
  type:事件的类型,就是HTML标签属性中,没有“on”前缀之后的字符串,例如“Click”就代表单击事件。
  srcElement:事件源,就是发生事件的元素。
  button:声明了被按下的鼠标键,是一个整数。1代表鼠标左键,2代表鼠标右键,4代表鼠标的中间键,如果按下了多个鼠标键,就把这些值加在一起,所以3就代表左右键同时按下。
  clientX/clientY:是指事件发生的时候,鼠标的横、纵坐标,返回的是整数,它们的值是相对于包容窗口的左上角生成的。
  offsetX/offsetY:鼠标指针相对于源元素的位置,可以确定单击Image对象的哪个象素。
  altKey,ctrlKey,shiftKey:顾名思义,这些属性是指鼠标事件发生的时候,是否同时按住了Alt、Ctrl或者Shift键,返回的是一个布尔值。
  keyCode:返回keydown和keyup事件发生的时候,按键的代码以及keypress事件的Unicode字符。
  fromElement、toElement前者是指代mouseover事件移动过的文档元素,后者指代mouseout事件中鼠标移动到的文档元素。
  cancelBubble:一个布尔属性,把它设置为true的时候,将停止事件进一步起泡到包容层次的元素。
  returnValue:一个布尔值属性,设置为false的时候可以组织浏览器执行默认的事件动作,相当于<a href=”#” onclick=”ProcessMethod();return false;” />。
  attachEvent()和detachEvent()方法:为制定DOM对象事件类型注册多个事件处理函数的方法,它们有两个参数,第一个是事件类型,第二个是事件处理函数。在attachEvent()事件执行的时候,this关键字指向的是window对象,而不是发生事件的那个元素。
  (二)IE Event对象的一些说明
  1.IE Event对象是一个全局属性
  在IE中,不能把Event对象作为参数传递给事件处理程序,只能用window.event或者event来引用Event对象。因为在IE中,Event是window的一个属性,也就是说event是一个全局变量,这个变量提供了事件的细节。
  2.IE中事件的起泡:IE中事件可以沿着包容层次一点点起泡到上层,也就是说,下层的DOM节点定义的事件处理函数,到了上层的节点如果还有和下层相同事件类型的事件处理函数,那么上层的事件处理函数也会执行。例如,<div>标签包含了<a>,如果这两个标签都有onclick事件的处理函数,那么执行的情况就是先执行<a>标签的onclick事件处理函数,再执行<div>的事件处理函数。如果希望<a>的事件处理函数执行完毕之后,不希望执行上层的<div>的onclick的事件处理函数了,那么就把cancelBubble设置为false即可。
  
二、 IE中拖动DOM元素的例子
/*
  该函数由mousedown事件处理调用
  它为随后发生的mousemove和mouseup事件注册了临时的捕捉事件处理程序
  并用这些事件处理程序拖动指定的文档元素
  第二个参数必须是mousedown事件的事件对象
*/
function beginDrag(elementToDrag,event)
{
  //该元素当前位于何处
  //该元素的样式性质必须具有left和top CSS属性
  //此外,我们假定他们用象素做单位
  //var x=parseInt(elementToDrag.style.left);
  //var y=parseInt(elementToDrag.style.top);
 
  //计算一个点和鼠标点击之间的距离,下面的嵌套的moveHandler函数需要这些值
  var deltaX=event.clientX-parseInt(elementToDrag.style.left);
  var deltaY=event.clientY-parseInt(elementToDrag.style.top);
 
//  注册mousedown事件后发生的mousemove和mouseup事件的处理程序
//  注意,它们被注册为文档的捕捉事件处理程序
//  在鼠标按钮保持按下的状态的时候,这些事件处理程序保持活动的状态
//  在按钮被释放的时候,它们被删除
  document.attachEvent("onmousemove",moveHandler);
  document.attachEvent("onmouseup",upHandler);
  
  //我们已经处理了该事件,不要让别的元素看到它
 event.cancelBubble=true;
 event.returnValue=false;
 
  /*
    这是在元素被拖动时候捕捉mousemove事件的处理程序,它响应移动的元素
   
  */
  function moveHandler(e) 
  {
    //把元素移动到当前的鼠标位置
    e=window.event;
    elementToDrag.style.left=(event.clientX-deltaX)+"px";
    elementToDrag.style.top=(event.clientY-deltaY)+"px";
   
    //不要让别的元素看到该事件
    event.cancelBubble=true;
   
  }
 
  /*
    该事件将捕捉拖动结束的时候发生的mouseup事件
  */
  function upHandler(e)
  {
    //注销事件处理程序
      document.detachEvent("onmouseup",upHandler);
      document.detachEvent("onmousemove",moveHandler);}
  
      event.cancelBubble=true;
    } 
   调用它的HTML文件代码:
 <html>
 <head>
     <title>Untitled Page</title>
     <script type="text/javascript" src="dragIE.js"></script>
 </head>
 <body>
 <div style="position:absolute;left:100px;top:100px;background-color:White;border:solid black;">
   <div style="background-color:Gray;border-bottom:solid black;padding:3px;font-family:Sans-Serif;font-weight:bold;" onmousedown="beginDrag(this.parentNode,event);">
   拖动我&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   </div>
   <div>
   <p>This is a test.Testing,testing</p></div>
 </div>
 </body>
三、 DOM中的高级事件处理
 IE 6中的事件处理,并不是W3C DOM标准的事件处理模型,所以如果上述代码运行在Mozilla Firefox的浏览器中,就会失去作用,同时即将发布的IE 7也将支持W3C DOM的二级标准,所以掌握DOM的高级事件处理显得就很重要了,因为W3C DOM二级标准是未来Web的发展方向,同时W3C DOM的API非常常用,为未来更加复杂的Web开发提供了良好的基础。
(一)事件处理程序的作用域和事件的传播
  在正式讨论DOM高级事件处理之前,我们有必要了解一下事件处理程序的作用域。事件处理程序的作用域要比普通的函数作用域复杂很多。普通的函数作用域链比较容易,例如在一个普通函数中查找一个变量a,那么JavaScript解释器会先在该函数的调用对象中查找是否有a这个变量,如果没有,将会在作用域链的下一个对象,一般是全局对象中查找。但是事件处理程序没这么简单,特别是用HTML的属性定义的,它们的作用域链的头部是调用它们的对象,而下一个对象并不是全局对象,而是触发事件处理程序的对象。这样就会出现一个问题,window和document都有一个方法open(),如果open()前面不加修饰,那么在事件处理的函数中将会调用document.open()方法,而不是常用的window.open()方法,所以使用的时候应该明确指明是window.open()。
(二)事件传播和注册事件处理程序
1.事件传播
  在二级DOM标准中,事件处理程序比较复杂,当事件发生的时候,目标节点的事件处理程序就会被触发执行,但是目标节点的父节点也有机会来处理这个事件。事件的传播分为三个阶段,首先是捕捉阶段,事件从Document对象沿着DOM树向下传播到目标节点,如果目标的任何一个父节点注册了捕捉事件的处理程序,那么事件在传播的过程中就会首先运行这个程序。下一个阶段就是发生在目标节点自身了,注册在目标节点上的相应的事件处理程序就会执行;最后是起泡阶段,事件将从目标节点向上传回给父节点,同样,如果父节点有相应的事件处理程序也会处理。在IE中,没有捕捉的阶段,但是有起泡的阶段。可以用stopPropagating()方法来停止事件传播,也就是让其他元素对这个事件不可见,在IE 6中,就是把cancelBubble设置为true。
2.注册事件处理程序
  和IE一样,DOM标准也有自己的事件处理程序,不过DOM二级标准的事件处理程序比IE的强大一些,事件处理程序的注册用addEventListner方法,该方法有三个参数,第一个是事件类型,第二个是处理的函数,第三个是一个布尔值,true表示制定的事件处理程序将在事件传播的阶段用于捕捉事件,否则就不捕捉,当事件发生在对象上才触发执行这个事件处理的函数,或者发生在该对象的字节点上,并且向上起泡到这个对象上的时候,触发执行这个事件处理的函数。例如:document.addEventListener("mousemove",moveHandler,true);就是在mousemove事件发生的时候,调用moveHandler函数,并且可以捕捉事件。
  可以用addEventListener为一个事件注册多个事件处理的程序,但是这些函数的执行顺序是不确定,并不像C#那样按照注册的顺序执行。
  在Mozilla Firefox中用addEventListener注册一个事件处理程序的时候,this关键字就表示调用事件处理程序的文档元素,但是其他浏览器并不一定是这样,因为这不是DOM标准,正确的做法是用currentTarget属性来引用调用事件处理程序的文档元素。
3.二级DOM标准中的Event
  和IE不同的是,W3C DOM中的Event对象并不是window全局对象下面的属性,换句话说,event不是全局变量。通常在DOM二级标准中,event作为发生事件的文档对象的属性。Event含有两个子接口,分别是UIEvent和MutationEvent,这两个子接口实现了Event的所有方法和属性,而MouseEvent接口又是UIEvent的子接口,所以实现了UIEvent和Event的所有方法和属性。下面,我们就看看Event、UIEvent和MouseEvent的主要属性和方法。
  1.Event
    type:事件类型,和IE类似,但是没有“on”前缀,例如单击事件只是“click”。
    target:发生事件的节点。
    currentTarget:发生当前正在处理的事件的节点,可能是Target属性所指向的节点,也可能由于捕捉或者起泡,指向Target所指节点的父节点。
    eventPhase:指定了事件传播的阶段。是一个数字。
    timeStamp:事件发生的时间。
    bubbles:指明该事件是否起泡。
    cancelable:指明该事件是否可以用preventDefault()方法来取消默认的动作。
    preventDefault()方法:取消事件的默认动作;
    stopPropagation()方法:停止事件传播。
  2.UIEvent
    view:发生事件的window对象。
    detail:提供事件的额外信息,对于单击事件、mousedown和mouseup事件都代表的是点击次数。
  3.MouseEvent
   button:一个数字,指明在mousedown、mouseup和单击事件中,鼠标键的状态,和IE中的button属性类似,但是数字代表的意义不一样,0代表左键,1代表中间键,2代表右键。
   altKey、ctrlKey、shiftKey、metaKey:和IE相同,但是IE没有最后一个。
   clientX、clientY:和IE的含义相同,但是在DOM标准中,这两个属性值都不考虑文档的滚动情况,也就是说,无论文档滚动到哪里,只要事件发生在窗口左上角,clientX和clientY都是0,所以在IE中,要想得到事件发生的坐标相对于文档开头的位置,要加上document.body.scrollLeft和document.body.scrollTop。
   screenX、screenY:鼠标指针相对于显示器左上角的位置,如果你想打开新的窗口,这两个属性很重要。
   relatedTarget:和IE中的fromElement、toElement类似,除了对于mouseover和mouseout有意义外,其他的事件没什么意义。
(三)兼容于两种主流浏览器的拖动DOM元素的例子
  好了,刚才讲了这么多DOM编程和IE中的事件,那么如何编写兼容IE和Mozilla Firefox两种主流浏览器的拖拽程序呢?代码如下:
function beginDrag(elementToDrag,event)
{
  var deltaX=event.clientX-parseInt(elementToDrag.style.left);
  var deltaY=event.clientY-parseInt(elementToDrag.style.top);
 
if(document.addEventListener)
{
  document.addEventListener("mousemove",moveHandler,true);
  document.addEventListener("mouseup",upHandler,true);
}
else if(document.attachEvent)
{
  document.attachEvent("onmousemove",moveHandler);
  document.attachEvent("onmouseup",upHandler);
 
}
 
  if(event.stopPropagation)   event.stopPropagation();
  else event.cancelBubble=true;
  if(event.preventDefault)  event.preventDefault();
  else event.returnValue=false;
 
  function moveHandler(e) 
  {
  if (!e) e=window.event; //如果是IE的事件对象,那么就用window.event
  //全局属性,否则就用DOM二级标准的Event对象。
    elementToDrag.style.left=(event.clientX-deltaX)+"px";
    elementToDrag.style.top=(event.clientY-deltaY)+"px";
   
     if(event.stopPropagation)   event.stopPropagation();
    else event.cancelBubble=true;
   
  }
 
  function upHandler(e)
  {
       if(document.removeEventListener)
    {
      document.removeEventListener("mouseup",upHandler,true);
      document.removeEventListener("mousemove",moveHandler,true);}
      else
    {
      document.detachEvent("onmouseup",upHandler);
      document.detachEvent("onmousemove",moveHandler);}
    }
      if(event.stopPropagation)   event.stopPropagation();
    else event.cancelBubble=true;
   
  }
posted @ 2007-01-31 12:50 Einstein.Pang 阅读(81) | 评论 (0)编辑
     摘要: 进入底层这篇文章以非常底层的视角讲述了Web请求(request)在ASP.NET框架中是如何流转的,从Web服务器,通过ISAPI直到请求处理器(handler)和你的代码.看看在幕后都发生了些什么,不要再把ASP.NET看成一个黑盒了.ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用.绝大多数的人只熟悉高层的框架如WebFo...  阅读全文
posted @ 2007-01-23 15:46 Einstein.Pang 阅读(100) | 评论 (0)编辑
核心提示:杭州两个姑娘爱上了同一个男人,三方会谈时,男人说如果两个女人不早日解决矛盾,他就谁也不要了。结果两女突发奇想,带着各自的拉拉队,上街决斗争夫。

昨天,在杭州采荷派出所听说两件让人哭笑不得的事情。为这两件事情,派出所值班民警忙了一个通宵。

爱上了同一个男人

上星期五晚上8点左右,一位大伯报警,说有个女的手拿电喇叭,站在楼下叫个不停,大意是让楼上一户人家的女儿,不要再跟一个男好了。

因为她已经抢先了!

“XX,我现在警告你,赶快离开某某某!”民警赶到现场,一个20岁左右的女孩手举喇叭,还在仰着脖子喊着。

见警察来了,她停下了。

这时,从二楼下来一位大妈。大妈说,姑娘叫的是她的女儿的名字。

民警带大妈和喊话姑娘一起到了派出所。

大妈说,从上个月开始,这个喊话的姑娘就隔三岔五来她家敲门。第一次,大妈拉开门,还没反应过来,她就指着大妈的鼻子说:“跟你女儿说一声,我来过了,让她离开XXX。”

大妈觉得太丢人了,批评女儿,女儿又不听。老两口只好盯着女儿不让她出门。可女儿还是偷偷出去了。每次都是女儿出门没多久,这个女的就上门来“警告”。

“她敲门,又不能不开,不开,她准把门给敲破。弄得整个小区都能听到咚咚敲门声。”大妈皱起眉头,“世界上那么多男人,死丫头怎么偏偏就喜欢上那个脚踩两条船的呢?”

喊话姑娘说,“是啊,我是上她家敲过门。我那是上门警告。上门警告不行,我只好拿着喇叭站在楼底下喊了。”

民警问姑娘,“那个男的真的喜欢你吗?”她毫不犹豫地说,“当然了,不喜欢我,我还去喊话呀?我傻呀?”

爱上了同一个男人

值班民警处理完姑娘喊话的事,已是后半夜了。这时,又来了一个报警电话:双菱路上两个姑娘打起来了。

打架的两个姑娘也是20岁左右。

民警赶到现场,她们还互相扯着头发扭作一团。她们的身后,各站着一支队伍,为各自的“运动员”呐喊。民警大喊“别打了!”但她们头也不回,继续打。边打还边喊:“这儿没别人的事!”没办法,民警只好上前,硬将她们拉开,带回派出所。

两个姑娘都是杭州人。两个姑娘爱上了同一个男人。

据说,这个男人对她们的感情自己也分不出高低来。两个姑娘曾当街对骂过,也曾把这个男人找来,三方会谈,逼男人表态,选谁?男人拂袖而去,说如果两个女人不早日解决矛盾,他就谁也不要了。

后来,两人通过中间人协商,决定以决斗的方式解决情感纠葛。两人商定,决斗分出胜负后,两人签定一份出“让协议”。输的一方自动退出。站在一旁助阵的,都是双方请来的见证人。

民警听了哭笑不得。问她们,决斗后,男人真的就会接受胜利一方?两个姑娘答:这是另外一回事,先决斗了再说。《都市快报》供稿记者严峰 (杭州网-都市快报)张琳

posted @ 2007-01-04 11:30 Einstein.Pang 阅读(175) | 评论 (0)编辑
核心提示:吉林的刘国强做梦都没想到,乡畜牧站的防疫员来给自家的狗注射狂犬疫苗时竟把针头扎进了自己的胳膊里,刘国强随后因突发高烧等症状住进医院。而畜牧站却称,是刘国强疏忽大意不慎将碰到了防疫员手中的针头上。

就是这个药扎到了人身上


狗主人

■记者 谭志斌 报道/摄

本报白城电 白城市洮北区东风乡长发村的刘国强做梦都没想到,乡畜牧站的防疫员来给自家的狗注射狂犬疫苗时竟把针头扎进了自己的胳膊里,刘国强随后因突发高烧等症状住进医院。昨日,记者在医院的病房见到刘国强时,他已经在这里住院一个月了。“医院说没见过这样的病例,建议我转院,我现在也想找个权威的医院,弄明白人被打了狗的疫苗后,会不会留下什么后遗症,但畜牧站的人却不肯配合……”刘国强告诉记者。

当事人:打针打得我发高烧

事出2006年12月4日。“那天下午大概3点多,乡畜牧站来了几个人说是要给我家的4条‘黑背’打狂犬疫苗, 因为担心狗咬着人,他们就让我帮忙看着点,我同意了。”刘国强告诉记者,前3条狗的疫苗注射进行得十分顺利。剩最后一条时,刘国强和之前一样用双手按住狗的嘴巴,大腿顶住狗的脊背,准备工作完成后,刘国强突然觉得自己的左臂钻心一痛,像是被针刺了一下。“哎呀,你怎么打我身上了?”刘国强说,他当时下意识地喊了一嗓子,转身发现防疫员手里的针管已经空了。这时,其他几名畜牧站的工作人员告诉他,即便打进去了也没事。

防疫员离开刘家半小时后,刘国强觉得挨了一针的左臂越来越疼,而且整条胳膊和面部开始发热,妻子急忙找来畜牧站的工作人员,由畜牧站出车把刘国强送到医院检查。刘国强说,他到医院时已经有了眩晕的感觉。

医院:建议转院进一步诊治

在病房里,记者见到了当天防疫员给狗注射的疫苗空瓶,瓶身上标有“兽用”标志,随附的说明书上也明确标注该疫苗是专门用来给犬类注射的狂犬疫苗。至于这种疫苗被注射进人体后到底会不会有不良反应甚至后遗症,成了刘国强及其家人迫切想知道的,但他们在当地医生那里没得到准确的答复。“我还记得防疫员给这几条狗打针的时候,针头针管都没换过,现在想想就后怕。”刘国强说,他现在虽然不像刚开始那样发高烧,但还有晕的症状。

刘国强的家人向记者出示了一份医院出具的诊断证明书。记者在诊断书病情摘要一栏看到刘国强是因脸红、心悸入院,并在患者左肘关节发现一处针孔,建议刘国强到上一级医院进一步诊治。谈及为什么不接受建议转院治疗,刘国强及其家人表示,他们已经花了不少医疗费,但乡畜牧站不肯承担转院费用,他们家里根本拿不出这笔钱。

畜牧站:没必要继续治疗

记者昨日未能联系到洮北区东风乡畜牧站的负责人,但在刘国强处,记者看到一张带有“东风乡畜禽防疫服务中心”公章的关于此事的书面处理意见书:“刘国强没有必要再继续住院治疗……可通过法律诉讼程序解决。”而且“如果刘国强再继续在医院治疗,故意扩大经济损失……我站将不负任何责任。”

在该处理意见中,东风乡畜牧站得出的情况调查结论是,当天是刘国强自己要求按着狗,让防疫员注射。在给第4条狗注射时,因刘国强疏忽大意没按住,在用胳膊压狗的过程中不慎碰到了防疫员手中的针头上。事后刘国强在医院并未检查出什么病症,各项检查结果都显示正常,他却仍不出院,而且自行调换病房规格,有故意扩大经济损失嫌疑,所以畜牧站在为刘国强支付了部分医疗费后提出让刘出院,通过法律方式解决此事。

对于畜牧站2006年12月26日出具的这份处理意见,刘国强明确表示不同意。“我现在要求畜牧部门配合我到上级医院做出确切诊断,如果这疫苗不会给我带来其他不良后果,我也不会无故纠缠他们的,但这点要求他们都不答应。”刘国强对记者说。 王嘉亮

posted @ 2007-01-04 11:27 Einstein.Pang 阅读(167) | 评论 (0)编辑

史上死得最窝囊的皇帝,是东晋孝武帝司马矅。

这位老哥跟大多数皇帝一样,沉迷于声色,成天搂着嫔妃喝酒。一次喝醉了,跟宠妃张贵人吵架,注意,是吵架,不是皇帝训斥妃子,而是皇帝和妃子你一句我一句对骂的吵架。最后司马同学给惹急了,甩出一句赌气的话:“俺不理你了!俺那么多妃子,俺找别人去!”说完,倒头呼呼大睡了。

还在那儿清醒着的张贵人开始琢磨了,老家伙要不理我了?找别人去,那哪儿能行?!现在我这么年轻美貌,你就不理我了,那将来等我老了,还有好日子过啊?!越想越气,越想越不妙,最后,张女士一咬牙,一狠心,招来几个宫女,搬了几床大被子,三下五除二,把还在香甜睡梦中的司马同学给活活捂死了。

可怜纯真的司马同学,为了小两口拌嘴的这么一句气话,丢了几辈子才修来的一条皇帝命。

据说,史上死得最离奇的,是春秋时晋国的国君晋景公姬。

这老哥是真正掌握生杀大权的一代国君,上了年纪,多少有点老年病。晋国的一位算命先生,大概是活腻味了,跟国君说,您老咧,活不过今年吃新麦子的时候了,姬老先生一听当然不痛快了,到了当年新麦子下来的时候,把算命的招来,捧着饭碗说:你看,你说朕活不到吃新麦子,朕这就吃给你看!不过,你得先给朕死,谁叫你算得不准!说罢叫人把算命的推出去砍了。

姬老头子端起饭碗,刚要吃,突然觉得肚子不舒服,跟左右说,不成,朕得先去上趟茅房,说着放下碗出去了。左右侍从左等右等,饭都凉了,还不见国君回来,咋回事呢?私下分头去找,宫里哪儿都找不到,最后,在茅房发现了姬老先生,原来掉进了粪坑里,已然薨了……

后来有人赞扬说,姬老先生是第一个殉难于厕所的帝王……

一向以文笔简洁有力著称的《左传》,仅用了一句话描写这一事件:“将食,涨,如厕,陷而卒”。

不记得谁问过我了,什么叫傻缺?我说,好像就是傻冒加缺心眼儿吧。我觉着,以下两位可以竞争死得最傻缺的皇帝……

一位是秦国的君王泰武王赢荡。其实这位国君多好的前途啊,17岁即位,年轻有为,秦国也国势鼎盛,诸侯皆惧。哪儿哪儿都好,就是有点傻缺,喜欢跟人家比力气,见什么都不服不吝,尤其看不得大玩意。23岁那年外出,看见人家洛阳的大鼎,较上劲了,听说姓孟的大力士能举起来,非说自己也能举起来,结果还真举起来了,可是没抗住,掉下来砸断了大腿,搁着当时医疗条件也差点,没过两天就死在洛阳了。

另一位最傻缺奖的候选人,不是帝王,但是怎么说也是金枝玉叶呀,汉武帝的儿子,名头够响的吧,广陵王刘胥。这位刘同学也是好胚子,天生的身强体壮,勇力过人。可是您再能耐,也不能喜欢这么变态的活动吧。刘同学不爱金银美女,就喜欢跟狗熊打架。据说他在自己的封地里有一个很大的熊苑,里面豢养着棕熊,灰熊,黑熊,马来熊,白熊……总之,刘同学成天啥也不干,就琢磨着怎么跟熊掐架,还为此请了老师。隔三差五的,进熊苑去揪出一只熊来一顿胖揍,英雄啊!不过呢,英雄也有失手的时候,终于有一天,刘同学遇着厉害熊了,打着打着,被狗熊给挠死了……

你说堂堂汉武帝,多英明天纵啊,怎么生这么个宝贝儿子……

大家认为,赢同学和刘同学,谁更配得上最傻缺奖呢,俺比较心仪刘同学哦……

嗯,故事讲到这里,我们也该总结总结了,学习历史嘛,就是要以史为鉴,我们学到了什么呢?我以为,有以下几点是我们今后一定要借鉴的:

1.小两口吵架,不要说气话;

2.算命的说点什么,还是要当真的;

3.举重是危险运动,没受过专业训练,千万别尝试;

4.人是掐不过野兽的,尤其是狗熊,不到生死关头,千万别逞能;

5.最后,也是最重要的,上厕所,尤其是去便便,可千万不能着急啊……

来源:中华文摘

posted @ 2006-12-31 14:54 Einstein.Pang 阅读(399) | 评论 (1)编辑