【问题标题】:How can I avoid showing temporary values in <input>?如何避免在 <input> 中显示临时值?
【发布时间】:2021-12-07 01:08:27
【问题描述】:

我创建了一个仅接受 15 和 27 的倍数的输入。代码有效,但单击向上/向下箭头会在逻辑将其更改为接受值之前显示不接受的值一毫秒。 示例:当前值为 15。点击向上箭头后,输入首先显示 16,然后将其更改为 27。 我怎样才能避免这种情况?

这是我的代码:

Index.razor

<input type="number" @bind-value="@Foo">

Index.razor.cs

public partial class Index
{
    private int _foo = 500;

    private int Foo
    {
        get => _foo;
        set
        {
            if (value != _foo)
            {
                if (value > _foo)
                {
                    _foo = value;
                    while (_foo % 15 != 0 && _foo % 27 != 0)
                    {
                        _foo++;
                    }
                }
                else
                {
                    _foo = value;
                    while (_foo % 15 != 0 && _foo % 27 != 0)
                    {
                        _foo--;
                    }
                }
            }
        }
    }
}

非常感谢!

【问题讨论】:

  • 添加一些额外的html属性怎么样,比如:step="12" min="15" max="27"
  • 但 min="15" 和 max="5000"。所以,从 15 到 27 你是对的,step="12"。但是从 27 到下一个可能性,也就是 30,step="3"。当然,我也可以改变步长,但是当用户增加值时步长只有 3。如果用户决定减小该值,则再次为 12(因为不允许 27-3=24)。
  • 我的错误,误读了您的问题并认为您只是使用这两个值。 step 属性是固定的,因此不允许进行数学运算,但是您可以使用 js 对其进行更新,但这忽略了 .NET/Blazor 能够在没有 js 的情况下进行编码的事实;)好吧,我想您仅限于然后只有几个选项,比如用 JS 代码替换你的逻辑,它可能会更快一些并且不会显示闪烁。也可能有一个选项可以用您的值预填充下拉列表或仅在提交时验证它,当然会提示您对该输入字段的逻辑。
  • 我还可以使用 C# 更新步骤并使用 step="@stepValue"。但如前所述,这是不可能的,因为“升压”和“降压”大多不一样,我不知道用户是增加还是减少值。我不太了解JS,所以,这对我来说也不是一个选择。

标签: html blazor


【解决方案1】:

好的,我对此进行了更多研究,似乎输入字段内的向上和向下箭头导致了问题。我已经用 js 测试过,在应用计算出的数字之前,仍然有一些闪烁显示下一个或上一个数字。输入您的号码或使用键盘箭头键来增加或减少它们似乎完美无缺。

所以这可能不是 Blazor 本身造成的,因为 JS 也在挣扎

最好的办法是隐藏这些用于数字输入的箭头/微调器,只允许用户输入数字和/或使用键盘上的箭头键来更改它们。

这是一个如何在 JS 中工作的示例(应该适用于 Blazor,因为它们还添加了输入事件):

隐藏输入字段的箭头/微调器:

input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}
  
input[type=number] {
    -moz-appearance: textfield;
}

提示:根据您的需要进行编辑,因为它会在所有数字输入中删除它们。

添加您的数字输入元素

<input type="number" min="15" max="5000" id="specialNumberInput"/>

捕捉输入的事件来计算你的值

var currentValue = 500;

document.getElementById('specialNumberInput').onchange = function (event) {
  let minValue = parseInt(event.srcElement.getAttribute('min'));
  let maxValue = parseInt(event.srcElement.getAttribute('max'));
  let value = parseInt(event.srcElement.value);

  if(value > maxValue) {
    currentValue = maxValue;
    event.srcElement.value = currentValue;
    return;
  }

  if(value < minValue) {
    currentValue = minValue;
    event.srcElement.value = currentValue;
    return;
  }

  if (value > currentValue)
  {
    while (value % 15 != 0 && value % 27 != 0)
    {
      value++;
    }
  }
  else
  {
    while (value % 15 != 0 && value % 27 != 0)
    {
      value--;
    }
  }
  
  currentValue = value;
  event.srcElement.value = currentValue;
}

如上所述,您可以将 Blazor 代码附加到输入的“onchange”事件并运行逻辑来计算下一个或上一个值。由于 js 也会闪烁,因此删除选择箭头/微调器可能也可以与 Blazor 完美配合。

【讨论】:

  • 感谢您花在这方面的时间。通常,我对输入做的第一件事就是移除微调器。但在这种情况下,我想要它们,因为我不等待用户在例如之后知道这一点。 105 他可以输入的下一个可能的数字是 108 (=4*27)。使用移动设备时,键盘上的向上和向下箭头不可用。所以,这次我需要旋转器。我可能会做完全相反的事情,并在不允许键盘输入的输入上使用onkeydown="return false"
猜你喜欢
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多