好的,所以我在多视图的页面上有多个ASP文本框和ASP按钮。 只有在文本框中输入文本时,才应启用与每个文本框关联的提交按钮。所以,我写了一个Javascript函数来处理这个,我收到一个错误,说 “document.getElementById(...)'为null或者不是对象” < / p>
function checkEmptyTxtBox(val, savebtn) {
if (val.value.replace(/^\s+|\s+$/g, "") == "")
document.getElementById(savebtn).disabled = true;
else
document.getElementById(savebtn).disabled = false;
}
<asp:TextBox
ID="txt_Comments_2"
runat="server"
Wrap="true"
TextMode="MultiLine"
onkeyup="checkEmptyTxtBox(this,'<%= btnSave2.ClientID %>')">
</asp:TextBox>
<asp:Button
ID="btnSave2"
runat="server"
text="Save"
Enabled="False"/>
这是在VS2010上。
答案 0 :(得分:2)
您无法使用<%= %>
设置服务器端控件的属性。如果您查看渲染的源,它看起来像这样:
onkeyup="checkEmptyTxtBox(this,'<%= btnSave2.ClientID %>')"
它实际上包含<%= %>
。
您可以在页面加载上设置属性,如下所示:
protected void Page_Load(object sender, EventArgs e)
{
txt_Comments_2.Attributes["onkeyup"] = "checkEmptyTxtBox(this,'" + btnSave2.ClientID + "')";
}
修改强>:
许多人愿意指出;这不是用HTML进行事件注册的“最佳”方式。相反,JavaScript应该通过添加事件侦听器来绑定到keyup事件。例如,使用jQuery,它变为:
$(document).ready(function() {
$('#<%: txt_Comments_2.ClientID %>').keyup(function() {
if ($(this).val().replace( /^\s+|\s+$/g , "") == "") {
$('#<%: btnSave2.ClientID %>').attr('disabled', 'disabled');
}
else {
$('#<%: btnSave2.ClientID %>').removeAttr('disabled');
}
});
});
您的ASP.NET标记如下所示:
<asp:TextBox
ID="txt_Comments_2"
runat="server"
Wrap="true"
TextMode="MultiLine" />
<asp:Button
ID="btnSave2"
runat="server"
text="Save"
Enabled="False"/>
这样做的好处是不会在事件注册时使HTML混乱。甚至还有其他一些可能更简洁的方法,比如KnockoutJS。
答案 1 :(得分:0)
这可能是因为你的按钮的ID是btnSave2,但你正在传递&lt;%= btnSave2.ClientID%&gt;作为savebtn。 Javascript无法通过您指定的ID找到该元素。
另外,我刚读过有类似问题的人,他们没有做过RegisterStartupscript。
请查看这些:
http://forums.asp.net/t/1160208.aspx/2/10?document+getelementbyid+is+null+or+not+an+object http://msdn.microsoft.com/en-us/library/asz8zsxy.aspx