2010-11-25 103 views
0

这里是我的JavaScript:我的JavaScript有什么问题? (C#/ ASP.NET)

<script type="text/javascript"> 
function onholdev(index) { 
    var chk = document.getElementById('<%=grdCons.Rows[' + index + '].FindControl("chkHold").ClientID %>'); 
    var txt = document.getElementById('<%=grdCons.Rows[' + index + '].FindControl("txtReason").ClientID %>'); 


    if (chk.checked == true) { 
     txt.disabled = false; 
    } 
    else { 
     txt.disabled = true; 
     txt.value = ""; 
    } 
} 
</script> 

的 '索引' 变量来自于我的GridView的RowDataBound事件,像这样:

CheckBox chkHold = ((CheckBox)e.Row.FindControl("chkHold")); 
    chkHold.Attributes.Add("onchange", "onholdev(" + e.Row.RowIndex + ")"); 

不过,我在我的函数的第一行(从var chk开始)获取'字符串字符串中的太多字符'。为什么是这样?

回答

3

你在混合客户端和服务器端脚本......你不能这样做。这是执行服务器端:

grdCons.Rows[' + index + '].FindControl("chkHold").ClientID 

但是你调用它的客户端,并试图通过一个ID,这只是不是你可以做的,看看你的渲染JavaScript函数,这将更加清晰。而不是仅仅使用该表的ID,那么你就可以找到你的控件的方式,例如:

var row = document.getElementById("grdCons").rows[index]; 
var inputs = row.getElementsByTagName("input"); 
//then filter by ID match, class, whatever's easiest and set what you need here 
+0

这并不完全正确 - 他使用服务器端输出控制,几乎是唯一途径的客户端ID试试这个以ASP.Net的形式获得Id,并随机生成它们。生成的JavaScript应该看起来像这样:`var chk = document.getElementById('chk_0000001');`。也就是说,我认为最好是尽量保持所有的服务器端,如果你可以 – Basic 2010-11-25 10:19:25

+0

@Basiclife - 这是不正确的,看看这个函数,`index`是一个参数传入,这将有JavaScript尝试访问服务器按索引收集(`grdCons.Rows`),你根本无法做到这一点。 – 2010-11-25 10:20:56

+0

啊 - 我没有发现他在通话中使用JS索引。是的,这是永远不会工作:) – Basic 2010-11-25 10:22:49

0

的问题是您在' + index + '使用单引号字符。将这些改为双重qoutes,它应该工作。

1

这可能是因为ASP.NET抛出一个错误,写入客户端调用getElementByIdonholdev函数在客户端执行,所以不能将索引参数传递给执行服务器端的ASP.NET。用此方代码 -

<script type="text/javascript"> 
function onholdev(checkbox, textbox) { 
    var chk = document.getElementById(checkbox); 
    var txt = document.getElementById(textbox); 

    if (chk.checked == true) { 
     txt.disabled = false; 
    } 
    else { 
     txt.disabled = true; 
     txt.value = ""; 
    } 
} 
</script> 

更换服务器:

CheckBox chkHold = ((CheckBox)e.Row.FindControl("chkHold")); 
chkHold.Attributes.Add("onchange", "onholdev('" + 
    e.Row.FindControl("chkHold").ClientID + "','" + 
    e.Row.FindControl("txtReason").ClientID + "')");