1. 'null'为空或不是对象:
html document是什么<script type="text/javascript"> ⾥⾯加个defer=true属性试试看,
即:<script type="text/javascript" defer=true>
2. ElementById为null
原因: var ElementById("titletab");没有取到对象
解决办法:
1.在错误语句的下⾯加上alert(titab);调试语句,看看是否有消息框弹出
2.如果没有弹出,检查HTML代码中的是否存在"id=titletab"的<table>标签(要仔细哦,⼀个字母都不能错的)
3.如果标签存在,那么考虑<script>代码段的位置问题,切记包含有类似getElement代码<script>代码段必须出现在HTML的Element之后也就是说你把<script>代码段放到<html>标签之后然后尝试 .
⼆、引⼊了母版页等⽂章出⾃:
本⽂将为⼤家介绍⼀下 ASP.NET 2.0 在创建母版页时引来的⿇烦,并分析了问题产⽣的实质,⼤家在实际操作中多多注意⼀下。
⼀、问题提出
由于总体排版和设计的需要,我们往往创建母版页来实现整个⽹站的统⼀性,最近我由于统⼀性的需要,把原来整个项⽬单独的页⾯全部套⽤了母版页。但是出现了⼀个错误……在我的Blog中记录⼀下,⽅便⼤家参考。
⼆、抽象模型
由于整个页⾯内容过多,所以我把这个页⾯中最为本质的问题抽象出来。
原来单⼀页⾯,就是利⽤按钮触发JS事件,在⽂本域中插⼊“(_)”功能,其实现代码如下:
上述页⾯可以正常使⽤。后来使⽤模板页后,其代码如下:
当打开后按下按钮出现了“Microsoft JScript 运⾏时错误: 'ElementById(...)' 为空或不是对象”。这是什么原因呢?原来好好的,怎么套⽤个母版页就出现这个奇怪的问题呢?困扰了好久,和朋友讨论了⼀下,终于到了答案……
三、分析本质
原来我们仔细看看其⽣成的HTML代码:
单⼀页⾯:
再看看套⽤母版页之后,⽣成的HTML代码:
是不是看到问题了,源⽂件控件元素的ID和⽣成HTML⽂件的ID不⼀致。表单from的name属性和id属性变成了aspnetForm,控件的id属性被⽆缘⽆故了加上了ctl00_ContentPlaceHolder1_前缀,其name属性也加上了ctl00ContentPlaceHolder1前缀。
这下知道了,难怪提⽰“'ElementById(...)' 为空或不是对象”的错误了,原来⽣成页⾯后其ID都变了。
那么我们如何解决它呢?既然他id变了,我们就把JS代码id改为⽣成后的id。代码如下:
好了,问题解决了,不过想想有什么更好的办法呢?到底为什么呢?
其实分析⼀下,它是后来⽣成的客户端id,我们可以⽤C#语句Control的ClientID属性,像这样写:txt.ClientID; txt还是原来控件的id,后⾯的ClientID就是新⽣成的id。txt.ClientID是从程序⾥取到的后来⽣成新的id,这样不是更好吗。修改代码如下:
还有在后台Request.Form["txt"]键值需要改变,必须变为Request.Form[""]才能接收到页⾯的值。想想如果想要得到ID的control是⼀个⽤户控件的话,当⽣成页⾯后尽管能得到其ClientID,但是却得不到这个对象,所以也就不能设置或获得其属性了。⽐如,我要做的这个⽤户控件,由三个DropDownList组成,可是我却想得到⼀个完整的⽇期值(指在客户端),⼀种思路是先获得三个DropDownList的ClientID,然后再由ID1.value+ID2.value+ID3.value取得,可是如果你⼀个页⾯上需要放多个这样的⽤户控件的话,你需要取得多少个ClientID?显然这样做的话,⼯作量会很⼤,⽽且要操作众多的对象,很容易出错。
四、总结
这⼀类问题我像在我们编写程序时往往经常会遇到,总结⼀下:这应该属于“使⽤了MasterPage,或
者GridView中的模版列后所有元素ID不⼀致问题”。由于种种原因(⽐如使⽤了MasterPage,或者GridView中的模版列),⼀个控件在设计时的ID往往不同于⽣成页⾯后的ID,为了获得控件客户端ID,我们可以从⽣成的页⾯⼊⼿,取控件id有以下三种修改⽅法:(当然我还是推荐第三种)
⾄于为什么,是⾃⼰还没有深刻理解其中的根源还是.NET机制问题呢?
在我们设计时往往就会出现⼀些莫名其妙的问题,我想我们遇到问题时,冷静思考,把握主次,从底层框架⼊⼿,纠其原因,相信最终会到答案。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论