创建母版页导致js出现“ 'document.getElementById(...)' 为空或不是对象”错误

导读:一个控件在设计时的ID往往不同于生成页面后的ID,为了获得控件客户端ID,我们可以从生成的页面入手,冷静思考,把握主次,从底层框架入手

本文将为大家介绍一下 ASP.NET中在创建母版页时引来的麻烦,并分析了问题产生的实质,大家在实际操作中多多注意一下。 
  一、问题提出

  由于总体排版和设计的需要,我们往往创建母版页来实现整个网站的统一性,最近我由于统一性的需要,把原来整个项目单独的页面全部套用了母版页。但是出现了一个错误……在我的Blog中记录一下,方便大家参考。

  二、 抽象模型

  由于整个页面内容过多,所以我把这个页面中最为本质的问题抽象出来。

  原来单一页面,就是利用按钮触发JS事件,在文本域中插入“(_)”功能,其实现代码如下:

以下是引用片段:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
<title>单一页面抽象模型-YJingLee</title> 
<script language="javascript" type="text/javascript"> 
// <!CDATA[ 
function insert() { 
document.getElementById("txt").value=document.getElementById("txt").value+"(__)"; 
return; 
} 
// ]]> 
</script> 
</head> 
<body> 
<form id="form1" runat="server"> 
<div> 
<textarea id="txt" runat="server" name="txt" rows="10" cols="50"></textarea> 
<asp:Button ID="btnInsert" runat="server" Text="服务器端插入(_)" OnClientClick="insert();"/> 
<input id="btnInsert2" name="insert" onclick="insert();" type="button" value="客户端插入(_)" runat="server"/></div> 
</form> 
</body> 
</html> 
  

  上述页面可以正常使用。后来使用模板页后,其代码如下:

以下是引用片段:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" Title="使用母版页面抽象模型-YJingLee" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> 
<script language="javascript" type="text/javascript"> 
// <!CDATA[ 
function insert() { 
document.getElementById("txt").value=document.getElementById("txt").value+"(__)"; 
return; 
} 
// ]]> 
</script> 
<div> 
<textarea id="txt" runat="server" name="txt" rows="10" cols="50"></textarea> 
<asp:Button ID="btnInsert" runat="server" Text="服务器端插入(_)" OnClientClick="insert();"/> 
<input id="btnInsert2" name="insert" onclick="insert();" type="button" value="客户端插入(_)" runat="server"/></div> 
</asp:Content> 


  当打开后按下按钮出现了“Microsoft JScript 运行时错误: 'document.getElementById(...)' 为空或不是对象”。这是什么原因呢?原来好好的,怎么套用个母版页就出现这个奇怪的问题呢?困扰了好久,和朋友讨论了一下,终于找到了答案……

  三、分析本质

  原来我们仔细看看其生成的HTML代码:

  单一页面:

以下是引用片段:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head><title> 单一页面抽象模型-YJingLee</title> 
<script language="javascript" type="text/javascript"> 
// <!CDATA[ 
function insert() { 
document.getElementById("txt").value=document.getElementById("txt").value+"(__)"; 
return; 
} 
// ]]> 
</script> 
</head> 
<body> 
<form name="form1" method="post" action="Default.aspx" id="form1"> 
<div> 
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTEzMjE5NDA0NWRkKlEH1jSXJkIbnUaP2d9Dra8LQEk=" /> 
</div> 
<div> 
<textarea name="txt" id="txt" rows="10" cols="50"></textarea> 
<input type="submit" name="btnInsert" value="服务器端插入(_)" onclick="insert();" id="btnInsert" /> 
<input name="btnInsert2" type="button" id="btnInsert2" onclick="insert();" value="客户端插入(_)" /></div> 
<div> 
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBALVid/5DQKShrDCCQL5w9POBQL5w4vOBZPGqxUU/yvoKTqG8k+uG8YroGTv" /> 
</div></form> 
</body> 
</html> 


  再看看套用母版页之后,生成的HTML代码:

以下是引用片段:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head><title>使用母版页面抽象模型-YJingLee</title></head> 
<body> 
<form name="aspnetForm" method="post" action="Default2.aspx" id="aspnetForm"> 
<div> 
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTEwMTY2NjE0OWRkADUETiohcorj2qXOE9M1qhFVw20=" /> 
</div> 
<div> 
<script language="javascript" type="text/javascript"> 
// <!CDATA[ 
function insert() { 
document.getElementById("txt").value=document.getElementById("txt").value+"(__)"; 
return; 
} 
// ]]> 
</script> 
<div> 
<textarea name="ctl00ContentPlaceHolder1txt" id="ctl00_ContentPlaceHolder1_txt" rows="10" cols="50"></textarea> 
<input type="submit" name="ctl00ContentPlaceHolder1btnInsert" value="服务器端插入(_)" onclick="insert();" id="ctl00_ContentPlaceHolder1_btnInsert" /> 
<input name="ctl00ContentPlaceHolder1btnInsert2" type="button" id="ctl00_ContentPlaceHolder1_btnInsert2" onclick="insert();" value="客户端插入(_)" /></div> 
</div> 
<div> 
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBAKyga4JAtO59ZELApOT2tEDApOTwvAC83bfMO00kt0PYcRte7XQOsXBcFE=" /> 
</div></form> 
</body> 
</html> 


  是不是看到问题了,源文件控件元素的ID和生成HTML文件的ID不一致。表单from的name属性和id属性变成了aspnetForm,控件的id属性被无缘无故了加上了ctl00_ContentPlaceHolder1_前缀,其name属性也加上了ctl00ContentPlaceHolder1前缀。

  这下知道了,难怪提示“'document.getElementById(...)' 为空或不是对象”的错误了,原来生成页面后其ID都变了。

  那么我们如何解决它呢?既然他id变了,我们就把JS代码id改为生成后的id。代码如下:

以下是引用片段:
  function insert() { 
  document.getElementById("ctl00ContentPlaceHolder1txt").value=document.getElementById("ctl00ContentPlaceHolder1txt").value+"(__)"; 
  return; 
  } 
  //或者 
  function insert() { 
  document.getElementById("ctl00_ContentPlaceHolder1_txt").value=document.getElementById("ctl00_ContentPlaceHolder1_txt").value+"(__)"; 
  return; 
  } 


  好了,问题解决了,不过想想有什么更好的办法呢?到底为什么呢?

  其实分析一下,它是后来生成的客户端id,我们可以用C#语句Control的ClientID属性,像这样写:txt.ClientID; txt还是原来控件的id,后面的ClientID就是新生成的id。txt.ClientID是从程序里取到的后来生成新的id,这样不是更好吗。修改代码如下:

以下是引用片段:
  function insert() { 
  document.getElementById("").value=document.getElementById("").value+"(__)"; 
  return; 
  } 


  还有在后台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有以下三种修改方法:(当然我还是推荐第三种)

以下是引用片段:
  document.getElementById("ctl00编辑区ID控件ID"); 
  document.getElementById("ctl00_编辑区ID_控件ID"); 
  document.getElementById(""); 


  至于为什么,是自己还没有深刻理解其中的根源还是.NET机制问题呢?

  在我们设计时往往就会出现一些莫名其妙的问题,我想我们遇到问题时,冷静思考,把握主次,从底层框架入手,纠其原因,相信最终会找到答案。

来源:http://blog.csdn.net/lzt7/archive/2008/05/14/2445800.aspx

转载于:https://www.cnblogs.com/vinsonLu/p/3772699.html

JavaScript技巧:解决document.getElementById不是对象的问题 这是因为在解析HTML面时,浏览器会按照从上到下的顺序执行代码。这样,在面完全加载后,JavaScript代码将执行,并且。// 正确示例:获取元素的代码位于window.onload事件处理函数中。的参数(元素的ID)拼写错误面中没有该ID的元素。标签的底部,者将代码放在外部JavaScript文件中,并在。的参数是正确的,并且确保面中存在该ID的元素。为不是对象的问题,并成功获取所需的元素。事件处理函数中,确保在面完全加载后执行。通过上述修改,我们将获取元素的代码放在。 阅读详情

相关推荐

Aruba无线控制器实战:如何用Client Match优化企业办公区漫游(附SNR调优技巧)

本文深入解析了如何利用Aruba无线控制器的Client Match功能优化企业办公区无线漫游体验。通过实战配置,详细阐述了基于SNR(信噪比)的精细化调优策略,包括阈值设定、负载均衡与场景化参数调整,旨在解决终端粘滞、乒乓漫游等问题,实现智能、平滑的无缝漫游。

weixin_28318011的博客 195

ASP.NET 2.0 创建母版引来的麻烦

本文将为大家介绍一下 ASP.NET 2.0 在创建母版时引来的麻烦,并分析了问题产生的实质,大家在实际操作中多多注意一下。   一、问题提出   由于总体排版和设计的需要,我们往往创建母版来实现整个网站的统一性,最近我由于统一性的需要,把原来整个项目单独的面全部套用了母版。但是出现了一个错误……在我的Blog中记录一下,方便大家参考。   二、 抽象模型   由于整个...

weixin_30512043的博客 101

深度学习二分类实战:用Python+Keras搞定基因表达数据预测(附完整代码)

本文详细介绍了如何使用Python和Keras构建深度学习模型进行基因表达数据的二分类预测。通过数据预处理、特征选择、神经网络构建及优化策略,特别针对小样本场景提供了调参技巧和模型解释方法。文章还包含完整的代码示例,帮助读者快速掌握深度学习在生物信息学中的应用。

weixin_30642561的博客 218

出现document.getElementById不是对象的原因及解决方法

今天写一个JS代码,发现老出现“document.getElementById不是对象”,经过多番求解,终于解决此问题,现将经验与源码爱好者网友分享。其实出现这种错误一般情况下不是JavaScript本身代码的问题,很多情况下,是由于你的疏忽而没有定义ID所致,检查的顺序应该是先内容后js。 1.出现 'null’为不是对象的情况: 2.出现document.getElementById...

weixin_43079157的博客 6239

document.getElementById(...)' 为不是对象

将script代码写入body标签中。置于head中的javascript代码在浏览器解析时生成的DOM中,而其中所取的Element出现在浏览器生成的DOM的body中,js被执行时,因为这个Element在执行语句之后,所以就会找不到此Element,从而报对象不是对象这个错误

Nothing的专栏 1036

ASP.NET 创建母版导致js出现“ 'document.getElementById(...)' 为不是对象错误

本文将为大家介绍一下 ASP.NET 2.0 在创建母版时引来的麻烦,并分析了问题产生的实质,大家在实际操作中多多注意一下。   一、问题提出  由于总体排版和设计的需要,我们往往创建母版来实现整个网站的统一性,最近我由于统一性的需要,把原来整个项目单独的面全部套用了母版。但是出现了一个错误……在我的Blog中记录一下,方便大家参考。  二、 抽象模型  由于整个面内容过多,

sytWeibo的专栏 4009

ASP.NET 2.0 创建母版导致js出现“ 'document.getElementById(...)' 为不是对象错误

本文将为大家介绍一下 ASP.NET 2.0 在创建母版时引来的麻烦,并分析了问题产生的实质,大家在实际操作中多多注意一下。  一、问题提出  由于总体排版和设计的需要,我们往往创建母版来实现整个网站的统一性,最近我由于统一性的需要,把原来整个项目单独的面全部套用了母版。但是出现了一个错误……在我的Blog中记录一下,方便大家参考。  二、 抽象模型  由于整个面内容过多

7140

ASP.NET 2.0 创建母版导致js出现“ 'document.getElementById(...)' 为不是对象错误...

本文将为大家介绍一下 ASP.NET 2.0 在创建母版时引来的麻烦,并分析了问题产生的实质,大家在实际操作中多多注意一下。   一、问题提出   由于总体排版和设计的需要,我们往往创建母版来实现整个网站的统一性,最近我由于统一性的需要,把原来整个项目单独的面全部套用了母版。但是出现了一个错误……在我的Blog中记录一下,方便大家参考。   二、 抽象模型   由于整个面内容过多...

weixin_30477293的博客 141

Microsoft JScript 运行时错误: 'document.getElementById(...)' 为不是对象

在项目中遇到一个很头疼js问题。 第一种方法 string strJS = "<script language='javascript' type='text/javascript'>AlertAndReturn('保存成功');</script>";ScriptManager.RegisterStartupScript(this, this.GetType(),...

weixin_34111790的博客 201

[已经完美解决]IE下 'document.getElementById(...)' is null

View Code 1 $.ajax({ 2 type: "POST",//请求方式 3 url: "text.txt",//地址,就是action请求路径 4 cache:false, 5 data: "text",//数据类型text xml json script jsonp 6 success: ...

weixin_30416871的博客 168

javascript】异常错误

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>JS Bin</title> <script type="text/javascript"> window.onload = function(){ ...

weixin_33911824的博客 546

eval和document.getElementById

eval和document.getElementById都能把字符串转化为对应的对象是数值,但两者之间还是有区别的,请看以下几个例子: 假如面上存在ID为aaa的标记,以下a和b得到的是一样的结果 var a=eval('aaa'); var b=document.getElementById('aaa'); var a=eval('aaa'); var b=document.ge...

weixin_30824277的博客 173

JavaScript】Failed to execute ‘querySelector‘, is not valid selector

JS中使用 getElementById 时,标识符以数字开头没有问题。但是,querySelector 是 CSS3 选择器,以数字开头的标识符就会报错。当使用 querySelector 时,出现这个错误,很可能的一个原因是:选择标识符以数字开头。

纠缠AI的亮子 2345

console.log(document.getElementById("div"))找不到不会报错,会返回null

console.log(document.getElementById("div"))找不到不会报错,会返回null

Ych_cxy的博客 793
上一篇: 通过php安装Imagick扩展给动态gif图片打水印
下一篇: Java 可变参数
weixin_30527551
博客等级 码龄11年 124粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值