javascript - 更改 HTML 表中 td 元素的颜色,然后使用 AJAX 写入数据库

标签 javascript php html css ajax

我有一个从 MYSQl 数据库检索到的结果表,其中每个 TR 都有唯一的 ID 和类。当单击一行中的 TD 时,脚本会根据订单状态切换各种颜色,然后使用 AJAX 将每个切换写入回数据库。我遇到的问题是颜色更改了最后一个表行 td 而不是当前单击的行 td​​。我是 JS 和 Jquery 的菜鸟,并且读到问题可能是“提升”,这让我困惑了几天。非常感谢任何帮助。

<td id="<?php echo $row[ 'order_id' ]; ?>" class="<?php echo $row[ 'order_id' ]; ?> white"
    onclick="changeBackground(this.id)"><?php echo $row[ 'order_id' ]; ?></td>

<script>
  function getSelected() {
    return document.getElementsByClassName(<?php echo $row[ 'order_id' ]; ?>);
  }

  function changeBackground(id) {
    var all = getSelected();
    var x = id
    alert(x);
    for (var i = 0; i < all.length; i++) {
      var color = all[i].classList;
      
      if (color.contains("white")) {
        all[i].classList.add("red");
        all[i].classList.remove("white");
        $.ajax({
          type: "POST",
          url: 'update_color.php',
          data: {color: 2},
          success: function (data) {
            console.log(data);
          },
        });
        
      } else if (color.contains("red")) {
        all[i].classList.add("green");
        all[i].classList.remove("red");
        $.ajax({
          type: "POST",
          url: 'update_color.php',
          data: {color: 3},
          success: function (data) {
            console.log(data);
          },
        });

      } else if (color.contains("green")) {
        all[i].classList.add("pink");
        all[i].classList.remove("green");
        $.ajax({
          type: "POST",
          url: 'update_color.php',
          data: {color: 4},
          success: function (data) {
            console.log(data);
          },
        });
        
      } else if (color.contains("pink")) {
        all[i].classList.add("yellow");
        all[i].classList.remove("pink");
        $.ajax({
          type: "POST",
          url: 'update_color.php',
          data: {color: 5},
          success: function (data) {
            console.log(data);
          },
        });
        
      } else if (color.contains("yellow")) {
        all[i].classList.add("white");
        all[i].classList.remove("yellow");
        $.ajax({
          type: "POST",
          url: 'update_color.php',
          data: {color: 1},
          success: function (data) {
            console.log(data);
          },
        });
      }

    }
  }
</script>

最佳答案

如果您能够稍微修改 HTML 输出,我相信上面的 Javascript 可以得到显着简化,但我应该强调以下内容未经测试。 order_id 在分配给元素的类中似乎很奇怪 - 可能是一个整数,无论​​如何作为一个类都是无效的 - 也许如果将其分配为 dataset 属性,它会使得更有意义,如果需要,仍然可以在您的 javascript 代码中引用。将类简单地设置为您循环使用的各种颜色之一会有所帮助!

因此,也许可以像这样更改 HTML:

<td data-id="<?php echo $row['order_id'];?>" class="white">
    <?php echo $row['order_id'];?>
</td>

然后是 JavaScript

const matrix={
    'white':'red',
    'red':'green',
    'green':'pink',
    'pink':'yellow',
    'yellow':'white'
};

document.querySelectorAll('table td').forEach( td=>td.addEventListener('click',function(e){
    let id=this.dataset.id;
    let colour=this.className;
    let keys=Object.values( matrix );
    
    this.classList.remove( colour );
    this.classList.add( matrix[ colour ] );
    
    
    
    let fd=new FormData();
        fd.set('color', keys.indexOf( colour) );
        fd.set('id',id);
        
    fetch( 'update_color.php',{ method:'post',body:fd} )
        .then(r=>r.text())
        .then(text=>{
            console.log(text)
        })
}))

关于javascript - 更改 HTML 表中 td 元素的颜色,然后使用 AJAX 写入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69735041/

相关文章:

javascript - Ace 编辑器按回车键不添加换行符

php - 在 Xampp/Windows 7 上安装 ImageMagick

javascript - React-router-dom : Is it possible to use Link without routing the user to another page?

html - 如何让SVG元素垂直拉伸(stretch)恰到好处?

javascript - 如何在Jquery Mobile中居中对齐两张图片

javascript - $.when().done() 没有按预期工作

PHP MySQL While 循环 多个表

javascript - JQuery 和 Cookie : How to remove them when user leaves the page or exit window/tab

javascript - react : How should I populate the HTML?

javascript - Node.js + Socket.io 如何从 PHP 接收数据