Сделайте так, чтобы браузер вернулся, перезагрузив страницу 1, а затем снова прокрутив ее обратно. - PullRequest
0 голосов
/ 31 мая 2010

ОБЪЯСНЯЕТ, ЧТО Я ПЫТАЮСЯ РЕШАТЬ:

У меня есть веб-страница (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, но это не ответ .

Ответы [ 4 ]

5 голосов
/ 31 мая 2010

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

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

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

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

3 голосов
/ 01 июня 2010

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

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

0 голосов
/ 01 июня 2010

Итак, подведем итог, ваши шаги:

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», возможно, в алфавитном порядке или что-то еще. В этом массиве должно быть другое логическое поле: "удалено" => 1 | 0, что в случае удаленного файла будет равно 1. При прохождении массива для отображения списка, добавьте привязку html, которая может быть просто именем файла, рядом с каждым элементом списка. Если значение «удалено» равно 1, не отображайте кнопку «удалить» рядом с ним. При открытии страницы она сразу перейдет к якору the_file_i_just_dele.ted.

2) Используйте ajax.

3) Иметь отдельный файл библиотеки php для всех действий вашей файловой системы. file_list.php - единственная страница, которую должен видеть ваш клиент. При удалении файл file_list.php отправляет самому себе с добавленным к URL «#deleted», собирает содержимое каталога в массив, , а затем удаляет запрошенный файл, выводит массив и при обнаружении удаленного файла в цикле отключить или не рисовать кнопку «Удалить» и повторяют «удаленный» якорь html прямо рядом с ним. При открытии страницы клиент автоматически перейдет к «удаленной» привязке.

4) Создайте корзину для покупок и просто не беспокойтесь о проблеме «отслеживания местоположения пользователя на предыдущей странице». Пусть пользователь отметит каждый файл для удаления. Используйте cookie-файл, базу данных или файл сеанса, чтобы отслеживать содержимое корзины, если процесс покупки будет охватывать несколько каталогов и страниц. Пользователь нажимает одну кнопку «Удалить» в нижней части страницы. Добавьте страницу «Подтверждение заказа» с просьбой подтвердить удаление указанных файлов, если хотите.

... и т.д ...

Вы также можете смешивать и сочетать решения по своему усмотрению.

0 голосов
/ 31 мая 2010

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

...