0

在 ESNList 文本域 中 , 需要 输入 多个 值 以 逗号 分隔 , 但 它们 必须 在 同一 范围 内 .. 例如 , 在 循环 中 的 下面 条件 中 , 如果 你 在 ESNList 中 输入 一个 介于 986329 和 999999 之间 的 数字 . ,逗号后 ESNList 字段中的第二个输入应与第一个输入在同一范围内,依此类推,否则我会发出警报,说两个 ESN 应在同一范围内.. 我做了一个循环来执行检查,但是它不工作..有人可以向我证明错误在哪里..小提琴会帮助吨,

<html>
    <head>
    <script type="text/javascript" src="jquery/jquery-1.8.3.js"></script>
    <script type="text/javascript">

    $(function () {


    $(":text").css("border", "2px solid red");
      $(":text").keyup(function(){
        var enteredData = $(this).val()
        console.log(enteredData);
        if (enteredData == "") {
          $(this).css("border", "2px solid red");
        } else {
          $(this).css("border", "inherit");
        }
        if ($(this).attr("id") == "ESNList"){
       esnList = enteredData.split(',');
           }

           for(var i = 0; i < esnList.length; i++) {
            if  ( parseInt(esnList[i]) >= 986329 && parseInt(esnList[i]) <= 999999) {
                $("#ddl_StxName").val("stx2");
                $("#ddl_rtumodel").val("globalstar");
                }
            else if ( parseInt(esnList[i]) >= 660000 && parseInt(esnList[i]) <= 699999) {
                $("#ddl_StxName").val("mmt");
                $("#ddl_rtumodel").val("globalstar");
                 }
            else if ( parseInt(esnList[i]) >= 200000 && parseInt(esnList[i]) <= 299999) {
                $("#ddl_StxName").val("stm3");
                $("#ddl_rtumodel").val("stmcomtech");
                 }
            else if ( parseInt(esnList[i]) >= 1202114 && parseInt(esnList[i]) <= 1299999) {
                $("#ddl_StxName").val("smartone");
                $("#ddl_rtumodel").val("globalstar");
          }

          else { alert("ESNs should be within the same range"); }

        }


      });
      });
    </script> </head>
    <body>
    <form id="provision">
        ESNList:    <input  type="text" id="ESNList" name="ESNList" size="30" /> <br />
        ESN Start:<input type="text" id="ESNStart" name="ESNStart" size="10" /> <br />
        ESN End: <input type="text" id="ESNStart" name="ESNStart" size="10" /> <br />
        UnitName:<input type="text" id="STxName" name="STxName" size="30"  />  <br />  
         Unit Model:   <select name="STxName" id="ddl_StxName">
        <option value="stx2">STX2</option>
        <option value="stm3" selected>STM3</option>
        <option value="acutec">Acutec</option>
         <option value="trackpack">Trackpack</option>
        <option value="mmt">MMT</option>
        <option value="smartone">Smartone</option>
        <option value="smartoneb" >SmartOneB</option>
        </select> <br />
        RTU Model Type:
         <select name="rtumodel" id ="ddl_rtumodel">
        <option value="globalstar">GlobalStar</option>
        <option value="both">Both</option>
        <option value="comtech">Comtech</option>
        <option value="stmcomtech">STMComtech</option>
        </select> <br />
        <input type="submit" value ="submit"  />
        </form>
    </body>
    </html> 
4

1 回答 1

0

哦,我的,从哪里开始?

一方面,keyup 将在每个连续的 keyup 事件之后触发,这意味着您将一遍又一遍地进行大量比较,并在用户完成输入之前得到很多“否定”第一个值。

为了节省一些痛苦,我从你的代码开始,在这个小提琴中:http: //jsfiddle.net/mori57/68s68/

(请注意,我在底部放置了一个 textarea 作为输出,因此您可以准确地看到范围检查是如何发生的。我还注释掉了警报,因为它与 keyup 相结合,创建了一个非常讨厌的循环.)

问题是每个比较只存在于当前值的上下文中......它无法判断“开始范围”应该是什么,因为你没有存储任何这样的东西来比较,所以,当谈到循环中的下一个值,它只是测试它当前正在查看的项目是否在指定的范围内,而不是它与最后一个查找项目的范围相同。

您可以通过将第一个比较存储在外部变量中来做到这一点,然后将第一个比较之后的每个值与保存在该外部变量中的范围进行比较。请参阅下面的代码以获取帮助您入门的示例。另外,在上下文中查看它,这里:http: //jsfiddle.net/mori57/68s68/2/

$(function () {
    var out = $("#output");
    var debug = function(txtIn){
        out.val(out.val() + "\n" + txtIn);
    };
    // store your ranges here, in an array
    var ranges = [
        [986329,999999],
        [660000,699999],
        [200000,299999],
        [1202114,1299999]
    ];

    // store the activeRange that is set by the first item in the comparison loop
    var activeRange = -1;

    // use this to test the a value against a given range array
    var withinRange = function(comparitor, range) {
        return (comparitor >= range[0] && comparitor <= range[1]);
    };

    $(":text").css("border", "2px solid red");
    // start the test onBlur, rather than on keyup
    $(":text").blur(function () {
        var enteredData = $(this).val()
        console.log(enteredData);
        if (enteredData == "") {
            $(this).css("border", "2px solid red");
        } else {
            $(this).css("border", "inherit");
        }
        if ($(this).attr("id") == "ESNList") {
            esnList = enteredData.split(',');
        }

        // loop through your values...
        for (var i = 0; i < esnList.length; i++) {
            // store the current value, rather than re-parseInt'ing it for every comparison
            var intVal = parseInt(esnList[i]);

            debug("intVal = " + intVal);

            // now, find out if an activeRange has been set
            if(activeRange == -1) {
                // if not, we need to find out what the activeRange is
                if (withinRange(intVal, ranges[0])) {
                    activeRange = ranges[0];
                } else if (withinRange(intVal, ranges[1])) {
                    activeRange = ranges[1];
                } else if (withinRange(intVal,ranges[2])) {
                    activeRange = ranges[2];
                } else if (withinRange(intVal,ranges[3])) {
                    activeRange = ranges[3];
                }
            } else {
                // if an activeRange has been set already, 
                // we need to find out if the current item is outside the activeRange
                if (!withinRange(intVal, activeRange)) {
                    debug("Value out of active range.");
                }
            }

            // Now that you know what your activeRange should be, you can
            // decide what to set your drop down lists to reflect
            switch (activeRange) {
                case ranges[0]:
                    $("#ddl_StxName").val("stx2");
                    $("#ddl_rtumodel").val("globalstar");
                    break;
                case ranges[1]:
                    $("#ddl_StxName").val("mmt");
                    $("#ddl_rtumodel").val("globalstar");
                    break;
                case ranges[2]:
                    $("#ddl_StxName").val("stm3");
                    $("#ddl_rtumodel").val("stmcomtech");                        
                    break;
                case ranges[3]:
                    $("#ddl_StxName").val("smartone");
                    $("#ddl_rtumodel").val("globalstar");
                    break;
                default:
                    debug("Value out of range.");
                    break;
            }
        }
    });
});
于 2013-01-30T19:46:39.920 回答