微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

已解决二进制/十六进制或任何其他基数的行为类似于 input type=number

如何解决已解决二进制/十六进制或任何其他基数的行为类似于 input type=number

使用任何非移动设备的浏览器,数字输入除了输入数字外,还有许多改变它的功能: - 按向上箭头键增加数值,向下箭头键减少数值。如果按住不放,会快速增加或减少step认为1(整数)。此外,在大多数浏览器上,选择它时会在右侧显示两个额外的按钮来增加和减少它(按住这些按钮也会快速增加/减少):

enter image description here

然而,这只适用于十进制数。没有一种方法可以输入一个字段,比如十六进制数字。存在允许用户在其中输入任何字符的文本版本 (<input type="text">),并且 JavaScript 可以使用正则表达式先验转换将文本解析为数字(或 bigint)。但这不会像数字一样,因为它是“通用”文本输入。

所以我的问题是,我如何使输入,即文本,表现得像一个数字但接受给定的基数(我不知道代码,但它对向上/向下做出反应,并且功能增加/ 减少,并且可以按住以进行持续更改)?拥有增加/减少十六进制数的能力对于制作 HTML 来说非常有用,这些 HTML 可以执行类似程序员的事情,例如颜色数学或与软件数据相关的事情。

解决方法

已解决(但部分解决)。这是一个模板,它仅适用于 bigint,除非您对其进行编辑以支持 number(双精度浮点)。我认为输入右侧的向上和向下箭头甚至不可能:

<input type="text" id="tester" class="HexInput"><br>
<input type="text" id="tester2" class="HexInput"><br>
<input type="text" id="tester2" class="SomethingElse"><br>

<script>
        window.onload = function(){    
            var FocusedElement = document.activeElement;
            if(FocusedElement.addEventListener ) {
                FocusedElement.addEventListener('keydown',this.keyHandler,false);
            } else if(FocusedElement.attachEvent ) {
                FocusedElement.attachEvent('onkeydown',this.keyHandler);
            }
        }

        function keyHandler(e) {
            if (((e.keyCode == 38)||e.keyCode == 40)&&(document.activeElement.className == "HexInput")) {
                var target;
                var InputNumber = BigInt(CorrectHexBigIntValue(document.activeElement.value))
                if (!e) var e = window.event;
                if (e.target) target = e.target;
                else if (e.srcElement) target = e.srcElement;
        
                if(e.keyCode == 38) {
                    InputNumber++
                } else if(e.keyCode == 40) {
                    if (InputNumber > 0n) {
                        InputNumber--
                    }
                }
                document.activeElement.value = InputNumber.toString(16).toUpperCase()
            }
        }
    function CorrectHexBigIntValue(String) {
        if ((/^([0-9]|[A-F]|[a-f])+$/).test(String) == false) {
            String = 0n
        }
        return CanConvertHexStringToBigInt = BigInt("0x" + String)
    }
</script>

但是有一个问题:向上按总是将插入符号(闪烁的文本光标)带到行的开头。在数字输入中,无论是按上还是下,这总是将插入符带到最后。

,

是的!解决了。很抱歉添加另一个答案,stackoverflow 有一个错误,无法让我在上一篇文章中添加更多文本。这里的意思是包含一个改进的版本,我找到了一种方法来防止插入符号进入行首,使用 preventDefault():

<input type="text" id="tester" class="HexNumberInput" onchange="code()"><br>
<input type="text" id="tester2" class="HexNumberInput" onchange="code()"><br>
<input type="text" id="tester3" class="somethingelse" onchange="code()"><br>
<script>
    window.onload = function(){
        var FocusedElement = document.activeElement;
        if(FocusedElement.addEventListener ) {
            FocusedElement.addEventListener('keydown',false);
        } else if(FocusedElement.attachEvent ) {
            FocusedElement.attachEvent('onkeydown',this.keyHandler);
        }
    }

    function keyHandler(e) {
        if (((e.keyCode == 38)||e.keyCode == 40)&&(document.activeElement.className == "HexNumberInput")) {
            var target;
            var InputNumber = BigInt(CorrectHexBigIntValue(document.activeElement.value))
            if (!e) var e = window.event;
            if (e.target) target = e.target;
            else if (e.srcElement) target = e.srcElement;
    
            if(e.keyCode == 38) {
                InputNumber++
                e.preventDefault()  //Prevents the caret (blinking text cursor) from being placed at the beginning of the line.
            } else if(e.keyCode == 40) {
                if (InputNumber > 0n) {
                    InputNumber--
                }
            }
            document.activeElement.value = InputNumber.toString(16).toUpperCase()
            document.activeElement.setSelectionRange(document.activeElement.value.length,document.activeElement.value.length)
        }
    }
    function code() {
        var b = 1 + 1
    }
    function CorrectHexBigIntValue(String) {
        //This converts the user's input hex string (negative numbers not allowed)
        //to BigInt.
        if ((/^([0-9]|[A-F]|[a-f])+$/).test(String) == false) {
            String = 0n
        }
        return CanConvertHexStringToBigInt = BigInt("0x" + String)
    }
</script>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。