【问题标题】:Check for duplicate values in HTML input textboxes and paint the borders red not working检查 HTML 输入文本框中的重复值并将边框涂成红色不起作用
【发布时间】:2017-06-12 16:39:30
【问题描述】:

我正在尝试实现一个 Javascript 函数,该函数应该检测带有重复值的 HTML 输入文本框(它们都属于同一个类),并用红色突出显示它的边框,但它不能正常工作:它只绘制了一些具有重复值的输入框,而不是所有输入框,视情况而定。例如,如果第一个、第三个和第四个文本框插入了重复值,则仅绘制第三个和第四个文本框。但是,如果第二个框与其他 3 个具有相同的值,则所有框都被绘制。我想知道如何解决这个问题。提前致谢!

这是 JS 代码顺便说一句:

function CheckDuplicates(){

                var numbers = [];

                $('input[class="allinput planrequestnumber"]').each( function(i,e) {
                    numbers.push($(e).attr('id'));
                });

                var duplicatesExist = false;

                for (var i = 0; i < numbers.length; i++) {

                    var first = '#' + numbers[i];
                    var second = '#' + numbers[i+1];

                    if(($(first).val().length == 9) && ($(second).val().length == 9)){
                        if($(first).val() == $(second).val()){
                            $(first).css('box-shadow', 'inset 0 0 0 3px red');
                            $(second).css('box-shadow', 'inset 0 0 0 3px red');
                            duplicatesExist =  true;
                        }
                        else{
                            $(first).css('box-shadow', '');
                            $(second).css('box-shadow', '');
                            duplicatesExist =  false;
                        }
                    }
                }
                return duplicatesExist;
            }

以及 HTML 代码(用于输入框):

    <INPUT id="num_principal" runat="server" style="WIDTH: 135px" class="allinput planrequestnumber" onchange=CheckDuplicates() maxLength=9 placeholder="" data-index="0" NAME="num_principal">

<INPUT id="num_extra_1" runat=server style="WIDTH: 135px" class="allinput planrequestnumber" onchange=CheckDuplicates() maxLength=9 placeholder="" data-index="1" NAME="num_extra_1">

<INPUT id="num_extra_2" runat=server style="WIDTH: 135px" class="allinput planrequestnumber" onchange=CheckDuplicates() maxLength=9 placeholder="" data-index="2" NAME="num_extra_2">

<INPUT id="num_extra_3" runat=server style="WIDTH: 135px" class="allinput planrequestnumber" onkeypress="return isNumberKey(event)" onkeyup=ValPhone(this); onchange=CheckDuplicates() maxLength=9 placeholder="" data-index="3" NAME="num_extra_3">

更新:我对我的 JS 代码做了一些小的调整,但它仍然不能完全正常工作。当文本框内部有重复值时,仍然存在不绘制文本框的情况。

function CheckDuplicates(){

                    var numbers = [];

                    $('input[class="allinput planrequestnumber"]').each( function(i,e) {
                        numbers.push($(e).attr('id'));
                    });

                    var sortedNum = numbers.slice().sort();

                    var duplicatesExist = false;

                    for (var i = 0; i < numbers.length -1; i++) {

                        var first = '#' + sortedNum[i];
                        var second = '#' + sortedNum[i+1];

                        if(($(first).val().length == 9) && ($(second).val().length == 9)){
                            if($(first).val() == $(second).val()){
                                $(first).css('box-shadow', 'inset 0 0 0 3px red');
                                $(second).css('box-shadow', 'inset 0 0 0 3px red');
                                duplicatesExist =  true;
                            }
                            else{
                                $(first).css('box-shadow', '');
                                $(second).css('box-shadow', '');
                            }
                        }
                    }
                    return duplicatesExist;
                }

【问题讨论】:

  • 您将每个项目与紧随其后的项目进行比较,但这只有在您首先对数组进行排序时才会产生正确的结果。此外,您不应该在 else-case 中使用 duplicatesExist = false;,因为您基本上只返回 last 项目是否重复。我建议阅读类似的问题,如 this one 以推动正确的方向。
  • 我更新了我原来的帖子。我仍然遇到这个问题。
  • 嗯,这是真的 - 在您的特定情况下的排序点可能不是您所需要的。我会发布一个答案。

标签: javascript jquery html


【解决方案1】:

我已经清理了你的一些并留下了 cmets,以便你可以继续。

function CheckDuplicates() {
    var values = [];  //Create array where we'll store values

    $(".duplicate").removeClass("duplicate"); //Clear all duplicates
    var $inputs = $('input[class="allinput planrequestnumber"]'); //Store all inputs 
    
    $inputs.each(function() {   //Loop through the inputs
    
        var v = this.value;
        if (!v) return true; //If no value, skip this input
        
        //If this value is a duplicate, get all inputs from our list that
        //have this value, and mark them ALL as duplicates
        if (values.includes(v)) $inputs.filter(function() { return this.value == v }).addClass("duplicate");
        
        values.push(v); //Add the value to our array
    });
    
    return $(".duplicate").length > 0;

};
.duplicate {
    box-shadow: inset 0 0 0 3px red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<INPUT id="num_principal" runat="server" style="WIDTH: 135px" class="allinput planrequestnumber" onchange=CheckDuplicates() maxLength=9 placeholder="" data-index="0" NAME="num_principal">

<INPUT id="num_extra_1" runat=server style="WIDTH: 135px" class="allinput planrequestnumber" onchange=CheckDuplicates() maxLength=9 placeholder="" data-index="1" NAME="num_extra_1">

<INPUT id="num_extra_2" runat=server style="WIDTH: 135px" class="allinput planrequestnumber" onchange=CheckDuplicates() maxLength=9 placeholder="" data-index="2" NAME="num_extra_2">

<INPUT id="num_extra_3" runat=server style="WIDTH: 135px" class="allinput planrequestnumber" onchange=CheckDuplicates() maxLength=9 placeholder="" data-index="3" NAME="num_extra_3">

【讨论】:

  • 谢谢!这正是我想要的! =)
  • 哦,还有一件事:它应该在最后返回一个布尔值,具体取决于是否有重复。对于需要进一步验证的额外验证过程。
  • 刚刚也添加了退货。它检查是否有任何具有类“.duplicate”的字段,如果是,则返回true;
猜你喜欢
  • 2019-03-17
  • 1970-01-01
  • 2017-01-30
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 2014-08-05
  • 2020-09-30
相关资源
最近更新 更多