0

解释我要解决的问题:

我有一个显示文件列表的网页 (file_list.php ) ,每个文件旁边都有一个删除它的按钮。当用户在某个文件名附近按下 DELETE 按钮时,浏览器会转到一个名为delete_file.php删除文件的脚本,然后它会告诉浏览器返回到file_list.php

delete_file.php使用简单header("Location: file_list.php”);的返回file_list.php

当浏览器返回时,file_list.php它会重新加载页面,但不会再次将其滚动回用户之前的位置。因此,假设用户滚动了文件列表并删除了最后一个文件,当浏览器再次显示该页面时file_list.php,它不会再次滚动到页面底部。



我提出的解决方法:

我发现了一种奇怪的方法来解决这个问题,基本上不是使用header("Location: file_list.php”);indelete_file.php我只是使用 javascript call window.history.go(-1)

用户处于会话中时(仅使用 PHPsession_start函数),此解决方法非常有效:浏览器重新加载 file_list.php 页面,然后将其滚动回原来的位置。 但是如果用户不在会话中,浏览器会滚动页面但它之前没有重新加载它,所以用户仍然会在文件列表中看到他删除的文件。



问题

  1. 即使我们不在会话中,您是否知道如何在返回会话时重现浏览器的行为?

  2. 您知道解决此问题的方法,甚至是解决此问题的另一种方法吗?

谢谢!

我知道我可以使用 AJAX 删除文件,所以我不必每次都去 delete_file.php,但这不是答案

4

4 回答 4

5

您可以发出锚点:

<a name="anchor1"/>filename_this
<a name="anchor2"/>filename_that

要删除filename_this,请传递删除页面 filename_this 和anchor1. 删除页面然后重定向到file_list.php#anchor1

请注意,锚名称不应映射到文件名。这样,当您删除第五个文件时,锚点就在“新”第五个文件(旧文件所在的位置)附近。

于 2010-05-31T19:37:02.593 回答
3

浏览器通常会记住你在哪里。如果您从 A 页面转到 B,然后返回(使用后退按钮),您应该会到达 A 页面的相同位置。

当您使用 时header('location: A.php');,您是在指示浏览器前进到另一个页面。它以前从来没有出现过,所以它不知道滚动位置是什么。

使用 时history.go(-1),您是在指示浏览器单击后退按钮,这就是您的解决方法有效的原因。您可能会发出no-cache标头,这就是浏览器重新加载页面的原因。这里的效果和只是重新加载页面(不导航)是一样的。这样做的问题是用户可以单击“前进”按钮,然后再次到达您的位置delete_file.php(最终可能会意外删除另一个文件)。

一些想法:

  • 您可以在页面上放置一堆锚点(每个文件一个),然后重定向到最接近用户单击位置的锚点。因此,如果您删除了文件 4,则重定向到文件 3 header('file_list.php#file3');
  • 在 javascript 中计算当前滚动位置,并将其存储在 cookie 中。当页面重新加载时,使用 javascript 滚动到您所在的位置(确保只执行一次,3 天后访问该页面并无特殊原因滚动到中间会令人困惑)。
  • 您还可以使用 AJAX 在后台删除文件。在这里,您让浏览器处理滚动。这可能不是您正在寻找的答案,但它肯定是一个解决方案。

在我看来,最好的解决方案是最简单的:让你的页面更短。如果您的页面不够长,无法滚动,那么没有问题。

于 2010-05-31T20:07:57.027 回答
0

提交到 IFRAME 怎么样?(根本没有JS?您将无法隐藏已删除的条目...)

于 2010-05-31T19:41:00.757 回答
0

总而言之,您的步骤是:

1)“显示文件列表的网页(file_list.php)”

2)“delete_file.php 删除文件,然后告诉浏览器返回到 file_list.php”

我假设 file_list.php 仅显示目录的当前内容,显然不包括您刚刚删除的文件。但是您希望 file_list.php 以某种方式向用户提示有关他们刚刚删除的文件的信息,例如通过跳回该文件通常在列表中的位置(如果它仍然存在)。可能有几十种方法可以做到这一点。

1) delete_file.php 打开网址“/file_list.php#the_file_i_just_dele.ted”。在数组中收集目录内容后,将“the_file_i_just_dele.ted”插入该数组,可能按字母顺序或其他顺序。该数组应该有另一个布尔字段:"deleted" => 1 | 0,在删除文件的情况下为 1。在遍历数组以回显列表时,在每个列表项旁边添加一个 html 锚点,它可能只是文件名。如果 'deleted' 为 1,不要回显它旁边的 'delete' 按钮。在页面打开时,页面将直接跳转到“the_file_i_just_dele.ted”锚点。

2)使用ajax。

3) 为所有文件系统操作提供一个单独的 php 库文件。file_list.php 是您的客户需要看到的唯一页面。删除时,file_list.php 将在 url 后附加 '#deleted' 发布到自身,将目录内容收集到一个数组中,然后删除请求的文件,回显数组,当在循环中遇到您删除的文件时,禁用或不要绘制“删除”按钮在其旁边回显“已删除”的 html 锚点。在页面打开时,客户端会自动跳转到“已删除”的锚点。

4) 制作一个购物车,而不必关心整个“跟踪用户在前一页上的位置”的问题。让用户检查要删除的每个文件。如果“购物”体验跨越多个目录和页面,请使用 cookie、DB 或会话文件来跟踪购物车内容。用户单击页面底部的单个“删除”按钮。添加一个“结帐确认”页面,要求用户根据需要确认删除列出的文件。

...ETC...

您还可以根据需要混合和匹配解决方案。

于 2010-05-31T21:35:07.303 回答