对于企业信息化的一点感悟

1、对于很多企业,已经实现办公无纸化,大部分的工作都是通过word和excel等办公软件实现。很多企业在此基础上提出信息化建设,实现办公自动化、网络化,也就是通常所说的建立业务系统。总结多个企业信息系统的建设,其实要实现的功能无非就是保留原有工作人员所熟悉的操作方式,如word和excel等,这样原来的表形式(表结构)还都能就继续使用,工作人员很容易适应系统。而这个过程的实质就是实现xls、doc这样的非结构化数据的结构化。达到:数据可以复用,减少冗余工作,很多冗余表的制作就变成了多样化的select。而这个过程矛盾的转化就在于:将工作人员的繁琐工作转化为计算机和开发人员的处理

2、在软件系统的开发中,先将功能原型抽象出来并进行实现是非常有用的:第一,不必首先理会繁杂的业务逻辑关系;第二,可适应不同的业务逻辑关系,灵活性好。

Discuz RSS订阅页面地址

如果希望实现在自己的站点上实时显示相关论坛的最新帖子,可以利用Discuz的RSS。

Discuz论坛的默认RSS页面地址:

http://yourdomainname/forum.php?mod=rss&auth=0

拿Discuz的官方论坛为例,其地址为:

http://www.discuz.net/forum.php?mod=rss&auth=0

如果直接在浏览器中访问该地址,会提示下载,下载的文件名为forum.php。这个文件不是代码文件,而是RSS的最新数据。

打开此文件,结果如下图:
discuz_forum_rss

 

剩下的就是解析该文件啦。

 

PLSQL远程连接数据库错误:监听程序当前无法识别连接描述符中请求的服务

远程服务端配置

1. 数据库配置
因为要为外界客户端提供数据服务,所以一定要将 [数据库操作模式] 配置为 “共享服务模式”. 我就是犯了这个错误,将操作模式配置成了”专用服务器模式”,导至远程客户端无法正常连接.
如果不能确定数据库的操作模式,可以打开ORACLE “Database Configuration Assistant” 工具的 “在数据库中配置数据库选项” 进行配置.
如果新建数据库一定不要忘了将 [数据库操作模式] 配置为 “共享服务模式”.

2. 数据库服务
确定数据库服务已经启动.
方法: 命令行 下键入 “services.msc”
在 WINDOWS服务 窗口中找到您的数据库服务(一般都以 OracleService数据库实例名 的形式命名),查看是否为”已启动”状态,否则请启动该服务.

3. 监听程序
确定数据库已经附加到监听程序中,并且监听程序已启用.
方法: 命令行 下键入 “lsnrctl”
在 lsnrctl控制台 窗口中键入 “services 监听程序名”
如果出现 “摘要信息” 则说明监听程序已启动
如果出现 “无监听器” 字样,说明监听程序未被启动
在 lsnrctl控制台 窗口中键入 “start 监听程序名” 以启动监听程序
也可在 命令行 下键入 “services.msc”
在 WINDOWS服务 窗口中找到您的监听程序服务(一般都以 OracleOraHome92TNSListener监听程序名 的形式命名,默认的监听程序服务名为 “OracleOraDb10g_home1TNSListener”),查看是否为”已启动”状态,否则请启动该服务.

4. 网络状态
确定监听程序所使用的端口已被列入防火墙允许的行列.

本地客户端配置

1. 测试连接
方法: 命令行 下键入 “tnsping 服务端IP地址”
如果出现 “OK(XX毫秒)” 字样,说明可以与服务端建立连接.否则请检查服务端配置.

2. 添加服务名
方法:
1、打开ORACLE “Net Configuration Assistant” 工具 -> “本地NET服务名配置” ;
2、 “添加” -> 选择ORACLE数据库或服务-> 输入服务名(建库时输入的全局数据库名:oracle10默认是o10g) ;
3、TCP -> 主机名中输入服务端IP地址,端口输入服务端监听程序所监听的端口;
4、是,进行测试 -> 首次测试可能会失败,因为默认的用户名口令不一定和服务端的匹配,点击 更改登录 输入有效用户名和口令确定后如出现”测试成功”,说明连接成功;
5、点击 下一步 -> 输入本地服务名 -> 直到完成.

3. 登录数据库
在SQLPLUS中以sys用户登录时的设置格式如下:

数据库连接池

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:
1) 最小连接数
  是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;
2) 最大连接数
  是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。
3) 如果最小连接数与最大连接数相差太大
  那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

ASPX网站运行原理(转自:ASP.NET运行机制)

1.ASP.NET运行原理概述

 

  如上图,当一个http请求发送过来并被IIS机收到之后,IIS首先通过你请求的页面类型为其加载相应的dll文件,然后在处理过程中将这条请求发送给能够处理这条请求的模块,而在ASP.NET中这个模块就叫做HttpHandler,为什么aspx这样的文件可以被服务器处理,那是因为在服务器端有默认的HttpHandler专门处理aspx文件,IIS再将这条请求发送给能够处理这条请求的模块之前,还需要经过一些HttpModule,这些都是系统默认的Modules,而且在这个http请求传到HttpHandler之前要经过不同的HttpModuls的处理,这就像我们如果要乘坐国际航班飞抵异国他乡的话,在 你真正坐上飞机前,要经过购买机场建设费,办理登记手续核实身份,进行行李打包托运,进行安全检察,现在又要进行体温等检察一样,需要经一系列的严格的手 续。这样做有什么好处,一是为一些必须的过程,二是为了安全性,三是为了提高效率,四是为了我们能够在更多的环节上进行控制,即增强了我们的控制能力。而 上述的都是系统的,怎么能说是我们的对http请求控制能力能,那么我们是否可以建立自己的HttpModule和HttpHandler吗?答案是肯定的。但我们先不要急于做事,让我们再深入研究一下运行机制吧。

2.ASP.NET运行机制

 

  那么上面这张图让我们能够更清楚地看到一个http请求是如何经过服务器的处理的,同时通过这张图我们也可以看出Request是掌管着所有客户端输入的。图中为我们展示了一个http请求有可能经过的四条路线。当你第一次访问这个页面时这个请求首先依次经过HttpModuls和HttpHandler的处理,而在HttpHandler的处理中服务器会为你转到你真正要访问的页面,然后通过ASP Engine来找到这个页面背后的类,并实例化为一个临时对象,再此过程中会触发一系列的事件,其中一部份的事件需要经过对象中的方法处理,之后服务器会将这个处理后页面发移交给Response对象,然后由Response对象将这个页面发送到客户端。这就是第一条路线,而当你在这个页面上进行重新提交一些信息,并继续向服务器发送请求时,因为你的服务器之间的会话已经建立,对于你所在的那个临时对象在服务器中已经建立,所以不用再经过初始化页面的工作,故这第二条路线是按照 HttpModuls,HttpHandler,然后直接与临时对象交互,然后返回的。第三条路线与第二条不同的是在处理请求时如果涉及到需要调用ASP Cache,既ASP 缓存的,而临时对象回将直接从ASP 缓存提取信息并返回.这第四条路线就是当你刷新这个页面的时候,服务器接收到时发现这个请求先前已经处理过了,并将处理结果存储到由一个默认的HttpModule管理的输出缓存中了,那么我们就可以直接从这个缓存提取信息并返回,而无需再重新处理一遍了。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/flashlm/archive/2007/07/06/1681487.aspx

给站长们的一些意见

1,千万别做大而全的网站。它会累死你。而且还没什么成效。做网站要有所创新。

2,千万不要把希望全都寄托在搜索引擎上。

3,该花的钱要花。例如你的网站已经发展到需要独立服务器。

4,坚持访客就是上帝的原则设计你的网站。

5,定期给自己的网站定一个目标。

6,该赚的钱要赚。不该赚的别赚。得有原则。虽然日子还是要过的。

7,少得罪人,否则容易被人DDOS,有时间多帮助别人。总有一天你也会得到别人的帮助。

8,如果你确信你可以比别人做的更好更有优势,那你就做个和别人一样的网站吧。跟风也不是不可以,例如跟国外网站的风。

9,把80%以上的时间花在你的网站建设上。多参照其它比较成功的网站,研究为什么别人要那么做。

10,要擅于利用自己的资源。例如你认识某某大站站长,你可以与他互换一个链接以增加网站曝光率。

 

转自CNZZ

php“内存位置访问无效”错误的解决办法

突然发现网页登不上去了,提示错误“内存位置访问无效”。但服务器上ASP的站点可以运行,于是猜想应该是PHP出现了错误。

配置环境如下:

Win2003SP2+IIS6+php5.26+mysql5.0.51a+zend3.3a+PhpMyAdmin2.11.7.1 PHP执行方式:isapi。Mysql为手动安装。

关于“内存位置访问无效”的错误解决办法与步骤:(前三步可忽略)

一、将IIS的错误显示打开,未发现错误原因!

二、检查IIS扩展,ISAPI、php.ini与Mysql配置以及相应的安装目录ACLs权限,均无误。

三、回收IIS进程,错误仍然出现”内存位置访问无效”….

四、将php.ini中 display_startup_errors = On 打开,重新启动IIS,问题所在终于发现了… (注:如果将php.ini的display_startup_errors打开,如果php有错误出理,就会提示,而且在事件查看器中有记录。如果设置为display_startup_errors = Off,则不会有任何提示)

五、Warning

Cannot load module ‘SQLite’ because required module ‘pdo’ is no loaded

上面这条错误信息终于被发现了。大概意思就是因为php.ini配置中开启了SQLite桌面数据库的支持,但未开启相关的pdo模式,pdo模块加载失败…..

六、解决办法也很简单了,因为加载php_sqlite.dll时未加载到php_pdo.dll文件,所以运行phpinfo()函数时提示内存 位置访问无效。找到php.ini配置文件,然后去掉”;extension=php_pdo.dll”前面的分号, extension=php_sqlite.dll

然后再回收一下IIS应用程序池进程,问题彻底解决….

hoho,希望对遇到此问题的朋友有点儿帮助…

禁止搜索引擎收录的方法

1. 什么是robots.txt文件?

搜索引擎使用spider程序自动访问互联网上的网页并获取网页信息。spider在访问一个网站时,会首先会检查该网站的根域下是否有一个叫做 robots.txt的纯文本文件,这个文件用于指定spider在您网站上的抓取范围。您可以在您的网站中创建一个robots.txt,在文件中声明 该网站中不想被搜索引擎收录的部分或者指定搜索引擎只收录特定的部分。
请注意,仅当您的网站包含不希望被搜索引擎收录的内容时,才需要使用robots.txt文件。如果您希望搜索引擎收录网站上所有内容,请勿建立robots.txt文件。

2. robots.txt文件放在哪里?

robots.txt文件应该放置在网站根目录下。举例来说,当spider访问一个网站(比如 http://www.abc.com)时,首先会检查该网站中是否存在http://www.abc.com/robots.txt这个文件,如果 Spider找到这个文件,它就会根据这个文件的内容,来确定它访问权限的范围。

网站 URL
相应的 robots.txt的 URL

http://www.w3.org/
http://www.w3.org/robots.txt

http://www.w3.org:80/
http://www.w3.org:80/robots.txt

http://www.w3.org:1234/
http://www.w3.org:1234/robots.txt

http://w3.org/
http://w3.org/robots.txt

3. 我在robots.txt中设置了禁止百度收录我网站的内容,为何还出现在百度搜索结果中?

如果其他网站链接了您robots.txt文件中设置的禁止收录的网页,那么这些网页仍然可能会出现在百度的搜索结果中,但您的网页上的内容不会被抓取、建入索引和显示,百度搜索结果中展示的仅是其他网站对您相关网页的描述。

4. 禁止搜索引擎跟踪网页的链接,而只对网页建索引

如果您不想搜索引擎追踪此网页上的链接,且不传递链接的权重,请将此元标记置入网页的 <HEAD> 部分:
<meta name="robots" content="nofollow">
如果您不想百度追踪某一条特定链接,百度还支持更精确的控制,请将此标记直接写在某条链接上:
<a href="signin.php" rel="nofollow">sign in</a>
要允许其他搜索引擎跟踪,但仅防止百度跟踪您网页的链接,请将此元标记置入网页的<HEAD> 部分:
<meta name="Baiduspider" content="nofollow">

5. 禁止搜索引擎在搜索结果中显示网页快照,而只对网页建索引

要防止所有搜索引擎显示您网站的快照,请将此元标记置入网页的<HEAD>部分:
<meta name="robots" content="noarchive">
要允许其他搜索引擎显示快照,但仅防止百度显示,请使用以下标记:
<meta name="Baiduspider" content="noarchive">
注:此标记只是禁止百度显示该网页的快照,百度会继续为网页建索引,并在搜索结果中显示网页摘要。

6. 我想禁止百度图片搜索收录某些图片,该如何设置?

禁止Baiduspider抓取网站上所有图片、禁止或允许Baiduspider抓取网站上的某种特定格式的图片文件可以通过设置robots实现,请参考“robots.txt文件用法举例”中的例10、11、12。

7. robots.txt文件的格式

"robots.txt"文件包含一条或更多的记录,这些记录通过空行分开(以CR,CR/NL, or NL作为结束符),每一条记录的格式如下所示:
"<field>:<optional space><value><optional space>"
在该文件中可以使用#进行注解,具体使用方法和UNIX中的惯例一样。该文件中的记录通常以一行或多行User-agent开始,后面加上若干Disallow和Allow行,详细情况如下:
User-agent:
    该项的值用于描述搜索引擎robot的名字。在"robots.txt"文件中,如果有多条User-agent记录说明有多个robot会受 到"robots.txt"的限制,对该文件来说,至少要有一条User-agent记录。如果该项的值设为*,则对任何robot均有效, 在"robots.txt"文件中,"User-agent:*"这样的记录只能有一条。如果在"robots.txt"文件中,加入"User- agent:SomeBot"和若干Disallow、Allow行,那么名为"SomeBot"只受到"User-agent:SomeBot"后面的 Disallow和Allow行的限制。
Disallow:
    该项的值用于描述不希望被访问的一组URL,这个值可以是一条完整的路径,也可以是路径的非空前缀,以Disallow项的值开头的URL不会被 robot访问。例如"Disallow:/help"禁止robot访问/help.html、/helpabc.html、/help /index.html,而"Disallow:/help/"则允许robot访问/help.html、/helpabc.html,不能访问 /help/index.html。"Disallow:"说明允许robot访问该网站的所有url,在"/robots.txt"文件中,至少要有一 条Disallow记录。如果"/robots.txt"不存在或者为空文件,则对于所有的搜索引擎robot,该网站都是开放的。
Allow:
    该项的值用于描述希望被访问的一组URL,与Disallow项相似,这个值可以是一条完整的路径,也可以是路径的前缀,以Allow项的值开头的URL 是允许robot访问的。例如"Allow:/hibaidu"允许robot访问/hibaidu.htm、/hibaiducom.html、 /hibaidu/com.html。一个网站的所有URL默认是Allow的,所以Allow通常与Disallow搭配使用,实现允许访问一部分网页 同时禁止访问其它所有URL的功能。
使用"*"and"$":
Baiduspider支持使用通配符"*"和"$"来模糊匹配url。
"$" 匹配行结束符。
"*" 匹配0或多个任意字符。

8. URL匹配举例

Allow或Disallow的值
URL
匹配结果

/tmp
/tmp
yes

/tmp
/tmp.html
yes

/tmp
/tmp/a.html
yes

/tmp
/tmp
no

/tmp
/tmphoho
no

/Hello*
/Hello.html
yes

/He*lo
/Hello,lolo
yes

/Heap*lo
/Hello,lolo
no

html$
/tmpa.html
yes

/a.html$
/a.html
yes

htm$
/a.html
no

9. robots.txt文件用法举例

例1. 禁止所有搜索引擎访问网站的任何部分
下载该robots.txt文件
User-agent: *
Disallow: /

例2. 允许所有的robot访问
(或者也可以建一个空文件 "/robots.txt")
User-agent: *
Allow: /

例3. 仅禁止Baiduspider访问您的网站
User-agent: Baiduspider
Disallow: /

例4. 仅允许Baiduspider访问您的网站
User-agent: Baiduspider
Allow: /
User-agent: *
Disallow: /

例5. 仅允许Baiduspider以及Googlebot访问
User-agent: Baiduspider
Allow: /
User-agent: Googlebot
Allow: /
User-agent: *
Disallow: /

例6. 禁止spider访问特定目录
在这个例子中,该网站有三个目录对搜索引擎的访问做了限制,即robot不会访问这三个目录。需要注意的是对每一个目录必须分开声明,而不能写成 "Disallow: /cgi-bin/ /tmp/"。
User-agent: *
Disallow: /cgi-bin/
Disallow: /tmp/
Disallow: /~joe/

例7. 允许访问特定目录中的部分url
User-agent: *
Allow: /cgi-bin/see
Allow: /tmp/hi
Allow: /~joe/look
Disallow: /cgi-bin/
Disallow: /tmp/
Disallow: /~joe/

例8. 使用"*"限制访问url
禁止访问/cgi-bin/目录下的所有以".htm"为后缀的URL(包含子目录)。
User-agent: *
Disallow: /cgi-bin/*.htm

例9. 使用"$"限制访问url
仅允许访问以".htm"为后缀的URL。
User-agent: *
Allow: /*.htm$
Disallow: /

例10. 禁止访问网站中所有的动态页面
User-agent: *
Disallow: /*?*

例11. 禁止Baiduspider抓取网站上所有图片
仅允许抓取网页,禁止抓取任何图片。
User-agent: Baiduspider
Disallow: /*.jpg$
Disallow: /*.jpeg$
Disallow: /*.gif$
Disallow: /*.png$
Disallow: /*.bmp$

例12. 仅允许Baiduspider抓取网页和.gif格式图片
允许抓取网页和gif格式图片,不允许抓取其他格式图片
User-agent: Baiduspider
Allow: /*.gif$
Disallow: /*.jpg$
Disallow: /*.jpeg$
Disallow: /*.png$
Disallow: /*.bmp$

例13. 仅禁止Baiduspider抓取.jpg格式图片
User-agent: Baiduspider
Disallow: /*.jpg$

10. robots.txt文件参考资料

robots.txt文件的更具体设置,请参看以下链接:
Web Server Administrator’s Guide to the Robots Exclusion Protocol
HTML Author’s Guide to the Robots Exclusion Protocol
The original 1994 protocol description, as currently deployed
The revised Internet-Draft specification, which is not yet completed or implemented

以上文档摘自《百度帮助中心》http://www.baidu.com/search/robots.html

如何开启Windows远程桌面服务 | 远程操作自己的电脑

如何开启Windows远程桌面服务?

那么,如何手动开启Windows远程桌面服务呢?
(1)Windows XP、Windows 2003 中
第一步:在桌面“我的电脑”上点鼠标右键,选择“属性”。
第二步:在弹出的“系统属性”窗口中选择“远程”标签。
第三步:在“远程”标签中找到“远程桌面”,在“允许用户远程连接到此计算机”复选框前打上对勾后确定。
第四步:注意Windows防火墙中的例外“远程桌面”要生效。
重启系统后,具有管理员权限的用户就可以远程访问远程桌面了。
clip_image001
clip_image003

最后,有几点需要注意的地方:
1)登录远程桌面的Windows用户,至少是 Remote Desktop User 用户组的成员。当然 Administrators 组也是可以的。
2)登录远程桌面的用户名,必须是带有密码的。空密码的账号是无法登录的。
3)Windows 7 比较烦人的是,防火墙策略比较复杂,它还分为家庭网络、工作网络、公共网络什么的。各个不同类型的网络防火墙设置都是独立的。所以当你的网卡被设置为不同的网络类型的时候(一般是连接到新的局域网或插入新的网线,导致IP发生变化),就是会出现连不上的情况。一般做法是,全部给他设置为家庭网络。。。。
4)如果Windows远程桌面服务以前没有启用,是刚刚才启用的,那么需要重新启动一下电脑才能进行连接。
5)注意其它第三方防火墙的拦截。像金山的、360的等等。
6)另外还有种情况,就是那种第三方定制打包的XP安装盘,如雨木林风(ymlf)XP、电脑城装机XP,GhostXP等等什么一键安装的Windows系统,基本上都以安全为由,把远程桌面服务从系统里给砍掉了,导致系统的远程桌面服务完全不可用,即使从选项上开启了,仍然用不了远程桌面。某些第三方打包的Vista、Win7也是这样的情况。

(2)Win7、Windows 2008 中
第一步:在桌面“计算机”上点鼠标右键,选择“属性”。
第二步:在弹出的窗口中,从左边,选择“远程设置”。
第三步:在“远程”标签中找到“远程桌面”,选择“允许运行任意版本远程桌面的计算机连接(较不安全)”。
第四步:注意Windows防火墙中的例外“远程桌面”要生效。
重启系统后,具有管理员权限的用户就可以远程访问远程桌面了。

如何通过windows live writer离线发布博客文章?

是不是每次用WordPress写文章都得登录博客后台然后添加?有时如果网速很卡,网页打不开,写一篇日志就要花很长时间。其实,有很多桌面客户端支持WordPress,从而实现离线撰写发布文章。

大家可以参看我转载的一篇文章,里面列举了很多博客发布桌面客户端。

WordPress桌面发布客户端(PC客户端与手机客户端)

这里给大家推荐一下Windows Live Writer。个人用着很不错。

大家可以通过360软件管家等搜索到这款软件。

安装之后,会有这么个问题:在桌面找不到软件的快捷方式。

不知道安装程序怎么搞的,为什么懒得把快捷方式放到桌面上。

其实,要找到也很简单。一般通过以下路径即可找到:C:\Program Files\Windows Live\Writer。

image

image

image 

通过Windows live writer,就可以不必每次将截图先保存成文件再上传,而是截图后直接粘贴至文章即可。还有一个很方便的地方在于:

在日志编辑区下方有image “数据域”的文本框。在这里输入后,即为文章的英文名称。

JS的IE和Firefox兼容性汇总

以下以 IE 代替 Internet Explorer,以 MF 代替 Mozzila Firefox

1. document.form.item 问题
(1)现有问题:
现有代码中存在许多 document.formName.item(“itemName”) 这样的语句,不能在 MF 下运行
(2)解决方法:
改用 document.formName.elements[“elementName”]
(3)其它
参见 2

2. 集合类对象问题
(1)现有问题:
现有代码中许多集合类对象取用时使用 (),IE 能接受,MF 不能。
(2)解决方法:
改用 [] 作为下标运算。如:document.forms(“formName”) 改为 document.forms[“formName”]。
又如:document.getElementsByName(“inputName”)(1) 改为 document.getElementsByName(“inputName”)[1]
(3)其它

3. window.event
(1)现有问题:
使用 window.event 无法在 MF 上运行
(2)解决方法:
MF 的 event 只能在事件发生的现场使用,此问题暂无法解决。可以这样变通:
原代码(可在IE中运行):
<input type=”button” name=”someButton” value=”提交” onclick=””/>

<script language=”javascript”>
function gotoSubmit() {

alert(window.event);     // use window.event

}
</script>

新代码(可在IE和MF中运行):
<input type=”button” name=”someButton” value=”提交” onclick=””/>

<script language=”javascript”>
function gotoSubmit(evt) {
evt = evt ? evt : (window.event ? window.event : null);

alert(evt);              // use evt

}
</script>
此外,如果新代码中第一行不改,与老代码一样的话(即 gotoSubmit 调用没有给参数),则仍然只能在IE中运行,但不会出错。所以,这种方案 tpl 部分仍与老代码兼容。

4. HTML 对象的 id 作为对象名的问题
(1)现有问题
在 IE 中,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能。
(2)解决方法
用 getElementById(“idName”) 代替 idName 作为对象变量使用。

5. 用idName字符串取得对象的问题
(1)现有问题
在IE中,利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象,在MF 中不能。
(2)解决方法
用 getElementById(idName) 代替 eval(idName)。

6. 变量名与某 HTML 对象 id 相同的问题
(1)现有问题
在 MF 中,因为对象 id 不作为 HTML 对象的名称,所以可以使用与 HTML 对象 id 相同的变量名,IE 中不能。
(2)解决方法
在声明变量时,一律加上 var ,以避免歧义,这样在 IE 中亦可正常运行。
此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。
(3)其它
参见 问题4

7. event.x 与 event.y 问题
(1)现有问题
在IE 中,event 对象有 x, y 属性,MF中没有。
(2)解决方法
在MF中,与event.x 等效的是 event.pageX。但event.pageX IE中没有。
故采用 event.clientX 代替 event.x。在IE 中也有这个变量。
event.clientX 与 event.pageX 有微妙的差别(当整个页面有滚动条的时候),不过大多数时候是等效的。

如果要完全一样,可以稍麻烦些:
mX = event.x ? event.x : event.pageX;
然后用 mX 代替 event.x
(3)其它
event.layerX 在 IE 与 MF 中都有,具体意义有无差别尚未试验。

8. 关于frame
(1)现有问题
在 IE中 可以用window.testFrame取得该frame,mf中不行
(2)解决方法
在frame的使用方面mf和ie的最主要的区别是:
如果在frame标签中书写了以下属性:
<frame src=”xx.htm” id=”frameId” name=”frameName” />
那么ie可以通过id或者name访问这个frame对应的window对象
而mf只可以通过name来访问这个frame对应的window对象
例如如果上述frame标签写在最上层的window里面的htm里面,那么可以这样访问
ie: window.top.frameId或者window.top.frameName来访问这个window对象
mf: 只能这样window.top.frameName来访问这个window对象

另外,在mf和ie中都可以使用window.top.document.getElementById(“frameId”)来访问frame标签
并且可以通过window.top.document.getElementById(“testFrame”).src = ‘xx.htm’来切换frame的内容
也都可以通过window.top.frameName.location = ‘xx.htm’来切换frame的内容
关于frame和window的描述可以参见bbs的‘window与frame’文章
以及/test/js/test_frame/目录下面的测试
—-adun 2004.12.09修改

9. 在mf中,自己定义的属性必须getAttribute()取得
10.在mf中没有   parentElement parement.children   而用
parentNode parentNode.childNodes
childNodes的下标的含义在IE和MF中不同,MF使用DOM规范,childNodes中会插入空白文本节点。
一般可以通过node.getElementsByTagName()来回避这个问题。
当html中节点缺失时,IE和MF对parentNode的解释不同,例如
<form>
<table>
<input/>
</table>
</form>
MF中input.parentNode的值为form, 而IE中input.parentNode的值为空节点

MF中节点没有removeNode方法,必须使用如下方法 node.parentNode.removeChild(node)

11.const 问题
(1)现有问题:
在 IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语法错误。
(2)解决方法:
不使用 const ,以 var 代替。

12. body 对象
MF的body在body标签没有被浏览器完全读入之前就存在,而IE则必须在body完全被读入之后才存在

13. url encoding
在js中如果书写url就直接写&不要写&例如var url = ‘xx.jsp?objectName=xx&objectEvent=xxx’;
frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器
一般会服务器报错参数没有找到
当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&
一般MF无法识别js中的&

14. nodeName 和 tagName 问题
(1)现有问题:
在MF中,所有节点均有 nodeName 值,但 textNode 没有 tagName 值。在 IE 中,nodeName 的使用好象
有问题(具体情况没有测试,但我的IE已经死了好几次)。
(2)解决方法:
使用 tagName,但应检测其是否为空。

15. 元素属性
IE下 input.type属性为只读,但是MF下可以修改

16. document.getElementsByName() 和 document.all[name] 的问题
(1)现有问题:
在 IE 中,getElementsByName()、document.all[name] 均不能用来取得 div 元素(是否还有其它不能取的元素还不知道)。

1,document.getElementById替代document.all(ie适用)
2,集合[]替代()(ie适用)
3,target替代srcElement;parentNode替代parentElement(parentNode ie适用)
4,node.parentNode.removeChild(node)替代removeNode(this)(ie适用)
5,有空白文本节点
6,无outerHTML属性
7,事件局部变量e替代事件全局变量event
8,e.button键值有别于event.button,只有3个键值而无组合键值
9,无ondrag事件
10,DOMMouseScroll替代onmousewheel;-e.detail替代event.wheelDelta
11,addEventListener替代attachEvent;removeEventListener替代detachEvent
12,e.preventDefault()替代event.returnValue=false;e.stopPropagation()替代event.cancelBubble=true
13,style.top、style.left等严格检查”px”单位(加”px” ie适用)
14,style=”-moz-opacity:0.9″替代style=”filter:alpha(opacity=90)”;无其它filter
15,style.cursor=”pointer”替代style.cursor=”hand”(ie适用)
16,title替代alt(ie适用)
17,状态栏默认不可修改,需调整ff设置
18,内置绘图功能以canvas或者SVG替代vml
19,代码出错时经常不报错(想来也是ff的无奈之举吧,如果每个ie独有的表达方式换在它里面都报错的话,怕是报都报不过来吧)
20,对缓存的清理非常不好
注:标明“ie适用”者为通用性建议写法,未标明者在ie里不适用。

以下所有IE指IE6.0

验证是否是IE浏览器(来之于google js)

var agt=navigator.userAgent.toLowerCase();
var is_ie=(agt.indexOf(“msie”)!=-1 && document.all);

正式开始

事件委托方法

IE

document.body.onload = inject; //Function inject()在这之前已被实现

firefox

document.body.onload = inject();

有人说标准是:

document.body.onload=new Function(‘inject()’);

在firefox无法取得event.srcElement

通过其他方式传递对象

if(isIE)
thistable.attachEvent(“onmousedown”,OnClickChangeTdBackColor);
//thistable.onmousedown=OnClickChangeTdBackColor;
else//deal firefox
{

for(var i=0;i<thistable.rows.length;i++)
{
var rowObj = thistable.rows[i];
for( var j=0;j<rowObj.cells.length;j++)
{
var cellObj = rowObj.cells[j];
cellObj.setAttribute(“onmousedown”,”OnClickChangeTdBackColor(this)”);
}
//alert(rowObj.cells[0].tagName);
}
}

这是来之 http://blog.joycode.com/lostinet/archive/2005/02/27/44999.aspx

在FireFox下编写事件处理函数是很麻烦的事.
因为FireFox并没有 window.event . 如果要得到 event 对象,就必须要声明时间处理函数的第一个参数为event.

所以为了兼容IE与FireFox,一般的事件处理方法为:
btn.onclick=handle_btn_click;
function handle_btn_click(evt)
{
if(evt==null)evt=window.event;//IE
//处理事件.
}
对于简单的程序,这不算麻烦.

但对于一些复杂的程序,某写函数根本就不是直接与事件挂钩的.如果要把event传进该参数,那么所有的方法都要把event传来传去..这简直就是噩梦.

下面介绍一个解决这个麻烦事的方法,与原理.

JScript中,函数的调用是有一个 func.caller 这个属性的.
例如
function A()
{
B();
}
function B()
{
alert(B.caller);
}
如果B被A调用,那么B.caller就是A

另外,函数有一个arguments属性. 这个属性可以遍历函数当前执行的参数:
function myalert()
{
var arr=[];
for(var i=0;i
arr[i]=myalert.arguments[i];
alert(arr.join(“-“));
}
alert(“hello”,”world”,1,2,3)
就能显示 hello-world-1-2-3
(arguments的个数与调用方有关,而与函数的参数定义没有任何关系)

根据这两个属性,我们可以得到第一个函数的event对象:
btn.onclick=handle_click;
function handle_click()
{
showcontent();
}
function showcontent()
{
var evt=SearchEvent();
if(evt&&evt.shiftKey)//如果是基于事件的调用,并且shift被按下
window.open(global_helpurl);
else
location.href=global_helpurl;
}
function SearchEvent()
{
func=SearchEvent.caller;
while(func!=null)
{
var arg0=func.arguments[0];
if(arg0)
{
if(arg0.constructor==Event) // 如果就是event 对象
return arg0;
}
func=func.caller;
}
return null;
}
这个例子使用了SearchEvent来搜索event对象. 其中 ‘Event’ 是 FireFox 的 event.constructor .
在该例子运行时,
SearchEvent.caller就是showcontent,但是showcontent.arguments[0]是空.所以 func=func.caller 时,func变为handle_click .
handle_click 被 FireFox 调用, 虽然没有定义参数,但是被调用时,第一个参数就是event,所以handle_click.arguments[0]就是event !

针对上面的知识,我们可以结合 prototype.__defineGetter__ 来实现 window.event 在 FireFox 下的实现:

下面给出一个简单的代码.. 有兴趣的可以补充

if(window.addEventListener)
{
FixPrototypeForGecko();
}
function FixPrototypeForGecko()
{
HTMLElement.prototype.__defineGetter__(“runtimeStyle”,element_prototype_get_runtimeStyle);
window.constructor.prototype.__defineGetter__(“event”,window_prototype_get_event);
Event.prototype.__defineGetter__(“srcElement”,event_prototype_get_srcElement);
}
function element_prototype_get_runtimeStyle()
{
//return style instead…
return this.style;
}
function window_prototype_get_event()
{
return SearchEvent();
}
function event_prototype_get_srcElement()
{
return this.target;
}

function SearchEvent()
{
//IE
if(document.all)
return window.event;

func=SearchEvent.caller;
while(func!=null)
{
var arg0=func.arguments[0];
if(arg0)
{
if(arg0.constructor==Event)
return arg0;
}
func=func.caller;
}
return null;
}
</body></html>

 

 

firefox与IE(parentElement)的父元素的区别

因为firefox与IE都支持DOM,因此使用obj.parentNode是不错选择.

IE
obj.parentElement
firefox
obj.parentNode

 

asp.net中UniqueID和clientID的区别

要使用document.getElementById 方法,则使用控件的时候要这样来作

“javascript:OnSelectSubCatalog(\””+subCatalog_drp.ClientID+”\”,”+catalogIDX+”,”+catID.ToString()+”)”;

 

调用Select元素的区别

移出一个选择项


IE :sel.options.remove(sel.selectedIndex);
firefox :

增加选择项:


IE: subCatalog.add(new Option(text,value));

firefox:
var opnObj = document.createElement(“OPTION”);
//opnObj.id = optionID;
opnObj.value = value;
opnObj.text = text;
subCatalog.appendChild(opnObj);

cursor:hand VS cursor:pointer

firefox不支持hand,但ie支持pointer,所以建议统一使用pointer。