1

既存のテーブルがあり、同じデータが既存のテーブルに追加されないようにしたい。
私の質問:「新しいユーザーの作成」ボタンをクリックすると、結果が常に「見つかりません」というアラートになるのはなぜですか?

コードは次のとおりです 。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" );
            });
    });
4

2 に答える 2

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)) { ... }
于 2012-10-17T22:07:15.967 に答える
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。次に、スクリプトを実行します。実行が完了すると、デバッグモードに入り、何が含まれているかを確認できarrますo

サイドノート

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

完全に同等です:

var bValid = checkExisting2(name);

(もちろん、2行の間にあるコードを切り取った場合を除きます)

于 2012-10-17T22:07:17.823 に答える