【问题标题】:Accessing clicked cell instead of all cells using JQuery and Ajax使用 JQuery 和 Ajax 访问单击的单元格而不是所有单元格
【发布时间】:2013-09-19 07:09:50
【问题描述】:

我正在尝试在单击特定单元格后对其进行编辑。当我当前单击一个单元格时,它会将所有 td 变成文本框。我希望只有单击的单元格这样做。如何仅访问单击的单元格?这是我当前的代码:(暂时忽略 .change 函数;我还没有修复它。

 $(document).ready(function()
    {
        $(".edit_td").click(function()
        {
            $(this).children(".text").hide();
            $(this).children(".editbox").show();
        }).change(function()
            {
                var id=$(this).parent();
                var field=$("#input_"+ id).val();
                var text=$("#span_" + id).val();
                var dataString = 'id='+ id +'&field='+ field +'&text='+ text;
                //$("#first_"+ID).html('<img src="load.gif" />'); // Loading image

                if(input != text)
                {
                    $.ajax({
                    type: "POST",
                    url: "table_edit_ajax.php",
                    data: dataString,
                    cache: false,
                    success: function(html)
                    {
                        $("#first_"+ID).html(first);
                        $("#last_"+ID).html(last);
                    }
                    });
                }
                else
                {
                    alert('Enter something.');
                }
            });

        // Edit input box click action
        $(".editbox").mouseup(function() 
        {
            return false
        });

        // Outside click action
        $(document).mouseup(function()
        {
            $(".editbox").hide();
            $(".text").show();
        });

    });

这是我的 PHP 代码:

   public function displayTable($table)
{
    //connect to DB
    $con = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);

    echo "<table id='table' border='1'>";   //start an HTML table

    $dbtable = $table;
    $fields =array();
    $result = mysqli_query($con, "SHOW COLUMNS FROM ".$dbtable);

    //fill fields array with fields from table in database
    while ($x = mysqli_fetch_assoc($result))
    {
        $fields[] = $x['Field'];
    }

    $fieldsnum = count($fields);    //number of fields in array

    //create table header from dbtable fields
    foreach ($fields as $f)
    {
        echo "<th>".$f."</th>";
    }

    //create table rows from dbtable rows
    $result = mysqli_query($con, "SELECT * FROM ".$dbtable);

    while ($row = mysqli_fetch_array($result))
    {
        $rowid = $row[$fields[0]];
        echo "<tr class='edit_tr' id='".$rowid."'>";
        foreach ($fields as $f) 
        { 
            echo "<td class='edit_td'><span id='span_".$rowid."' class='text'>".$row[$f]."</span>
            <input type='text' value='".$row[$f]."' class='editbox' id='input_".$rowid."'/> </td>"; 
        }
        $rowid++;
        echo "</tr>";
    }

    echo "</table>";    //close the HTML table

    //close connection
    mysqli_close($con);
}

【问题讨论】:

标签: javascript php jquery css ajax


【解决方案1】:

您目前正在告诉所有texteditbox 在您单击某些内容时分别隐藏和显示。您要做的只是使与您单击的元素相关的元素隐藏和显示。

要做到这一点,你需要做一些类似的事情

$(".edit_tr").click(function() {
    $(this).children(".text").hide();
    $(this).children(".editbox").show();
}) // your normal stuff can go here.

这将只获取和修改 edit_tr 类的子类并显示/隐藏您想要的项目。

【讨论】:

  • 谢谢!我添加了它,只是将 tr 更改为 td 并且它有效!
  • 现在我意识到,对于我的 AJAX 更新,我将不得不获取该行的 ID(主键)。我假设我以某种方式利用.siblings() 或其他树遍历之一到达tr 中的第一个td 已更改的td,对吧?
  • 如果你想要tr的id,你可以直接$(this).parent(),从那里你可以得到tr上的任何数据。
  • 这不是tr 的ID。我正在寻找被点击的tdtr 中的第一条数据(td)。虽然我想我可以将tr id 设置为数据库中相应行的主键。
  • 我更改了原始问题中的代码以反映我现在拥有的内容。我对 PHP 中的 while 循环进行了更改,并对 JQuery 中的 .changed 函数进行了一些更改。如何获得 var fieldvar text 以反映我的更改?我目前将var id 设置为数据库中相应行的ID。例如,我希望var field 保存我正在更改的字段名称,var text 保存新值以放置在该字段中,一旦它被POSTed 到 PHP 代码以将更新查询发送到数据库。谢谢。
【解决方案2】:

您可以使用this 对象。

$(this).find(".text").hide();
$(this).find(".editbox").show();

它将访问当前行而不是代码的所有td

【讨论】:

  • 我认为您发布的答案错误,您选择了其他答案作为正确答案:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2013-07-31
  • 2011-09-11
  • 1970-01-01
相关资源
最近更新 更多