HICK 者,乡巴佬也

Internet Explorer 无法打开 Internet 站点

Posted in: Web 开发 — Hick @ 2009/02/20 13:03:55 Comments (0)

前不久遇到的问题,收到反馈说我负责的 portal 可能出现“Internet Explorer 无法打开 Internet 站点 http://.com. 操作已中止”的提示。查了下是因为 js 操作浏览器还没有渲染完的 html 标签,就对该标签进行 appendChild 或者修改 innerHTML 的操作。 其实之前在访问 Google 的时候也有出现过类似情况,不过很少,一直以为是浏览器问题呢。

出现此问题的原因子容器 HTML 元素包含试图修改子容器的父容器元素的脚本。 脚本试图使用 innerHTML 方法或 appendChild 方法修改父容器元素。

是例如如果 DIV 元素是在 BODY 元素中的子容器,并在 DIV 元素中的一个 SCRIPT 块尝试修改 DIV 元素的父容器的 BODY 元素,可能会出现此问题。

解决方法

要变通解决此问题,请只修改的块关闭容器,或者,修改仅脚本的立即的容器元素编写脚本。 为此,使用一个占位符,可以关闭目标容器,或可以将脚本块移动到您要修改的容器。

本例中, DIV 元素是一个子容器元素。 SCRIPT 块在 DIV 元素内的尝试修改 BODY 元素。 BODY 元素是关闭的父容器的 DIV 元素。


可以通过 修改父元素、修改一个已关闭的容器元素等方式解决。

详细信息参考:

http://support.microsoft.com/kb/927917/zh-cn

High Performance Web Sites 读书笔记3

Posted in: Web 开发 — Hick @ 2008/02/28 8:41:02 Comments (2)

http://www.hickwu.com/?p=228

尽量避免使用 CSS 表达式

CSS 表达式可以根据条件来动态的设置 css 的属性,IE 5 以及以后版本都支持 css 表达式。表达式部分就是 js 代码。

background-color: expression( (new Date()).getHours( )%2 ? "#B8D4FF" : "#F08A00" );

其他浏览器可能会忽略该功能,但是 IE 浏览器是支持的。利用这个特性可以用来解决一些其他浏览器支持但是 ie 不支持的特性。比如 ie 不支持的 min-width 属性,可以通过这样的表达式在 ie 下实现:

width: expression( document.body.clientWidth < 600 ? "600px" : "auto" );
min-width: 600px;

css 一个表达式可能并不怎么消耗资源,但是他们的执行次数往往会比人们预想的多,比如包括拖动滚动条,甚至是移动鼠标都可能导致一个 css 表达式反复执行。虽然写得好可以避免这样的情况,但是到了这个层次很多东西不好把握了,所以一般建议尽量避免使用 css 表达式。

使用外部 js 和 css 样式

其实单纯的就一个页面来说,把 js 和 css 放在一个文件中,和使用外部 js 和 css 文件相比,还是要快的。尽管使用多个文件可以利用到浏览器的并行下载,但是多次请求的开销,导致 js 和 css 放在一个文件中要快。但是一般来说,css 和 js 都是很多页面可以公用的,或者用户习惯是一天或者一个月内多次访问到同一个页面,这些文件一般都是可以直接从浏览器 cache 中取的。因此并不是绝对的说一定使用外部 js 和 css ,而是在可 Cache 的情况下使用。对书中说的”Empty cache vs. primed cache”还不是完全明白,另外提到的 Dynamic Inlining 个人感觉没有必要搞得怎么复杂,可能得不偿失。

DNS 解析

一般来说,操作系统和浏览器把域名解析为 ip 地址以后,都会丢这个解析做 cache ,也就是在一定时间内,该域名会一直被解析为该 ip ,而不管对应的 ip 是否变化或者还绑定了其他 ip 。尽管如此,浏览器通常都会忽略操作系统的 dns cache 。而 Keep-Live 情况下,实际上只有一个连,无论是否 cache 都不会有多次的 dns 解析。

介绍了 TTL: ping 命令可以看到的 TTL 的意思是 Time To Live, 也就是 dns server 告诉请求解析的 client 某域名的解析可以被 cache 的时间。

说明一下,之前我接触该过的清 dns cache 的命令 ipconfig /flushdns 清除的只是操作系统的 dns cache ,对浏览器并不一定有效。浏览器通常是关闭进程以后会自动清楚 dns cache 。

(more…)

High Performance Web Sites 读书笔记2

Posted in: Web 开发 — Hick @ 2008/02/27 8:43:06 Comments (0)

http://www.hickwu.com/?p=223

使用 CDN

CDN: Content Delivery Network ,内容分发网络。由于网络的差异性,尤其是我国南北电信网通的差异,网络速度容易成为用户访问慢的因素。而 CDN 提供商则会通过在不通的网络环境做镜像来解决网络的差异性,尽量使各种网络环境下的用户能够流畅的拉取页面。需要注意的是,CDN 基本上只用来分发静态内容。

文章中只大概列举了使用 CDN 的大网站的情况以及美国提供 CDN 的服务商,没有太多价值,但是 CDN 这个概念,对不少 web 开发者来说确实比较陌生。

指定页面过期时间

http 协议中允许指定 Expires 来说明某个文件的过期时间。当一个浏览器跟服务器请求到一个文件以后,在该文件过期之前,它可以无需跟浏览器请求而直接使用浏览器自己请求过的该文件的 cache(浏览器自己的 cache) 。所以,对浏览器可能多次请求的文件指定过期时间,能够有效减少浏览器对服务器的请求。一般需要考察用户的浏览器习惯等因素。

Expires 是指定文件具体的过期时间,在 http 1.0 中引入了一个可以覆盖该 Expires 的 Cache-Control 头的 max-age ,可以指定文件的有效秒数。不过使用 apache 的 mod_expires 可以直接根据文件创建或其他时间加一定长度的时间达到同样的目的。

(more…)

windows 下浏览器和操作系统的 DNS cache

Posted in: Web 开发 — Hick @ 2008/01/30 12:32:14 Comments (2)

一般来说,windows 下操作系统和浏览器把某域名解析为 ip 地址以后,都会把解析结果做 cache ,也就是在一定时间内,该域名会一直被解析为该 ip ,而不管该域名对应的 ip 是否变化或者还绑定了其他 ip 。而浏览器通常都会忽略操作系统的 dns cache 。操作系统的 cache 可以通过 ipconfig /flushdns 命令来清除,而浏览器的 dns cache ,则一般需要启动一个新的浏览器进程(ie 的浏览器 dns cache 是以进程为基本单元的)。

在 ping 一个域名的时候,得到的 TTL 表示 Time To Live ,表示的就是建议操作系统对 dns 做 cache 的时间。浏览器的 dns cache 一般由浏览器自己控制,某些版本的 ie 中 默认 cache 是 30 分钟,也可以通过修改注册表来指定值,参考 >http://support.microsoft.com/default.aspx?scid=KB;en-us;263558

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\InternetSettings\ 中创建 DnsCacheTimeout 和 ServerInfoTimeOut ,类型为 DWORD 。都指定为 5 ,浏览器就的 dns cache 过期时间就是 5s 。

一点比较奇怪的是 http://support.microsoft.com/kb/813827 中说明建立值是以毫秒为单位。虽然针对 ie 不完全一致,但是有重合的版本。我希望的是尽快 timeout ,不再深究。

firefox 也可以在 about:config 中找到相关的配置选项。

Apache 默认字符集问题

Posted in: Web 开发 — Hick @ 2008/01/23 12:22:56 Comments (0)

一个 AsciiDoc 转换后的网页(UTF-8 编码)直接在电脑上打开正常,但是放到某 web server(Apache) 上却显示乱码,手工选择为 utf-8 编码才显示正常。想可能是 http 包头的问题,抓包一看果然是 gb2312 。

找到 httpd.conf 文件,果然配置 apache 的时候通过 AddDefaultCharset 指令设置 apache 的默认字符集为 gb2312。这时候浏览器请求到的网页 http 包头中就会使用该值来指定字符集,而浏览器会根据该值决定网页的字符集——这时候网页的 html 中通过 meta 指定字符集会被忽略。在 ie6, ie7, firefox 下验证了都是如此。

指令说明参见 http://httpd.apache.org/docs/2.0/mod/core.html#adddefaultcharset 。 中文版 http://man.chinaunix.net/newsoft/ApacheManual/mod/core.html#adddefaultcharset

Next Page »