【问题标题】:How to Determine What TextBox Will Do Based on RadioButtonList Selection - Using JavaScript如何根据 RadioButtonList 选择确定 TextBox 将做什么 - 使用 JavaScript
【发布时间】:2011-12-10 02:38:01
【问题描述】:

我有一个 RadioButtonList,根据选择的内容,我需要一个 TextBox 来做一些不同的事情。如果选择了第一个 ListItem,我需要 TextBox 只允许输入 4 个数值。如果选择了第二个 ListItem,我需要 TextBox 正常工作。我有用于数字和长度验证的功能,我知道这些功能可以工作,但似乎无法弄清楚如何根据选择的功能来实现这些功能。我在下面的代码中包含了数字和长度函数。我遇到的主要问题是确定选择了哪个以及基于该选择,TextBox 应该如何工作。

// Only allows numeric values
function isNumeric(num){
    var charCode = (num.which) ? num.which : event.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57)) { return false; }
    else { return true; } 
}

// Validates TextBox Length
function validateTextBoxLength() {
    var tb = document.getElementById("TextBox1").value;
    if (tb.length > 1 && tb.length != 4) {
        alert("TextBox must be 4 digits.");
        return false;
    }
    return true;
}

// Check for RadioButtonList selection
function rbSelectedValue() {
    var radio = document.getElementsByName('<%= rblSearchType.ClientID %>');
    var tb = document.getElementById("TextBox1").value;
    for (var i = 0; i < radio.length; i++) {
        if (radio[i].checked) {
            // alert("RadioButton 1 Selected");
            if (tb.length > 1 && tb.length != 4) {
                alert("TextBox must be 4 digits.");
                return false;
            }
            else {
            return true;
            }
        }
        else {
        // alert("RadioButton 2 Selected");
        return true;
    }
}

<asp:RadioButtonList ID="RadioButtonList" runat="server" AutoPostBack="true" RepeatDirection="Horizontal" onclick="rbSelectedValue()">
    <asp:ListItem Value="List Item 1" Selected="True">Test 1</asp:ListItem>
    <asp:ListItem Value="List Item 2">Test 2</asp:ListItem>
</asp:RadioButtonList>

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

任何帮助将不胜感激,并在此先感谢您!

【问题讨论】:

    标签: c# javascript visual-studio-2010


    【解决方案1】:

    您在 RBL 的 HTML 标记中引用的 onclick 事件实际上是服务器端操作。

    为了在客户端触发 onclick 事件,您需要在代码隐藏中将 onclick 事件添加到 RBL 的属性中:

    RadioButtonList.Attributes.Add("onclick", "rbSelectedValue()");
    

    更新

    我从来没有使用 document.getElementsByName 方法来获取 RBL 数据,所以我不能告诉你这是否会导致问题,但我可以告诉你什么对我们有用。我们使用下面的代码成功的从RBL中提取出当前选中的值,其中参数是RBL的ClientID:

    function getRadioListSelectedValue(sName) {
        var theList = document.getElementById(sName);
        var returnVal = ''; //empty string, not null
    
        if (theList) {
            for (var i = 0; i < theList.childNodes.length; i++) {
                if (theList.childNodes[i].name == sName) {
                    if (theList.childNodes[i].checked) {
                        returnVal = theList.childNodes[i].value;
                        break;
                    }
                }
            }
        }
        return returnVal;
    }
    

    我建议尝试这种方法来获取您当前选择的值。

    【讨论】:

    • 我尝试添加它,但似乎仍然无法正常工作。它不会抛出任何错误,我单步执行代码并没有看到任何异常。您如何看待 OnSelectedIndexChanged 事件?
    • 无论我选择哪个 ListItem,它仍然允许我在 TextBox 中键入我想要的任何内容。当我在函数中放置断点时,它会跳过“if”语句并返回 true。 -- "radio[i].checked" 显示为未定义。
    • @Brian:好的,我认为检查项目可能是一个问题,但想先得到确认。我已经用我们用来从 RBL 中提取当前选定值的代码更新了答案。
    • 我能够使用您上面提供的代码获得选定的值,但我实现了@Anand 提供的大部分代码,现在我可以使用它了! "test" 是一个返回 isNumeric 的新函数,因此可以附加/分离两个事件 '...case "1": // 验证 tb.attachEvent("onkeypress", test); tb.attachEvent("onblur", validateTextBoxLength);休息;案例“2”:tb.detachEvent(“onkeypress”,测试); tb.detachEvent("onblur", validateTextBoxLength);...'
    【解决方案2】:

    Javascript 具有功能特性。您可以非常轻松地使用函数。

    // Check for RadioButtonList selection
    function rbSelectedValue() {
        var radio = document.getElementsByName('<%= rblSearchType.ClientID %>');
        var validation;
        for (var i = 0; i < radio.length; i++) {
            if (radio[i].checked) {
                switch(n)
                {
                   case 1: 
                   //do validation 
                   validation = function(){
                         validateTextBoxLength();
                         isNumeric(document.getElementById("TextBox1").value);
    
                   }
                   break; 
                   case 2:
                   //do nothing, if textbox
                   validation = function(){
                   }
                   break;
                }
            }
            validation();
    }
    

    【讨论】:

    • 我将它添加到函数中,但它在最终验证()==“验证未定义”时中断。我在函数中添加了一个断点并逐步执行它,但无法弄清楚它为什么在它完成之前就中断了。有什么想法吗?
    • 非常感谢您的帮助我真的很感激!
    猜你喜欢
    • 2019-02-09
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多