决定该收起懒惰的心了
今天一个同事问我一个奇怪的问题:一段javascript放在Function外可以正常的执行完,而放在一个function里由Button触发却总出错!
我看了一下他的代码(如下代码为仿原代码制作,原代码非为textbox,而是一个不可视的activex的object):
<
input type
=
"
text
"
id
=
"
txt01
"
value
=
"
0001
"
>
< input type = " text " id = " txt02 " value = " 0002 " >
< input type = " button " value = " test " onclick = " test() " >
< script language = " javascript " >
// function test()
// {
alert(document.all.txt01.value);
document.write(document.all.txt01.value);
alert(document.all.txt02.value);
document.write(document.all.txt02.value);
// }
</ script >
< input type = " text " id = " txt02 " value = " 0002 " >
< input type = " button " value = " test " onclick = " test() " >
< script language = " javascript " >
// function test()
// {
alert(document.all.txt01.value);
document.write(document.all.txt01.value);
alert(document.all.txt02.value);
document.write(document.all.txt02.value);
// }
</ script >
按照他的方式执行了两次,果然加上上述的注释符时,运行正常;而取消上述注释时,就在alert(document.all.txt02.value)时,总提示document.all.txt02.value为空或不是对象。
初时我也百思不得其解,甚至以为是那个ActiveX的object因为安全性,在读第二次时已经过期了,但我又想,如果是这样,那不加上Function为什么又正常呢?我一再地检查代码,就是不能发现问题。直到我忽然看到了"document.write"才似乎想起了什么,把所有的document.write屏蔽后,一切正常。
原来一切都是document.write在搞鬼,如果当前页面已经load完成,它的执行会把网页第一次load的所有网页元件清理掉;而如果当前页面正在load中,则它的执行只会在当前load的代码后面增加内容。这就是上面的问题造成的原因。