javascript

画了两幅关于js的图

2008-08-19

什么是javascript中的javascript的组成。

另一幅是javascript所有特性的图。

*根据 rpsg 建议修改。

javascript教程发布

2008-08-14

开始发布javascript初级教程,没有特殊情况,周一至周四每天发布一篇文章文章。

JavaScript与HTML的Script标签

2008-08-08

<script>标签

script标签有两种用途:

  • 1. 在页面中标识一块脚本代码
  • 2. 加载一个脚本文件

它要依赖于src属性的存在。上面两种情况都需要</script>闭合标签。

script标签可以包含下面的属性:

src=”url”

src属性是可选的。如果存在src属性,它的值应是一个url(网址)表示的.js文件。当浏览器加载,编译与执行文件时,页面将停止装载与处理。<script src="url">与</script>之间不应有任何内容(保持空白)。

如果没有src属性,<script>与</script>之间的文字可被编译与执行。script不能包含序列

</

因为可能与</script>混淆。可以插入反斜线符号在<与/之间避免此问题。

</\

反斜线将被JavaScript编译器忽略。

不要使用<!– //–>这种hack脚本。这种方法可以阻止第一代浏览器(Netscape 1和Mosaic)将脚本显示成文字。已经有很长时间不需要这么做了。<!– //–>是一个HTML注释。注释中的脚本将被忽略,不被编译与执行。同样,HTML注释不包括–,因此脚本将忽略HTML错误。

language=”javascript”

这个属性是不赞成使用的。它被用于选择其它的程序语言或特殊版本的JavaScript。尽量避免使用。

type=”text/javascript”

这个属性是可选的。自从Netscape 2所有浏览器默认的编程语言已经都是JavaScript了。在XHTML中,这个属性是必须的。在HTML中最好不要使用此属性。浏览器可以自行解决。

defer

这个属性试图改变组件在页面中的加载时机。它不能被很好的支持,不要使用此属性。

for=”name” event=”name”

这些属性是微软(Microsoft)的私有属性,用于声明事件句柄。这是不标准的。尽量避免使用。

放置(Placement)

<script src="url"></script>将阻碍页面的其它组件下载,直到script脚本加载、编译、执行完毕。因此越晚调用脚本越好,以便加载图像和其它组件不被延时。 加载脚本将增加感觉中的与实际的页面加载时间。因此通常最好把所有的<script src="url"></script>放置在</body>之前。一个页面内的<script>在加载时没有明显的影响。

如果一个脚本定义了一些用于其它函数的函数与数据,那么必须在用这些函数与数据之前完成定义。因此定义脚本后才可以使用脚本。

document.write

document.write提供了一种将字符串写入HTML页面的方法。有更好的方法这样做,例如.innerHTML和.createElement或者HTML克隆样式(HTML cloning patterns),用于避免使用document.write。

document.write强制性的依赖于加载时机。如果document.write在onload事件前被调用,它会在一个页面中附加或插入文字。如果在onload事件后被调用,它将完全替换页面,摧毁前面完成的所有内容。

document.write使脚本与标记混合起来,助长了坏的结构。清晰的结构尽少使脚本与标记混合使用。

脚本标签骇客

令人惊讶的是src属性不被同源策略(Same Origin Policy)约束。这意味着一个脚本元素可以产生于任何服务器并且加载脚本与执行脚本。如果脚本引发JSON编码的数据传送,这是很有用的。不幸的是没有方法可以在执行前限制与检查脚本。它同页面的其它脚本一样有权利运行。脚本能存取与使用自带的小甜饼(cookies)。它可以存取原始服务器信息用于用户的授权。它可以检查DOM或JavaScript全局对象(global object),而且可以为世界上的任何地方发送信息。脚本骇客标签(Script Tag Hack)是不安全的并且应该避免使用。

BOM与DOM

2008-07-28

DOM(Document Object Model)肯定都很熟悉了!BOM是什么,我以前听说过但是没仔细研究,直到今天看了 Professional JavaScript for Web Developers,Nicholas C. Zakas把BOM定义为Browser Object Model包括window document frames history location navigator screen等对象,而BOM的hierarchy的顶层是window 视窗,DOM的hierarchy的顶层是document 文档,这样看BOM就包含DOM了(DOM本身就是对客户端文档的控制方法,只不过它被标准化了)!

BOM还有其它的一些叫法,比如javascript对象(JavaScript Object Model) JOM,客户端对象(Client-side Object Model) COM等。由于w3c只维护了DOM ,而没有维护与客户端有关的javascript对象,因此BOM或者JOM,COM没有统一的规定。微软jScript的JOM和网景的JOM是不一样的,为此编写js程序时就遇到了很多困难(要照顾所有客户端是一件多么难受的事!)。(JOM与COM这两个缩写是我自己搞的,哈哈)

我感觉window document frames history location navigator screen这些javascript对象如果统一称呼,最好使用“客户端对象”COM(Client-side Object Model),比浏览器对象范围更广,更准确与贴切,因此我不赞同使用BOM这个称呼。(有不同意见欢迎来砸呀,呵呵)

js或css文件后面为什么有参数

2008-07-27

有同学经常遇到html页面里加载的js与css文件带有参数,比如:

<script type="text/javascript" src="dreamdu.js?1217128319"></script>
<link rel='stylesheet' href='http://www.dreamdu.com/n.css?version=2.3.3' type='text/css' />
<link rel='stylesheet' href='http://www.dreamdu.com/n.css?version=20080727182553' type='text/css' />

使用参数有两种可能,

  • 脚本并不存在,而是服务端动态生成的,因此带了个版本号,以示区别。
  • 客户端会缓存这些css或js文件,因此每次升级了js或css文件后,改变版本号,客户端浏览器就会重新下载新的js或css文件

第二种情况最多,也可能两种同时存在。

版本号,可以是一个随机数,也可以是一个递增的值,大版本小版本的方式,或者根据脚本的生成时间书写,比如 20080727182553 就是精确到了生成脚本的秒,而 2.3.3 就是大版本小版本的方式。

补充疯中男子所说的几种可能:

  • 服务器端使用了URLRewrite,实际上最终访问的是动态服务器文件,例如xxx.php,而这个服务器端文件运行完毕后,response 出来一个标准的 JS 字串流。
  • 根本就是从客户端提交参数上去的。我就在项目中使用过这种方式,页面都是自动生成的,因此在生成的页面中打上特殊标记。,这样在运行脚本时,能够知道是哪个页面在请求脚本,可以运行不同的方法。用这个方法偷偷记录PV很不错。