Javascript $ .inArray无效

时间:2012-10-17 21:58:00

标签: javascript jquery jquery-ui

我有一个现有的表,我想阻止相同的数据添加到现有的表。
我的问题: 为什么当我点击“创建新用户”按钮时,结果总是警告“未找到”?

这是代码: 的 HTML:

<div id="users-contain" class="ui-widget">
    <h1>Existing Users:</h1>
    <table id="users" class="ui-widget ui-widget-content">
        <thead>
            <tr class="ui-widget-header ">
                <th>Name</th>
                <th>Email</th>
                <th>Password</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>guruh</td>
                <td>guruhkharisma1@yahoo.com</td>
                <td>123456</td>
            </tr>
            <tr>
                <td>edo</td>
                <td>edo@yahoo.com</td>
                <td>123456</td>
            </tr>
        </tbody>
    </table>
</div>
<button id="create-user">Create new user</button>

的jQuery

    $(function() {
        var name = $( "#name" ),
            email = $( "#email" ),
            password = $( "#password" ),
            allFields = $( [] ).add( name ).add( email ).add( password ),
            tips = $( ".validateTips" );

        function checkExisting2(o) {
            var arr = [];
            $('#users-contain tr').each(function() {

                if (!this.rowIndex) return;
                var  Id = $(this).find("td").eq(0).html();    

                arr.push(Id);
           });

            if ( $.inArray(o,arr) > -1) {
                return false;
            } else {
                return true;
            }
        }

        $( "#dialog-form" ).dialog({
            autoOpen: false,
            height: 300,
            width: 350,
            modal: true,
            buttons: {
                "Create an account": function() { 
                    var bValid = true;

                    bValid = bValid && checkExisting2(name);

                    if ( bValid ) {
                        alert("not found");
                        $( "#users tbody" ).append( "<tr>" +
                            "<td>" + name.val() + "</td>" + 
                            "<td>" + email.val() + "</td>" + 
                            "<td>" + password.val() + "</td>" +
                        "</tr>" ); 
                        $( this ).dialog( "close" );
                    } else {
                        alert("found");
                    }
                },
                Cancel: function() {
                    $( this ).dialog( "close" );
                }
            },
            close: function() {
                allFields.val( "" ).removeClass( "ui-state-error" );
            }
        });

        $( "#create-user" )
            .button()
            .click(function() {
                $( "#dialog-form" ).dialog( "open" );
            });
    });

2 个答案:

答案 0 :(得分:1)

当你写这一行时:

bValid = bValid && checkExisting2(name);

代码中没有任何内容表明name指向任何有用的内容,因为

var name = $("#name")

指向一个空对象。

另外,当你这样写:

if (!this.rowIndex) return;

它会起作用,但它被认为是糟糕的形式;试试这个:

if (!this.rowIndex) { 
   return; 
}

这样,当其他人读取代码时,代码就不会混淆了。此外,所有这些都是多余的:

var bValid = true;
bValid = bValid && checkExisting2(name);
if ( bValid ) { .... }

相当于:

if (checkExisting2(name)) { ... }

答案 1 :(得分:1)

为什么要构建整个数组然后再次迭代以检查它是否包含id?

只需使用以下内容:

    function checkExisting2(o) {
        var rows = $('#users-contain tr'),
            row = null;
        for (var i=1; i<rows.length; i++) {
            if (rows[i].find('td')[0].html() == o)
                return true;
        }
        return false;
    }

无论如何,我不确定为什么你的版本不起作用..尝试调试一下,通过放置单词

debugger

在你自己的线路上,就在你致电$.inArray之前。然后运行脚本:当执行到达时,您将进入调试模式,您可以确定arro中的内容。

旁注

var bValid;
bValid = bValid && checkExisting2(name);

完全等同于:

var bValid = checkExisting2(name);

(当然,除非你在两行之间删除了一些代码)