我的内容页面中有一个表单,我正在通过Javascript进行一些客户端验证。如果我将JS代码直接放在内容页面中,Javascript就会按预期运行。但是如果我将JS代码放在它自己的文件中并尝试从内容/母版页(通过脚本标签的src属性)访问它,那么当调用JS中的验证函数时,我会收到运行时错误。
具体来说,我得到以下错误。 Microsoft JScript运行时错误:此行的预期/必需对象 - document.getElementById('<%= txtemailId.ClientID%>')。value
txtemailId位于内容页面中。
Javascript代码放在validation.js中,并通过母版页访问。
我猜的原因是当.net正在解析文件时,它无法用后来生成的客户端值替换txtemailId.ClientID。那么,应该怎么做呢?谢谢!
答案 0 :(得分:1)
你是对的,如果此代码在ASP.Net文件中,代码<%=txtemailId.ClientID %>
将仅被ASP.Net替换为真实的客户端ID。因此,如果你将这个javascript放在一个单独的.js文件中,ASP.Net将不知道它,并且代码将不会被解析。
实现此目的的最简单方法是创建函数的控件ID参数。这样,您就可以在.aspx(或.ascx)文件中使用调用javascript代码以及<%=txtemailId.ClientID %>
代码。
答案 1 :(得分:1)
答案很简单。
在您的内容页面中声明一个内嵌的JScript变量,确保它位于您的标记之上。
<script>
var emailClientId = <%=txtemailId.ClientID%>;
</script>
在include.js文件中,使用全局范围的emailClientId
变量。
显然这有点笨拙,因为并非所有JScript代码都包含在include.js文件中,这使得调试/诊断变得困难,因为不清楚具体来自何处。您应该在代码中清楚地评论/记录这一点,以便将来更容易维护代码库。
答案 2 :(得分:0)
独立.js文件不是通过ASPX解析器运行的,因此您的表达式未被评估。
要解决此问题,您可以使用控件的ID在ASPX文件中设置全局变量(或函数参数或其他内容),然后在独立的.js文件中使用它们。
或者,您可以使用类名(不会被损坏)而不是ID。 (这很简单,使用jQuery)
答案 3 :(得分:0)
这样的方法最适合您想要实现的目标:
<强> validation.js 强>
var Validation = {
EmailId: null,
Validate: function() {
var email = document.getElementById(EmailId).value;
}
}
<强> page.aspx 强>
Validation.EmailId = '<%=txtemailId.ClientID %>'; //initialize
Validation.Validate(); //whenever you want to validate