【问题标题】:Keep displaying a <div> inside table row after page reload页面重新加载后继续在表格行内显示 <div>
【发布时间】:2020-08-13 22:02:57
【问题描述】:

我有一个与某些软件交互的用户界面。

我的用户界面显示一个带有数据路径的数据库。用户选择他们想要模拟/运行的数据路径,然后将数据路径发送到软件。完成后,输出是保存在同一台计算机上的文件夹中的 excel 报告。这是我对如何准确地向用户显示用户选择模拟/运行的指定数据路径的 excel 报告感到有点困惑。

我的想法是创建一个例程,将 excel 报告转换为 pdf,然后将报告的文件路径保存到数据库。然后,我创建一个 id="result" 的 div,以显示在所选指定路径的表格行内,并加载 pdf_report.php,然后显示所需的报告。

问题是每次我重新加载页面时 div 标签都会消失。我尝试使用 localstorage,但页面重新加载后仍然没有显示。

我的代码如下:

**让用户模拟/运行所选路径

Search.php

<?php
...    
  while($row = $result->fetch_assoc()){
            $field1name = $row["test_id"];
            $field2name = $row["path"];
            $field3name = $row["video1_path"];
            $field4name = $row["video2_path"];
            $field5name = $row["video3_path"];
            $field6name = $row["video4_path"];

          echo "<tr>
                  <td> ".$field1name." </td>
                  <td> ".$field2name." </td>
                  <td> ".$field3name." </td>
                  <td> ".$field4name." </td>
                  <td> ".$field5name." </td>
                  <td> ".$field6name." </td>

                  <td><div>
                        <button class='edit' id='" . $row['test_id'] . "'  >Run</button>
                      </div></td>

                  <td><div id='result'>
                    <p></p>
                  </div></td>


                </tr>";
        }
      }else {
        echo '<span style="color:#ff0000;text-align:center;">No Test ID Selected!</span>';
      }
    }


    // Close connection
    mysqli_close($conn);
  ?>
  </table>
</div><br>

<div style="overflow-x:auto;">
<table id=test_data>
  <tr>
    <th>Progress</th>
    <th>Progress Status</th>
  </tr>
  <tr>
    <td><div><progress id='progBar' value='0' max='100'></progress></div></td>
    <td><div><p id='progress-text'></p></div></td>
  </tr>
</table>
</div>


<script type="text/javascript">
var show = localStorage.getItem('showDiv');
    if(show === 'true'){
        $("#result").show();
    }

</script>

<!--Uses jquery to run 3 scripts and displays it in a progress bar-->
<script>
$(document).on('click', '.edit', function(event){

  //set cookie value to 'path'
  var fcookie='mycookie';

  //if button inside row is clicked the path gets saved to a cookie and received in ajax.php
  var test_id = $(this).attr('id');
  if(test_id) {
    var path = $(this).closest('tr').find("td:nth-child(2)").text();

  //Cookie gets saved
  document.cookie='fcookie='+path;


  var $this = $(this);

    //Start of 1st script
      $.ajax({
        url: "ajax.php",
        type:"POST",
        success: function(data) {
          //alert("File 1 Completed")

            $("#progress-text").text("Executing file 1");
            $('#progBar').val(25);

            //Start of 2nd script
            $.ajax({
              url: "ajax2.php",
              type:"POST",
                success: function(data2) {
                  //alert("File 2 Completed")
                  $("#progress-text").text("Executing file 2");
                  $('#progBar').val(50);

                  //Start of 3rd script
                  $.ajax({
                    url: "ajax3.php",
                    type:"POST",
                      success: function(data3) {
                        //alert("File 2 Completed")
                         $("#progress-text").text("Complete");
                         $('#progBar').val(100);

                         //Displays the <div id=result> for the selected data path
                         $this.closest("tr").find("td:nth-child(8)").load("pdf_report.php");


                         event.preventDefault();
                         $("#result").show();
                         localStorage.setItem('showDiv', true);


                      }
                  });
                }
            });
          }
    });
  }
});

 </script>

【问题讨论】:

  • 此报告是为特定用户生成的吗?如果是这样,您将需要一些机制来识别用户。通常,sessions 用于此目的。
  • 不,所有用户都会得到相同的报告。它是一个 localhost 项目,用户将通过本地网络的 IP 访问该网站
  • 好奇:这是如何通过 localhost 工作的?本地主机,顾名思义,就是自己的电脑。 (所以每个运行它的人都有不同的本地主机——他们自己的电脑)你在所有用户的计算机上都加载了 XAMPP 吗?还是您公司中的一台计算机被指定为“网络服务器”并且每个人都连接到它?或者,是否只有一台每个人都亲自访问以运行程序的计算机接收他们的报告? Waterloomatt 关于识别用户的常用方法是正确的。您必须非常清楚地解释每个人如何连接到您的应用,因为我不确定我是否理解。
  • 是的,将有一台计算机用于加载代码,指定为“网络服务器”,运行/使用用户界面的任何人都将仅连接到该计算机。跨度>

标签: php jquery local-storage


【解决方案1】:

在 javascript 中,在 document.ready 中(即在页面完全加载后立即运行),您可以使用以下内容:

$(function(){
   const tmp1 = localStorage.get('pdf01');
   const tmp2 = localStorage.get('pdf02');
   if (tmp1 !== undefined){
      $('#dataDiv').append(`<a href="${tmp1}">PDF01</a>`
   }
   if (tmp2 !== undefined){
      $('#dataDiv').append(`<a href="${tmp2}">PDF02</a>`
   }
});

当然,上面的代码期望你的身体某处已经有一个ID为dataDiv的div:

<body>
   <!-- Other HTML code is here... -->
   <div id="dataDiv"></div>
</body>

请注意,在 javascript 将 &lt;a&gt; 标签粘贴在其中之前,上述 div 将是不可见的(零大小 == 不可见)。这是网页设计中非常常见的策略 - 非常普遍。

如果你想变得花哨,你可以将 JSON 存储在 localStorage 变量中。 JSON 是一个转换为文本字符串的 javascript 对象(这就是它可以存储在 localStorage 变量中的原因),而众所周知,对象可以包含它们自己的键/值“子变量” ,它可以包含他们自己的“子变量”等......所以,基本上,使用对象/JSON,您可以只使用一个 localStorage 变量来存储项目的所有设置。或者,为了简单起见,您可以为要存储的每一位信息使用单独的 localStorage 变量——最终结果将是相同的。

这些参考资料可能会有所帮助:

Setting a var in localStorage from button radio and pass it to other pages

Why aren't my localStorage inputs persistent across pages on my personal computer?

How to retrieve the value from LocalStorage

When is localStorage cleared?

【讨论】:

  • 对不起,我可能不太清楚。如图所示,为了练习,我运行了测试 ID 2。并且 div id=result 显示为按钮链接“报告”,以打开保存在数据库中的 pdf_report.php 中完成的现有 pdf 文件。 Div id=result 是表中的“td:nth-child(8)”。因此,无论何时用户运行测试,都会显示“报告”按钮并提供测试运行的报告。但是每次我刷新页面时,“报告”按钮都会消失。也许使用 localstorage 不是最好的主意,因为我可能有数百个测试 ID,并且可能使用数据库来代替
  • 意思是,让两个数据库表相互交互。 Data_Path_Table 和 Pdf_path_Table。如果 Pdf_path_Table 在 test_id 2 中有数据,则通过在表中使用“报告”按钮来演示它。能做到吗?
  • 好的,所以你已经安装了 AMPP,它与 XAMPP 基本相同(MariaDB (XAMPP) 是现在专有 MySQL (AMPPS) 的最新 OSS 化身)。那么,您缺少的部分似乎是每次刷新页面时都需要检查数据库并添加适当的按钮。数据库中的值将告诉您报告按钮是否应该存在(每行) - 根本不需要 localStorage。至于任何报告按钮应该打开什么报告,那也应该存储在数据库表的同一行中。我不确定你为什么有两张桌子?
  • 我建议您重新审视这两张桌子的设计 - 每次都尽量轻松而不是优雅。重新考虑每个表行可以/应该存储哪些数据。如果(上表图像的)每一行代表一个测试,那么 PDF 文件的路径可以是每个表行的多列。如果每个测试可能生成无限数量的 PDF,那么您可以将所有路径存储在一个字段中,作为一个数组(JSON 化,因此可以存储为文本)。这是一种很常见的方法。
  • 一些澄清:MySQL === MariaDB。 MySQL 被 Oracle(现在是专有的)接管,因此创建了一个分支以继续免费/开源版本并称为 MariaDB。它们 99.5% 相同,但 MariaDB 有一些新功能。不过没什么关键的。 LocalStorage 和 MySQL 是做同一件事的两种不同方法:在页面刷新之间保留数据(又名“会话”)。 LocalStorage 简单得多,但 MySQL 可以做得更多。大量项目使用 both - localStorage 非常适合快速和肮脏、非关键、非秘密保存/检索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2014-07-25
  • 2021-03-21
  • 1970-01-01
相关资源
最近更新 更多