通过重新加载第1页使浏览器返回,然后再次滚动它

时间:2010-05-31 19:28:52

标签: php javascript session header browser-history

解释我想要解决的问题:

我有网页(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”);中使用delete_file.php我只是使用javascript调用window.history.go(-1)

用户在会话中(仅使用PHP session_start函数)时,此解决方法非常有效:浏览器RELOADS file_list.php页面,然后将其滚动回到哪里它是在之前。 但是如果用户不在会话中,浏览器会滚动页面,但之前它不会重新发送它,因此用户仍然会在文件列表中看到他删除的文件。



问题

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

  2. 你是否知道如何解决这个问题,甚至是解决这个问题的另一种方式?

  3. 谢谢!

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

4 个答案:

答案 0 :(得分:5)

你可以发射锚点:

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

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

请注意,锚名称不应映射到文件名。这样当你删除第五个文件时,锚点就在“新”第五个文件附近(以前是旧文件)。

答案 1 :(得分: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在后台删除文件。在这里,您让浏览器处理滚动。这可能不是您正在寻找的答案,但它肯定是一个解决方案。

在我看来,最简单的解决方案是:缩短页面。如果你的页面不够长,无法滚动,那就没问题了。

答案 2 :(得分:0)

如何提交IFRAME? (根本没有JS?你将无法隐藏已删除的条目......)

答案 3 :(得分:0)

总而言之,您的步骤是:

1)“显示文件列表”

的网页(file_list.php)

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

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

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

2)使用ajax。

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

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

...等...

您也可以根据需要混合搭配解决方案。