代码改变世界

Thin的DateChooser代码学习(关于js的函数参数为一个完整的函数以及“对象不支持此属性或方法”错误的解决)(原创,转载请声明)

2006-05-30 16:45  BAsil  阅读(1422)  评论(2编辑  收藏  举报

今天在学习Thin的DateChooser代码时,发现在I(getelement)函数中传递另外一个完整的函数作为I(getelement)函数的参数。我其实在Ajax的一些简单应用里见到过类似的使用方式但没有用过,因此决定写一个小例子学习一下。不想很简单的一个例子,却调试不过,来看一下代码,为了定位错误,我把例子简化了一下。

<body>
<table id="tablepanel" ></table>
<script>
function I(getelement)
{
tablepanel=getelement("tablepanel");
alert(tablepanel.id);

}

I(function getelement(id){return document.all(id)});

</script>
</body>

运行结果 :出现了运行时间错误。是否进行调试?

错误:对象不支持此属性或方法

这个错误花了我不少时间才解决,改正后的代码如下

<body>
<table id="tablepanel" ></table>
<script>
function I(getelement)
{
var tablepanel=getelement("tablepanel");
alert(tablepanel.id);

}

I(function getelement(id){return document.all(id)});

</script>
</body>

因为tablepanel没有定义,才会出现刚才的错误,但比较奇怪的是js是不需要变量声明的,这里的错误我感觉是IE的bug,我手头没有其他的浏览器,不知道其他的会怎么样。总之,以后写类似的函数一定得注意了。

上面的代码,其实就是传递了一个查找id的函数。我们可以扩展一下,如果判断浏览器不支持document.all,我们可以传一个用到document.getElementById的函数实参,是不是很方便?

BTW, 还有几个小细节也是我在学习的过程中发现的,这里mark一下

1. DataChooser里有类似的代码

function test()

{
alert("test");
function tablepanel.onselectstart()
{
alert("onselectstart");
return win.event.returnValue=false;
}
mprev.ondblclick=function mprev.onclick(){ alert("mprev"); }

}

调用的时候是这样写的

function I(getelement)
{
var tablepanel=getelement("tablepanel");
var mprev=getelement("prev");
alert(tablepanel.id);
test(getelement);

}

其实这里的test的参数并没有用到,我们可以不管它。


2. 在上面的代码中我们用VS.net的调试器调试,在test函数内部执行顺序如下

首先定位到tablepanel.onselectstart,但并没有执行alert方法

其次定位到mprev.ondblclick=function mprev.onclick() ,同样没有执行alert方法

最后执行alert("test")方法

这个顺序应该是IE解析器的规则,只是如果代码很多的话,可能会感觉定位的标志到处乱跳,很是不爽。