0

私は、テーブル内の列のインデックスをチェックする必要がある次のJavaScript関数を持っています。問題は、columnName とテーブルの名前の比較です。columnName 'ID' でテストしましたが、この列はテーブル内にありますが、比較が正しくないため、インデックスは返されません。

私のコード:

function getColumnIndex(columnName, grid) {
    console.log("loading column index for column: [" + columnName + "]");
    $('div.hDivBox > table > thead > tr > th', grid).each(function(index) {
         var name = $(this).attr('title');
         console.log("Checking cell: [" + name + "]");
         if (String(name) == columnName) {
              return index;
         }
    });
    console.log("no cell found with name: " + columnName);
    return -1;
} 

ログ ステートメント:

列の列インデックスを読み込んでいます: [ID]
セルをチェックしています: [ID] セルをチェックしています
: [名前]
セルをチェックしています: [説明]セルを
チェックしています: [AddTime]
セルをチェックしています: [UpdTime]
名前のセルが見つかりません: ID

JavaScript 関数によって分析される HTML の例:

<div class="hDivBox">
<table cellspacing="0" cellpadding="0">
    <thead>
        <tr>
            <th align="center" hidden="" axis="col0" title="ID" style="display: none;">
                <div style="text-align: center; width: 30px;">ID</div>
            </th>
            <th align="center" axis="col1" title="Name" class="">
                <div style="text-align: center; width: 250px;">Name</div>
            </th>
            <th align="center" axis="col2" title="Description" class="">
                <div style="text-align: center; width: 250px;">Beschreibung</div>
            </th>
            <th align="center" axis="col3" title="AddTime">
                <div style="text-align: center; width: 120px;">hinzugefügt</div>
            </th>
            <th align="center" axis="col4" title="UpdTime">
                <div style="text-align: center; width: 120px;">aktualisiert</div>
            </th>
        </tr>
    </thead>
</table>

4

4 に答える 4

4

jQuery 関数returnに渡された匿名関数内のステートメントは、その関数からのみ返され、関数からも返されません。.each()getColumnIndex()

代わりに、次のことを行います。

function getColumnIndex(columnName, grid) {
    console.log("loading column index for column: [" + columnName + "]");
    var index = -1;
    $('div.hDivBox > table > thead > tr > th', grid).each(function(i) {
        var name = $(this).attr('title');
        console.log("Checking cell: [" + name + "]");
        if (String(name) == columnName) {
            index = i;
            return;
        }
    });
    if(index == -1)
        console.log("no cell found with name: " + columnName);
    return index;
}

基本的な原則は、匿名関数からインデックスを返すのではなく、スコープ外の変数に正しいインデックスを格納するだけなので、.each()呼び出しの実行が終了した後にアクセスできるようになるということです。

于 2012-08-01T16:00:30.523 に答える
2

jQuery 属性セレクターを使用してタイトルを一致させ、ループする代わりにindex()を使用するだけです。

function getIndexByTitle( title ) {
 return $('th[title="' + title + '"]').index();
}

alert(getIndexByTitle("ID"));
alert(getIndexByTitle("Name"));

于 2012-08-01T16:00:02.483 に答える
1

.each()関数で使用しています

.each(function(){
    ...
    return index;
});
return -1;

これはコールバックから返されます (そして、だった場合indexは各ループを停止する可能性がありますfalse) が、外部関数から抜け出して戻ることはありませんgetColumnIndex! だから、それは常に返され-1ます。

クイックフィックス:

function getColumnIndex(columnTitle, grid) {
    var index = -1;
    $('div.hDivBox > table > thead > tr:first > th', grid).each(function(i) {
        if ($(this).attr('title') == columnTitle) {
            index = i;
            return false; // break each-loop
        }
    });
    return index;
}
于 2012-08-01T16:03:27.557 に答える
1

each反復で呼び出される内部関数から戻っています。後でアクセスするには、各呼び出しの外でインデックスを保存する必要があります。

function getColumnIndex(columnName, grid) {
    var columnIndex;
    console.log("loading column index for column: [" + columnName + "]");
    $('div.hDivBox > table > thead > tr > th', grid).each(function(index) {
         var name = $(this).attr('title');
         console.log("Checking cell: [" + name + "]");
         if (String(name) == columnName) {
              columnIndex = index;
              // return false to exit the each iteration early
              return false;
         }
    });

    if (typeof columnIndex !== "undefined") {
        return columnIndex;
    };

    console.log("no cell found with name: " + columnName);
    return -1;
}
于 2012-08-01T16:04:11.030 に答える