【问题标题】:Programming a binary to decimal conversion form - What isn't working with my code? (JavaScript and HTML5)编写二进制到十进制转换形式 - 我的代码有什么问题? (JavaScript 和 HTML5)
【发布时间】:2015-05-23 12:22:48
【问题描述】:

我有一个像这样的简单 HTML 表单

<form class="TextCenter" onSubmit="ConversionScript">
    <input type="radio" name="Conversion" value="BintoDec" checked onClick="document.getElementById('stringToConvert').value='10000001 to 129';" /> Binary to Decimal
        <br />
    <input type="radio" name="Conversion" value="DectoBin" onClick="document.getElementById('stringToConvert').value='129 to 10000001'"/> Decimal to Binary
        <br />
        <br />
    String to Convert: 
    <input type="text" id="StringToConvert" value="10000001 to 129" onClick="document.getElementById('stringToConvert').value=''" />
        <br />
        <br />
    <input type="submit" />
</form>

当用户选择输入类型时,他们会输入一个字符串,例如“10000000”或“129”。然后,在提交表单时,它会根据用户的 JavaScript 选择进行转换,如下所示:

/* Misc. Global functions and variables (not used on their own or by one singular thing) */
function GetRadioValue() {
    var inputs = document.getElementsByName("Conversion");
    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].checked) {
            return inputs[i].value;
        }
    }
}

var stringToConvertRaw = document.getElementById("StringToConvert");
var stringToConvert = parseFloat(stringToConvertRaw.replace(/\D/g,''));
/* End Section */
/* Main Handler Function (initates lower level functions) */
function ConversionScript() {
    var radioValue = GetRadioValue();

    if (radioValue == "BintoDec")
    {
        BinaryToDecimal();
    }
    else if (radioValue == "DecToBin")
    {
        DecimalToBinary();
    }
}
/* End Section */
/* Function to Convert Binary to Decimal */
function BinaryToDecimal() {
    var conversionArray = stringToConvert.split('').reverse();
    var decimalSum = 0;

    for (var i = 0; i < conversionArray.length; i++) {
        if (conversionArray[i] === 1) {
            decimalSum += Math.pow(2, i);
        }
    }

    alert("The binary string " + stringToConvert + " is " + decimalSum + " .");
}
/* End Section */

但是,由于某种原因,在提交表单时,除了页面重新加载之外什么都没有发生。没有警报,什么都没有。我的代码语法是否有问题(我一直在使用 Java,所以这是可能的)还是我犯了另一种错误? (我已经检查了一百次,并没有发现问题所以......我认为一些新的眼睛可能会有所帮助。)

【问题讨论】:

    标签: javascript html forms


    【解决方案1】:

    由于您并没有真正提交表单,我会将您的提交输入转换为按钮并将 onSubmit 属性移动到按钮上的 onclick 属性。

    <form class="TextCenter">
        <input type="radio" name="Conversion" value="BintoDec" checked onClick="document.getElementById('stringToConvert').value='10000001 to 129';" /> Binary to Decimal
        <br />
        <input type="radio" name="Conversion" value="DectoBin" onClick="document.getElementById('StringToConvert').value='129 to 10000001'" /> Decimal to Binary
        <br />
        <br /> String to Convert:
        <input type="text" id="StringToConvert" value="10000001 to 129" onClick="document.getElementById('stringToConvert').value=''" />
        <br />
        <br />
        <button type="button" onclick="ConversionScript()" />Submit</button>
    </form>
    

    话虽如此,将 onclick 和 onsubmit 属性添加到标记通常被认为是一种不好的做法。您应该在 JavaScript 中将所有内容都绑定到甚至是侦听器。

    另外,你的脚本中有一些语法错误,所以我在这里清理了它们:

    /* Misc. Global functions and variables (not used on their own or by one singular thing) */
    function GetRadioValue() {
        var inputs = document.getElementsByName("Conversion");
        for (var i = 0; i < inputs.length; i++) {
            if (inputs[i].checked) {
                return inputs[i].value;
            }
        }
    }
    
    var stringToConvertRaw = document.getElementById("StringToConvert").value;
    var stringToConvert = parseFloat(stringToConvertRaw.replace(/\D/g,''));
    /* End Section */
    /* Main Handler Function (initates lower level functions) */
    function ConversionScript() {
        var radioValue = GetRadioValue();
    
        if (radioValue == "BintoDec")
        {
            BinaryToDecimal();
        }
        else if (radioValue == "DecToBin")
        {
            DecimalToBinary();
        }
    }
    /* End Section */
    /* Function to Convert Binary to Decimal */
    function BinaryToDecimal() {
        var conversionArray = stringToConvert.toString().split('').reverse();
        var decimalSum = 0;
    
        for (var i = 0; i < conversionArray.length; i++) {
            if (conversionArray[i] === 1) {
                decimalSum += Math.pow(2, i);
            }
        }
      }
    

    【讨论】:

    • 谢谢;我使用了您的语法修复,以及将“提交”输入更改为按钮。但是,我认为主要问题之一也是“if (conversionArray[i] === 1)...”这一行,因为字符串永远不会完全等于整数。我不能 100% 确定这是正确的解释,但我的代码在我更改之后终于正确执行了。
    • 你是对的,在 JavaScript 中 === 运算符正在检查严格相等 "1" === 1 永远不会评估为真,但它会与 == 运算符一起使用。很高兴您的脚本现在可以运行。
    【解决方案2】:

    当您提交表单时,默认操作将强制页面重新加载。您可以在表单的 onSubmit 末尾返回 false 以防止这种情况发生。尝试将onSubmit="ConversionScript" 替换为onSubmit="ConversionScript(); return false;

    【讨论】:

    • 或者他可以删除输入并将其转换为带有类型按钮的按钮,因此默认情况下不会提交表单。
    猜你喜欢
    • 2021-11-08
    • 2019-12-16
    • 1970-01-01
    • 2016-02-14
    • 2021-01-03
    • 2020-04-03
    • 2012-12-17
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多