0

我有一个在PHP. 该表是查询的结果,它会生成几行。在这些行内有很多不同的元素,例如下拉菜单 (< select >s) 复选框和文本字段。我做了一个循环来遍历其中的元素jQuery并获取值,但它没有返回我想的那样。这是一个相当复杂的情况,所以我将发布代码和小提琴来完美地说明正在发生的事情以及我期望发生的事情。

PHP

if(isset($_POST['aid'])) {  
    $aid = $_POST['aid'];
    $projects = getProjects($db);
    $members = getUserName($db);            
    try {
        $project_info = $db->prepare("
            SELECT  projects.id,
                    projects.project_name,                  
                    projects.pm,    
                    projects.apm,
                    projects.est_start,
                    projects.est_end,
                    projects.contact,                   
                    projects.trips,
                    projects.tasks,
                    projects.perc_complete,
                    projects.bcwp,
                    projects.actuals,
                    projects.cpi,
                    projects.bcws,
                    projects.bac,
                    projects.comments,
                    projects.status,
                    projects.project_revenue,
                    projects.profit_margin,
                    projects.pm_perc,
                    projects.audited         
            FROM projects
            WHERE account_id = ?                        
        "); 

        $project_info->bindValue(1, $aid, PDO::PARAM_STR);
        $project_info->execute();       

            echo "<table class='projects_contentTable'>";
            echo "<thead class='projects_editable_thead'>";             
            echo "<th class='content_th'>" . "Job #" . "</th>";
            echo "<th class='content_th'>" . "Project Name" . "</th>";
            echo "<th class='content_th'>" . "PM" . "</th>";
            echo "<th class='content_th'>" . "APM" . "</th>"; 
            echo "<th class='content_th'>" . "Est. Start" . "</th>";
            echo "<th class='content_th'>" . "Est. End" . "</th>";
            echo "<th class='content_th'>" . "Contact" . "</th>";
            echo "<th class='content_th'>" . "Trips" . "</th>";
            echo "<th class='content_th'>" . "Tasks" . "</th>";
            echo "<th class='content_th'>" . "% Complete" . "</th>";
            echo "<th class='content_th'>" . "BCWP" . "</th>";
            echo "<th class='content_th'>" . "Actuals" . "</th>";
            echo "<th class='content_th'>" . "CPI" . "</th>";           
            echo "<th class='content_th'>" . "Comments" . "</th>";  
            echo "<th class='content_th'>" . "Status" . "</th>";    
            echo "<th class='content_th'>" . "Project Revenue" . "</th>";   
            echo "<th class='content_th'>" . "Profit Margin" . "</th>"; 
            echo "<th class='content_th'>" . "PM%" . "</th>";   
            echo "<th class='content_th'>" . "Audited" . "</th>";
            echo "</thead>";

            echo "<tbody class='projects_editable_tbody'>";                  
            while ($row = $project_info->fetch(PDO::FETCH_ASSOC)) {             
                echo "<tr>";                            
                echo "<td class='projects_editable_content_td'>" . "<a href='#'>" . $row['id'] . "</a>" . "</td>";
                echo "<td class='projects_editable_content_td' contenteditable='true'>" . $row['project_name'] . "</td>";
                echo "<td class='projects_editable_content_td'>" . 
                        "<select id='table_edit_project_pm'>" . 
                            "<option value=''>" . $row['pm'] . "</option>" . 
                            "<option>" . "-----" . "</option>";
                        foreach($members as $key => $value) {
                            echo "<option value='".$key."'>" . $value . "</option>";            
                        } 
                echo "</select>";
                echo "</td>";               
                echo "<td class='projects_editable_content_td'>" . 
                        "<select id='table_edit_project_apm'>" . 
                            "<option value=''>" . $row['apm'] . "</option>" . 
                            "<option>" . "-----" . "</option>";
                        foreach($members as $key => $value) {
                            echo "<option value='".$key."'>" . $value . "</option>";            
                        } 
                echo "</select>";
                echo "</td>";               
                echo "<td class='projects_editable_content_td'>" . 
                    "<input type='text' id='table_edit_project_start' value='". $row['est_start'] ."'/>"; 
                echo "</td>";               
                echo "<td class='projects_editable_content_td'>" . 
                    "<input type='text' id='table_edit_project_end' value='". $row['est_end'] ."'/>";
                echo "</td>";               
                echo "<td class='projects_editable_content_td' contenteditable='true'>" . $row['contact'] . "</td>";
                echo "<td class='content_td'>" . $row['trips'] . "</td>";
                echo "<td class='content_td'>" . $row['tasks'] . "</td>";
                echo "<td class='content_td'>" . $row['perc_complete'] . "</td>";
                echo "<td class='content_td'>" . $row['bcwp'] . "</td>";
                echo "<td class='content_td'>" . $row['actuals'] . "</td>";
                echo "<td class='content_td'>" . $row['cpi'] . "</td>";             
                echo "<td class='projects_editable_content_td' contenteditable='true'>" . $row['comments'] . "</td>";
                echo "<td class='projects_editable_content_td'>" .
                        "<select>" .
                            "<option value=''>" . $row['status'] . "</option>" .
                            "<option>" . "-------" . "</option>" .
                            "<option>" . "On Hold" . "</option>" .
                            "<option>" . "In Progress" . "</option>" .
                            "<option>" . "Open" . "</option>" .
                            "<option>" . "Complete" . "</option>" .
                         "</select>"; 
                echo "</td>";
                echo "<td class='content_td'>" . $row['project_revenue'] . "</td>";
                echo "<td class='content_td'>" . $row['profit_margin'] . "</td>";
                echo "<td class='content_td'>" . $row['pm_perc'] . "</td>";
                echo "<td class='projects_editable_content_td'>";                                   
                    if ($row['audited'] == 'true') {
                        echo "<input type='checkbox' checked='checked'/>";
                    } else {
                        echo "<input type='checkbox'/>";
                    }
                echo "</td>";               
                echo "</tr>";               
            }
            echo "</tbody>";    
            echo "</table>";                
    } catch(PDOException $e) {
        die($e->getMessage());
    }   
} else {    
    echo 'could not load projects table';
}

jQuery

$('.projects_editable_tbody tr').each(function() {
        $('.projects_editable_content_td:not(:has(select)),option:selected').each(function() {
            saveEdits.push($(this).text());
        });
    }); 

    $.each(saveEdits, function(index, value) { 
        alert(index + ': ' + value); 
    });

好的结束墙,所以这是玩http://jsfiddle.net/U3nna/14/的小提琴

在小提琴中,我实际上列出了我期望的值,您所要做的就是单击保存按钮以查看实际发生的情况。

对于那些不想使用小提琴的人,或者也许不能,这里是你非常简短的总结。

我需要遍历表格并遍历每个表格行。在每个表格行中,我需要来自 <td> 的文本值,其类为“.projects_editable_content_td”。这些值中的每一个都将被放入一个数组中。然而,一些值没有被存储,而且似乎这个循环在表上做了额外的迭代。所以有时我期待 9 或 18 个值,我最终得到 27 或 36 个,而且我运行得越多,它变得越糟。

我正在绞尽脑汁,但我似乎无法弄清楚为什么它不会拾取其中一些元素的文本值。如果有人有时间帮助我,我将非常感激。

4

2 回答 2

2

问题是您得到的只是$(this).text()缺少输入(文本/复选框)值的另一件事我注意到您为多个元素分配了相同的 id,id 对于 html 元素table_edit_project_starttable_edit_project_end应该是唯一的

尝试这个

var saveEdits = [];
$('#save').click(function() {
    $('.projects_editable_tbody tr').each(function() { 
        $('.projects_editable_content_td:not(:has(select))>input')
            .each(function() {
              saveEdits.push($(this).val());
            });

        $('.projects_editable_tbody tr > .projects_editable_content_td:not(:has(select))')
            .each(function() {
              saveEdits.push($(this).text());
            });

    }); 
    $.each(saveEdits, function(index, value) { 
        alert(index + ': ' + value); 
    }); 
});

对于重复值,您可以像:eq(index),:gt(index)这样在循环中使用选择器,它将获取当前 tr 的字段

var saveEdits = [];
$('#save').click(function() {
    $('.projects_editable_tbody tr').each(function(i) { 
        $('.projects_editable_tbody tr:eq('+i+') > .projects_editable_content_td:not(:has(select))>input')
            .each(function() {
              saveEdits.push($(this).val());
            });

      $('.projects_editable_tbody tr:eq('+i+') >.projects_editable_content_td:not(:has(select))')
            .each(function() {
              saveEdits.push($(this).text());
            });

   }); 
    $.each(saveEdits, function(index, value) { 
        alert(index + ': ' + value); 
    }); 
});

小提琴

于 2013-08-04T17:45:03.863 回答
1

更改它,以便为每个选项提供正确的选项值(即,如果您希望 Jane Doe 输出 Jane Doe,那么只需将其用于 中的值和内容option)。

然后,您需要为其他inputs 添加第三种可能性,所以我可能只是将您的处理方式重新安排为:

$('td', this).each(function() {
    var $input = $("select, input", this);
    if($input.length) {
        saveEdits.push($input.val());
    }
    else saveEdits.push($(this).text());
});

请注意,我也更改了选择器。看起来您在不需要它们的地方使用了很多类。如果你真的需要如此多地使用类,也许可以尝试让它们也更易于阅读(.projects-editable-content例如,使用虚线而不是下划线,并且不要使它们长于所需的长度)。

于 2013-08-04T17:42:30.977 回答