как запомнить позицию окна перед переходом на другую страницу

angelsh

Новичок
как запомнить позицию окна перед переходом на другую страницу

Суть проблемы: есть страничка на пхп, при клике она переходит на 2 страницу(тоже пхп), но 2 страница ничего не выводит, только обрабатывает данные и дальше header ("Location: ..."); назад на первую, при этом на первой странице содержимое могло уже быть немного прокручено вниз, соотверственно после возврата оно перериовывается и отображение с начала.

Вопрос - как запомнить положение полосы прокрутки до перехода, а потом возврат на ту же позицию ?
 

DiMA

php.spb.ru
Команда форума
1. на яве пишешь код, который 5 раз в секунду пишет в куки позицию текущего скролла

2. при загрузке той же страницы инициализирует позицию из кук и опять на пункт 1
 

Dovg

Продвинутый новичок
Извините, что встреваю, но код все же следует писать на java script, но не на java
 

angelsh

Новичок
MiRacLe идея сразу оч понравилась, но, как показала практика, не сработало. буду пробовать на js. мож у кого еще есть идеи/кто-то сталкивался ?
 

angelsh

Новичок
после перерисовки кидает наверх. я думаю это через header ("Location: ..."); сейчас работаю над js
 

MiRacLe

просто Чудо
КАКОЙ перерисовки?

bla-bla-bla страница-бла-бла-один-бля <iframe src="путь_к_скрипту_два_результат_которого_НИКАК_НЕ_ВЛИЯЕТ_НА_СТРАНИЦУ_НОМЕР_*ЛЯТЬ_ОДИН.php" width="1" height="1"> и дальше страница адын!!!!!!!!11111
 

angelsh

Новичок
лан, щас еще раз проверю, но было все как раз имненно так и прописано, но науки ради ))
пока сделал на js (сразу оговорюсь: на нем я не пишу, куски кода собрал по нету)

<script language="JavaScript">
function getClientSTop(){
return self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop)}
///////////
function setCookie(name, value) {
var valueEscaped = escape(value);
var expiresDate = new Date();
expiresDate.setTime(expiresDate.getTime() + 365 * 24 * 60 * 60 * 1000); // срок - 1 год, но его можно изменить
var expires = expiresDate.toGMTString();
var newCookie = name + "=" + valueEscaped + "; path=/; expires=" + expires;
if (valueEscaped.length <= 4000) document.cookie = newCookie + ";";
}
///////////////////
function getCookie(name) {
var prefix = name + "=";
var cookieStartIndex = document.cookie.indexOf(prefix);
if (cookieStartIndex == -1) return null;
var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length);
if (cookieEndIndex == -1) cookieEndIndex = document.cookie.length;
return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex));
}
///////////////////////
function savePos(pos)
{
var y=getClientSTop()
setCookie("posy", y)
}
///////////////////////
function restorePos()
{
//var obj = document.getElementById(id)
var y=getCookie("posy")
parent.scroll(0,y)
}
</script>
после добавил <body onload="restorePos()">
ну и к каждой ссылке (благо они в цыкле генерируются)
onClick=savePos()

явный недостаток - страница заметно дергается

мож кто норм шарит в js и подскажет, как решить ?
//ушел тестить с ифреймами.
 

DiMA

php.spb.ru
Команда форума
выкини <body onload="restorePos()"> который сработает только после всей загрузки

с самого начала запускаешь свою функцию с бесконечным циклом, которая читает позицию максимального скролла, и как только тот стал больше или равен записанному - ставит
либо пытается прокрутить в самый низ сразу, до сохраненной границы, причем перестает это делать, если юзер дернул скроллом сам

в бесконечном цикле флажек: либо пытаемся поставить скролл, либо пытаемся сохранить (онклик из ссылки - нафиг)
 

MiRacLe

просто Чудо
порой кажется, что у DiMA просто спролетарили пароль...
 

DiMA

php.spb.ru
Команда форума
MiRacLe
Я тебя слушаю. Пишешь мою цитату и свое мнение.
 

dimagolov

Новичок
DiMA:
выкини <body onload="restorePos()"> который сработает только после всей загрузки

с самого начала запускаешь свою функцию с бесконечным циклом, которая читает позицию максимального скролла
проблема в том, что DOM "с самого начала" еще отсутствует и есть хороший шанс вылететь с фаталом или получить бред про выяснении позиции скрола

с бесконечным циклом
вообще-то надо ставить вызов ф-ии чтения позиции скрола через setInterval, иначе получим 100% загрузку проца и неработающий JS в обработчиках асинхронных событий.
 

MiRacLe

просто Чудо
DiMA, скажи пожалуйста - ну накой ляд нужны все эти скрипты, вечные циклы и другие почёсывания левого уха правой рукой, если можно ПРОСТО не уходить с текущей страницы?
 

DiMA

php.spb.ru
Команда форума
> проблема в том, что DOM "с самого начала" еще отсутствует и есть хороший шанс вылететь с фаталом или получить бред про выяснении позиции скрола

Еще в 98 году (когда ты и не родился, а я не знал ругательных слов "DOM") я использовал вместо echo функцию say(), которая делает echo(), flush() и явой сдвигает скролл до низу (на миллиард пикселей - тупо, но коротко). Это полезно для долгих(вечных) скриптов, выполняющих работу и периодически выдающих текст на экран. say() писала текст и прокручивала браузер до низу. Изумитально работает во всех браузерах до сих пор без единой правки. Потом появился чат, где со скроллом и вечно загружающимися (но недогруженными) страницами тоже не было никаких проблем.

Здесь аналогичная проблема - нужно умно управлять скроллом, чтобы не было мерзкого эффекта от http://example.com/#link - сначала полминуты грузится страница, ты ее читаешь, а потом хоп - она догрузилась и браузер фигачит скролл на #link.

И при этом ты мне будешь втирать, что там могут быть какие-то проблемы? :) Ну, приложи голову тогда. У меня - работает с первой попытки.

> через setInterval, иначе получим 100%

ну, это крайне понятнл и подразумевается, тем более что я уже указал, итерацию данного цикла - нарпример, раз 5 в секунду более чем достаточно

> если можно ПРОСТО не уходить с текущей страницы?

Да я без понятия. Вижу вопрос - как сохранить скролл текущей страницы и отвечаю. Вопросов, можно ли не уходить - не видел.
 

FB3

Новичок
Можно еще аяксом отправлять данные на сервер, тогда без iframe и переходов на другие страницы обойтись.
 

angelsh

Новичок
большое спасибо за потраченое время всем, кто взял участие в решении проблемы )
 

Krishna

Продался Java
DiMA
Может уже хватит яваскрипт называть явой? Итак заколебали буратины, которые не понимают разницы.
 
Сверху