不要让用户输入错误的数据 - 改进 IP 地址验证 JavaScript

Don't let user to input wrong data - Improving IP address validation JavaScript

我正在尝试制作一个屏蔽输入字段来输入 IP 地址。我发现的几乎每个解决方案都有缺陷。

这里 是我找到的最好的解决方案,但它仍然让我输入高于 255 的值。基本上它有效,但是当我尝试更改输入的地址时,我什至可以设置192.999.1.1

如何重现错误:

  1. 输入 IP 地址,例如192.168.1.1

  2. Select某部分,比如192.__168__.1.1

  3. 开始输入数字,得到192。999.1.1

如何改进代码来解决这个问题?

这是我使用的代码

// Credits to @t_m27    
var options = {
  onKeyPress: function(text, event, currentField, options) {
    if (text) {
      var ipArray = text.split(".");
      var lastValue = ipArray[ipArray.length - 1];
      if (lastValue != "" && parseInt(lastValue) > 255) {
        ipArray[ipArray.length - 1] = '255';
        var resultingValue = ipArray.join(".");
        currentField.text(resultingValue).val(resultingValue);
      }
    }
  },
  translation: {
    'Z': {
      pattern: /[0-9]/,
      optional: true
    }
  }
};

$(".ipaddr").mask("0ZZ.0ZZ.0ZZ.0ZZ", options);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.16/jquery.mask.min.js"></script>
<input type="text" class="ipaddr" />

是这样的吗?

// Credits to @t_m27    
var options = {
  onKeyPress: function(text, event, currentField, options) {
    if (text) {
      var ipArray = text.split(".");
      ipArray = ipArray.map(num => num > 255 ? 255 : num)
      var resultingValue = ipArray.join(".");
      currentField.text(resultingValue).val(resultingValue);
    }
  },
  translation: {
    'Z': {
      pattern: /[0-9]/,
      optional: true
    }
  }
};

$(".ipaddr").mask("0ZZ.0ZZ.0ZZ.0ZZ", options);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.16/jquery.mask.min.js"></script>
<input type="text" class="ipaddr" />

如果你想使用一个函数 returns 如果它是一个有效的 ip,则为 true,否则为 false,你可以像这样使用它:

function isValidIp(ip) {
  return !ip.split('.').find(part => part > 255);
}

您可以使用它来显示消息或将输入标记为无效。