意想不到的循环调用

8年前

前几天公司有一个页面在IE下一打开就弹出这样的错误:

Stack overflow at line: 0

一般来说,这是Javascript出现循环调用时报的错。由于页面上的代码比较多,无法一下子判断出是哪里的问题,我只好一段一段地删。然而,即使我把所有的<script>标签都删了,这个错误仍然存在。我又怀疑这是嵌入的外部文件导致的问题,于是又把所有的<iframe>标签给删了,但问题依旧。

难道HTML也会导致循环调用吗?其实我算漏了一个地方,就是HTML元素的事件,可以通过标签的“onEventName”属性指定,比如“onclick”、“onmouseover”等。这下终于让我找到了线索:页面上的一张图片设置了“onerror”事件。代码大概如下:

<img src="a.jpg" onerror="this.src='b.jpg'" />

onerror事件用得比较少,但它本身并不会造成什么问题。然而,这里的“a.jpg”和“b.jpg”都是不可访问的。访问“a.jpg”的时候出错触发了onerror事件,把图片的地址设为“b.jpg”,问题就在于“b.jpg”也不可访问,又触发了onerror事件,再次设为“b.jpg”,这自然也是不可访问,继续触发onerror事件,如此往复。

665次阅读,2条评论

混乱的Javascript相关名称

8年前

LiveScript

LiveScript是JavaScript语言的前身。自从Sun公司推出著名的Java语言之后,Netscape公司引进了Sun公司有关Java的程序概念,将自己原有的LiveScript重新进行设计,并改名为JavaScript。

JavaScript

JavaScript是一种广泛用于前端开发的脚本语言,前身是LiveScript。它已经被Netscape公司提交给ECMA制定为标准,称之为ECMAScript,标准编号ECMA-262。目前最新版为ECMA-262 3rd Edition。

ECMAScript

ECMAScript是由Ecma国际(前身为欧洲计算机制造商协会)通过ECMA-262标准化的脚本程序设计语言核心。所谓核心,意思是它并不作为一种独立的语言出现,而是为不同种类的宿主环境提供脚本语言的核心功能。Javascript、JScript、ActionScript等都基于ECMAScript,都是ECMAScript的扩展。

571次阅读,0条评论

把具有数字属性名的对象转换为数组

8年前

虽然不太常用,但我们的确可以给对象添加以数字为属性名的属性:

var obj = {};
obj[0] = 1;
obj[1] = 2;

这个对象并不是数组类型,那有没有办法把它转换为数组类型呢?jQuery代码中采用了Array.prototype.slice把这种对象转换为数组,但我试了好几遍,就是不行:

var obj = {};
obj[0] = 1;
obj[1] = 2;
alert(Array.prototype.slice.call(obj));
665次阅读,0条评论

Array.prototype.sort详解

8年前

ECMAScript中的Array类有一个排序方法,即本文主要讨论的Array.prototype.sort(下面简称sort),它的调用是很简单的:

var arr = [11, 2, 1];
alert(arr.sort());

然而,上面程序的输出结果是 "1,11,2" ,而不是我们期望的"1,2,11",这是因为在默认情况下,sort方法排序时会把元素临时转成字符串再比较。要解决这个问题,就要给sort传递一个参数,这个参数是一个进行元素比较的函数,其原型如下:

function compareFn(x, y)
971次阅读,1条评论

em单位的历史

8年前

em是近年来讨论得比较多的一个长度单位。其实早在Jeffrey Zeldman写的《网站重构》(中文版于2004年出版)一书中就提到过这个单位,只是当时流行用px(像素)单位,所以很少人留意到em。与px这种绝对长度单位不同,em是相对长度单位,1em代表的是一个字的大小。为何要用字体的大小作单位呢?

多年前,在XHTML+CSS还没有被大多数人知道的时候,网页制作很强调一致性,也就是说让网页在所有用户的机器上的显示基本一样。这里最大的影响因素是字体大小。由于浏览器本身提供了调整字体大小的功能,因此,通过font标签的size属性设置的字体大小会随着浏览器设置而改变。幸运的是,CSS中有一个固定的单位——px。于是,人们开始使用CSS定义字体大小,通常会给body定义一个默认字体大小,在中国,这个值通常是12px。后来,有人注意到视力差的人看12px的字很吃力。那调整到14px?16px?不行,对于视力正常的人来说,12px还是最美的。那怎么办呢,难道要做好几套页面?这明显不划算,于是,浏览器的字体大小设置又一次登上历史舞台,但是在XHTML+CSS的页面中,已经不提倡用font标签定义字体大小,所以一些开发者开始应用有异曲同工效果的em单位。然而,em的一些缺点却限制了它的应用:

1485次阅读,1条评论