输入类型=“数字”鼠标滚轮不滚动

问题描述 投票:0回答:5

我很困惑为什么鼠标滚轮不会增加/减少简单表单元素中的值。

<input type="number" step="0.125" min="0" max="0.875">

它在这个代码片段上工作得很好,但当我创建一个简单的通用 html 文档时就不行了:

<!DOCTYPE html>
<html>
<head></head>
<body>
    <form action="">
        <input type="number" step="0.125" min="0" max="0.875">
    </form>
</body>
</html>

当我在多个浏览器中查看此内容时,鼠标滚轮不滚动。我也禁用了浏览器扩展等。我周围的其他几台机器也有同样的行为。

是什么原因导致此功能不起作用?这是操作系统/浏览器问题吗?

我几乎觉得这可能是更深层次的问题,可能是鼠标/驱动程序问题的类型?


我测试过的内容:

  • 赢7
  • Chrome - 失败
  • Firefox - 失败
  • Firefox 开发版 - 失败
  • Safari - 通行证
  • IE11 - 失败
  • IE9 - 失败

  • OSX

  • Chrome - 失败
  • Safari - 失败
  • Firefox - 失败
html input
5个回答
2
投票

为了完全避免浏览器问题,您可以尝试使用 jQuery mousewheel 插件手动更改输入值。例如:

index.html

<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
    <script type="text/javascript" src="jquery.mousewheel.js"></script>
    <script type="text/javascript" src="scroll.js"></script>
</head>
<body>
    <form action="">
        <input id="myInput" type="number" step="0.125" min="0" max="0.875">
    </form>
</body>
</html>

scroll.js

$(function() {
    $('#myInput').on("mousewheel", function(event) {
        event.preventDefault();
        $this = $(this);
        $inc = parseFloat($this.attr('step'));
        $max = parseFloat($this.attr('max'));
        $min = parseFloat($this.attr('min'));
        $currVal = parseFloat($this.val());

        // If blank, assume value of 0
        if (isNaN($currVal)) {
            $currVal = 0.0;
        }

        // Increment or decrement numeric based on scroll distance
        if (event.deltaFactor * event.deltaY > 0) {
            if ($currVal + $inc <= $max) {
                $this.val($currVal + $inc);
            }
        } else {
            if ($currVal - $inc >= $min) {
                $this.val($currVal - $inc);
            }
        }
    });
});

在 Chrome 和 Firefox 中都适合我。当鼠标悬停在输入上时,也可以触发

mousewheel
事件,而不仅仅是选择它时。


1
投票

代码片段在 IFRAME 中运行。将您的代码放入 IFRAME 中,它也会起作用。为什么 - 我不知道,但它有效。

http://codecorner.galanter.net/bla2.htm - 不起作用(代码本身) http://codecorner.galanter.net/bla.htm - 有效 - IFRAME 中的上一页

编辑:这是在 Chrome 41 中运行的演示:http://codecorner.galanter.net/bla_mousescroll.mp4

编辑2:我想我已经弄清楚了,它不是 IFRAME。为了发生滚动事件 - 实际内容必须是可滚动的。例如,如果您像这样重做您的示例:

<!DOCTYPE html>
<html>
<head></head>
<body>
    <form action="" style="width:200px;overflow:scroll">
    <div style="width:300px">
            <input type="number" step="0.125" min="0" max="0.875">
    </div>
    </form>
</body>
</html>

容器形式小于其内容 - DIV - 滚轮在数字字段上工作:http://codecorner.galanter.net/bla3.htm


1
投票

所以我想我已经明白了。

首先我将你的代码复制到一个html文档中并在Chrome中打开它,增量不起作用。 其次,我删除了代码中除了输入框之外的所有内容,仍然不起作用。

然后我使用 chrome 检查器将该代码注入到随机网站中,我在 gmail、reddit 和我自己的网站上进行了尝试。 Gmail 可以用,reddit 可以用,但我自己的网站不能用。

然后我禁用了 javascript,它在任何地方都不起作用。

因此,为了回答你的问题,stackoverflow /许多其他网站使用 javascript 来自动将该功能添加到数字输入中。


0
投票

您只需要在输入元素上声明一个“onmousewheel”事件。无需 JavaScript。

<label for="wheeltest">Value</label>
<input type="number" step="0.125" min="0" max="0.875" onmousewheel>


0
投票

我不想像 Elliots 帖子中那样使用 JQuery,并且在 google 上没有容易获得的 TS 实现,所以这就是我写的。

    const onMouseWheel = <T extends Element & { value: string }>(
        event: React.WheelEvent<T>
    ) => {
        event.preventDefault();
    
        const el = event.target as T;
        const curVal = el.value === "" ? 0.0 : parseFloat(el.value);
    
        if (event.deltaY === 0) return curVal;
    
        const inc = parseFloat(el.getAttribute("step") || "1");
        const max = parseFloat(el.getAttribute("max") || "9999");
        const min = parseFloat(el.getAttribute("min") || "-9999");
    
        const scrollAmount = -event.deltaY / 180;
        const change = scrollAmount * inc;
    
        const changedVal = curVal + change;
        if (changedVal > max || changedVal < min) return curVal;
    
        return changedVal;
    };
    
    export default onMouseWheel;

此代码侦听鼠标滚轮事件,防止默认行为并根据 的 step、min 和 max 属性手动计算新值。

要使用它,只需将事件处理程序添加到您的输入中,如下所示:

    <input
      type="number"
      step="0.125"
      min="0"
      max="0.875"
      onWheel={onMouseWheel}
    />
© www.soinside.com 2019 - 2024. All rights reserved.