通过传递参数,在javascript函数中捕获控件ID

通过传递参数,在javascript函数中捕获控件ID,javascript,asp.net,Javascript,Asp.net,大家好,我的JS技能有点生疏,但我正在尝试创建一些函数,以便它们在客户端工作,而不是运行服务器代码,下面是我要做的: 我有一个下拉控件和一个文本框。文本框取决于向下的值,并在页面加载时禁用 我正在尝试调用一个函数,因此如果从下拉列表中选择“是”,文本框将启用文本输入。以下是我正在做的: function DependentControlByDropDown(sender, Control, DependentControlID) { try { var senderCon

大家好,我的JS技能有点生疏,但我正在尝试创建一些函数,以便它们在客户端工作,而不是运行服务器代码,下面是我要做的:

我有一个下拉控件和一个文本框。文本框取决于向下的值,并在页面加载时禁用

我正在尝试调用一个函数,因此如果从下拉列表中选择“是”,文本框将启用文本输入。以下是我正在做的:

function DependentControlByDropDown(sender, Control, DependentControlID) {
    try {

       var senderControl = sender.selectedOptions[0].text;
       var controlEnable = (senderControl == Control);
       console.log(controlEnable);

       var control = document.getElementById(DependentControlID); this gives me NULL if i do console.log(control)
       DependentControlID.disabled = controlEnable; //controlEnable has a value of either TRUE or FALSE but it doesn't work on DependentControlID
       }
   catch (e) {
        alert("DependentControlByDropDown : " + e.message);
   }
  }
我在下拉列表中这样称呼它:

onchange="DependentControlByDropDown(this,'Yes','txtbox1')"

所以这里发生的是,我得到了正确的值“Yes”,或者“No”,我用console.log测试了它。问题在于dependednt控件。如果我执行
console.log(DependentControlID)
操作,它会显示正确的控件,但当我尝试
disabled=false时,它不起作用。我还尝试了
document.getElementByID(DependentControlID).disabled=false
,但这也不起作用。有人帮忙吗

问题是您试图通过文本的ID访问文本框。您需要在其节点值上设置
disabled
属性,即
control

此外,您试图将文本框的禁用属性设置为与
controlEnable
相同的值。我已将其设置为
controlEnable


函数dependentControlBy下拉列表(发送方、控件、DependentControlID){
试一试{
var senderControl=sender。选择选项[0]。文本;
var controlEnable=(senderControl==Control);
console.log('controlEnable',controlEnable);
log('DependentControlID',DependentControlID');
var control=document.getElementById(DependentControlID);
console.log('control',control');
control.disabled=!controlEnable;
}捕获(e){
警报(“DependentControlBy”下拉列表:“+e.message”);
}
}

对
不

问题是您试图通过文本的ID访问文本框。您需要在其节点值上设置
disabled
属性,即
control

此外,您试图将文本框的禁用属性设置为与
controlEnable
相同的值。我已将其设置为
controlEnable


函数dependentControlBy下拉列表(发送方、控件、DependentControlID){
试一试{
var senderControl=sender。选择选项[0]。文本;
var controlEnable=(senderControl==Control);
console.log('controlEnable',controlEnable);
log('DependentControlID',DependentControlID');
var control=document.getElementById(DependentControlID);
console.log('control',control');
control.disabled=!controlEnable;
}捕获(e){
警报(“DependentControlBy”下拉列表:“+e.message”);
}
}

对
不

正如我们在您的问题评论中推断的那样,您正在使用ASP.NET

这一点非常重要,因为ASP.NET会覆盖分配的ID以确保它们是唯一的。例如,如果你要做

<asp:Textbox runat="server" id="txtbox1"></asp:Textbox>
现在呈现的HTML将如下所示

<input id="txtbox1">


注意:如果页面上有多个文本框,例如,如果您在
GridView
中继器中使用它,请不要使用
clientMode=“static”
!它将创建无效的重复ID。

正如我们在您问题的评论中推断的那样,您正在使用ASP.NET

这一点非常重要,因为ASP.NET会覆盖分配的ID以确保它们是唯一的。例如,如果你要做

<asp:Textbox runat="server" id="txtbox1"></asp:Textbox>
现在呈现的HTML将如下所示

<input id="txtbox1">


注意:如果页面上有多个文本框,例如,如果您在
GridView
中继器中使用它,请不要使用
clientMode=“static”
!它将创建无效的重复ID。

值得注意的是,OP的问题包括以下内容:
var control=document.getElementById(DependentControlID);如果执行console.log(control)
,则返回NULL。如果
document.getElementById(DependentControlID)
返回
null
,正如OP所描述的,我看不到您描述的解决方案有效。虽然没有MCVE,这是不可能知道的。我有一种预感,你的答案会很好,但还有一些地方不对劲。这不起作用,当我创建文档时,它仍然显示为空。getElementById(DependentControlID)你的编辑实际上没有改变任何东西。无论您是执行
控制…
还是
document.getElementById(DependentControlID)…
,OP都会说它正在返回
null
。为什么会发生这种情况。在所提供的示例中,它工作得非常好。它能够从下拉列表中捕获控件和值,但无法禁用或启用它。我不太清楚,我添加了更多控制台日志,以显示所有值都被正确分配和记录。。。也许我遗漏了什么?值得注意的是OP的问题包括以下内容:
var control=document.getElementById(DependentControlID);如果执行console.log(control)
,则返回NULL。如果
document.getElementById(DependentControlID)
返回
null
,正如OP所描述的,我看不到您描述的解决方案有效。虽然没有MCVE,这是不可能知道的。我有一种预感,你的答案会很好,但还有一些地方不对劲。这不起作用,当我创建文档时,它仍然显示为空。getElementById(DependentControlID)你的编辑实际上没有改变任何东西。无论您是执行
控制…
还是
document.getElementById(DependentControlID)…
,OP都会说它正在返回
null
。为什么会发生这种情况。在提供的示例中,它工作得非常好