2

我尝试构建一个表单来检查输入的邮政编码是否与预定义数组中的邮政编码匹配。我不使用数据库,它都是非常基本且硬编码的,但在这种情况下应该足够了。

问题是只有数组中的第一个邮政编码(' 83512 ')有效。如果我输入第二个(' 83533 '),代码会吐出“不成功”。

我究竟做错了什么?

提前致谢。

HTML:

<form action="javascript:alert('success.');" id="checkplz">
    <label for="plz">ZIP:</label>
    <input type="text" name="plz" id="plz" />
    <button id="submit" >Check!</button>
    <div id="output"></div>
</form>

查询:

$(document).ready(function(){
    var list = ['83512','83533'];
    $("#checkplz").submit(function() {
        for (var i = 0; i < list.length; i++) {
            if ($("#plz").val() == list[i]) {
                $("#output").append("<strong class='success'>success!</strong>").show();
                return true;
            }
            $("#output").text("no success!").show().fadeOut(10000);
                return false;
        }
    });
});
4

4 回答 4

3

循环中的逻辑已关闭。见下文:

$(document).ready(function(){
    var list = ['83512','83533'];
    $("#checkplz").submit(function() {
        var match = false;
        for (var i = 0; i < list.length; i++) {
            if ($("#plz").val() == list[i]) {
                         $("#output").append("<strong class='success'>success!</strong>").show();
                return true;   
            }

        }

        $("#output").text("no success!").show().fadeOut(10000);
                return false;
    });
});
于 2013-02-27T17:18:31.480 回答
0

尝试在循环外返回 false ,因此只有在检查了所有值后才会发生:

$(document).ready(function(){
    var list = ['83512','83533'];
    $("#checkplz").submit(function() {
        for (var i = 0; i < list.length; i++) {
            if ($("#plz").val() == list[i]) {
                $("#output").append("<strong class='success'>success!</strong>").show();
                return true;
            }
        }
        $("#output").text("no success!").show().fadeOut(10000);
        return false;
    });
});
于 2013-02-27T17:20:25.050 回答
0

使用 jQuery.inArray()

var list = ['83512','83533'];
if($.inArray('83533', list) > -1){
    // found
}

这里的文档:http: //api.jquery.com/jQuery.inArray/

于 2013-02-27T17:21:17.633 回答
0

问题出在你的循环逻辑之内。循环只会运行一次,因为循环总是在第一次迭代后返回(如果它找到列表数组中的第一个元素,则返回 true,其他所有元素返回 false),而不是继续所有迭代。所以,第二个元素发生的事情是循环正在运行,确定第一个元素没有找到并返回 false,甚至从不处理第二个元素。

更好的方法是循环列表数组,直到找到匹配的元素,并跟踪是否找到匹配项。这将确保我们在处理完数组的所有元素之前不会退出循环(或找到匹配项,在这种情况下,我们可以停止循环以节省处理时间)。

请参阅下面(http://jsfiddle.net/ryanbrill/Kws7A/)的一些示例代码,其中包含一些关于正在发生的事情的评论。

$(document).ready(function(){
    var list = ['83512','83533'];
    $("#checkplz").submit(function() {
        var matched = false; // Set up variable to track if we find a match
        $(list).each(function() {
            // Inside the jQuery 'each' method, 'this' equals the current item in the iteration.
            if(this == $("#plz").val()) {
                matched = true; // set the 'matched' variable to true
                $("#output").append("<strong class='success'>success!</strong>").show();
                return; // Since we found a match, we can stop processing the array
            }
        });
        // Outside of the loop, only display no success if we didn't find any matches.
        if (!matched) {
            $("#output").text("no success!").show().fadeOut(10000);
        }

    });
});
于 2013-02-27T17:40:49.843 回答