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

return传递给 jQuery 函数的匿名函数内部的语句仅从.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 回答