Объясняя, что я пытаюсь решить:

У меня есть веб-страница (file_list.php), показывающая список файлов , и рядом с каждым файлом есть кнопка, чтобы удалить его. Когда пользователь нажимает кнопку «УДАЛИТЬ» рядом с определенным именем файла, браузер переходит к сценарию с именем 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): браузер перезагружает страницу file_list.php, а затем прокручивает ее обратно туда, где она была раньше . Но если пользователь НЕ находится в сеансе, браузер прокручивает страницу, но ЭТО НЕ ПРЕДОСТАВЛЯЕТ ЕГО ПЕРЕЗАГРУЗКУ, поэтому пользователь все равно увидит удаленный файл в списке файлов.



ВОПРОСЫ

  1. Знаете ли вы, как воспроизвести поведение браузера, когда он возвращается в сеанс, даже если мы не в сеансе?

  2. Вы знаете выход из этого, даже другой способ решения этого вопроса?

Благодарность!

Я знаю, что могу использовать AJAX для удаления файла, поэтому мне не придется каждый раз переходить к delete_file.php, но это не ответ .

0
Marco Demaio 31 Май 2010 в 23:28

3 ответа

Лучший ответ

Вы можете испустить якоря:

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

Чтобы удалить filename_this, вы передаете страницу удаления filename_this, а также anchor1. Страница удаления затем перенаправляется на file_list.php#anchor1

Обратите внимание, что имена якорей не должны соответствовать именам файлов. Таким образом, когда вы удаляете пятый файл, якорь находится рядом с «новым» пятым файлом (где раньше был старый).

5
egrunin 31 Май 2010 в 20:23

Как насчет отправки на IFRAME? (вообще нет JS? Вы не сможете скрыть удаленную запись ...)

0
elcuco 31 Май 2010 в 19:41

Браузеры обычно помнят, где вы были. Если вы перейдете со страницы 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 для удаления файла в фоновом режиме. Здесь вы позволяете браузеру справиться с прокруткой. Возможно, это не тот ответ, который вы ищете, но это, безусловно, решение.

На мой взгляд, лучшее решение самое простое: сделать ваши страницы короче. Если ваши страницы недостаточно длинны для прокрутки, тогда проблем нет.

3
Seth 31 Май 2010 в 20:07