Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Слои и location.reload() нужна помощь


Автор: tempman 17.9.2007, 14:47
Здравствуйте.
Помогите , пожалуйста , найти вариант  решения.
Имеется html  страница со слоями . По умолчанию  когда страница подгружается  все слои display="none".  Тыкая на определенные кнопки на странице можно какой либо из слоев сделать display="block" (все остальные становятся display="none", т.е. видимый слой всегда только один) .
На странице имеется таймер , по истечению которого происходит window.location.reload().  
Возник вопрос , как при reload страницы оставить видимым слой, который в данный момент был display="bock".

вариант  типа :
Код

<script LANGUAGE="JScript">
<!-- hide

function showLayer(layerName){
   hideLayerAll(); // прячет все слои
   document.getElementById(layerName).style.display='block';
}

function myreload()
{
window.location.reload();

showLayer('limits'); //  фун-ия showlayer выводит слой по id
}

// -->
</script>
<body onLoad="setTimeout(myreload,30000)" >

</body>




не работает (то есть страница релоадится, но слой после этого уже не показывается нужный)


а такой вариант :
Код

<script LANGUAGE="JScript">
<!-- hide

function showLayer(layerName){
   hideLayerAll(); // прячет все слои
   document.getElementById(layerName).style.display='block';
}

function myreload()
{
window.location.reload();
//###################
alert("Обновление");                 // разница вариантов только тут - появился  alert()
//###################
showLayer('limits'); //  фун-ия showlayer выводит слой по id
}

// -->
</script>
<body onLoad="setTimeout(myreload,30000)" >

</body>



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


Помогите с вариантом решения  пожалуйста.

Автор: dsCode 17.9.2007, 15:23
tempman, хех =) странно... где это сохраняется этот код, если он выполняется после перезагрузки страницы? Примерное объяснение причины есть: в первом случае "limits" еще не успевает догрузиться, а во тором - alert(...) притормаживает основной процесс и "limits" догружается. Но мне интересно не это, интересно, почему код, ниже window.location.reload(); срабатывает после перезагрузки страницы?

А вообще, решением может быть - по клику div'а сохранять его id в куках, например, а в onLoad'e страницы устанавливать этот div, взяв id из куки.

Автор: tempman 17.9.2007, 15:43
Цитата(dsCode @  17.9.2007,  15:23 Найти цитируемый пост)
А вообще, решением может быть - по клику div'а сохранять его id в куках, например, а в onLoad'e страницы устанавливать этот div, взяв id из куки. 


такой вариатн   уже рассматривался.
так же как и window.replace () с указанием в строке адреса параметра div=limits и дальнейшей обработки его в пхп который выдаст штмл страницу с уже видимым слоем.

но все это немного через попу.

хотелось бы   элегантно и просто smile

Автор: SelenIT 17.9.2007, 15:49
tempman, элегантнее, чем через куки, боюсь, не получится. Фактически, когда Вы перегружаете страницу манипуляциями с location, старая страница со всей DOM и скриптами, строго говоря, перестает существовать. А полагаться на скрипты уже несуществующей страницы так же ненадежно, как и на любых других призраков...

Автор: tempman 17.9.2007, 15:58
Цитата(SelenIT @  17.9.2007,  15:49 Найти цитируемый пост)
tempman, элегантнее, чем через куки, боюсь, не получится. Фактически, когда Вы перегружаете страницу манипуляциями с location, старая страница со всей DOM и скриптами, строго говоря, перестает существовать. А полагаться на скрипты уже несуществующей страницы так же ненадежно, как и на любых других призраков... 



спасибо ... я пытался сам  объяснить это начальнику,   надеюсь хоть общественому мнению он поверит smile))
остается  засада с  выключенными кукисами в браузере.

правильно - а нефик отключать!!! smile

Автор: dsCode 17.9.2007, 16:03
tempman, 
Цитата(tempman @  17.9.2007,  15:43 Найти цитируемый пост)
но все это немного через попу

и в чем тут попа? Если номер таба (дива) нигде (на сервере) у Вас не сохраняется, дивы показываются/скрываются клиентом - где еще сохранить номер нужного дива, чтобы при релоаде (!) когда страница перегенерится полностью (!) включая javascript код, показывать нужный див? Где, если не в куках?

P.S.: кто-нибудь, все-таки, может объяснить, почему код, ниже window.location.reload(); срабатывает после перезагрузки страницы?


Автор: tempman 17.9.2007, 16:10
Цитата(dsCode @  17.9.2007,  16:03 Найти цитируемый пост)
P.S.: кто-нибудь, все-таки, может объяснить, почему код, ниже window.location.reload(); срабатывает после перезагрузки страницы?

я нет smile

по поводу кукисов - спасибоsmile
нашел

Автор: ksnk 17.9.2007, 16:47
tempman, можно совместить оба способа - хранение в куках и передачу номера DIV'а в адресной строке. Нужно просто проверить возможность установки кукисов (установив, прочитав и сравнив) и если они не работают - использовать второй вариант.

Автор: tempman 17.9.2007, 16:56
Цитата(ksnk @  17.9.2007,  16:47 Найти цитируемый пост)
tempman, можно совместить оба способа - хранение в куках и передачу номера DIV'а в адресной строке. Нужно просто проверить возможность установки кукисов (установив, прочитав и сравнив) и если они не работают - использовать второй вариант. 


только что узнал , что мы оказывается воопще не работаем с кукисами ( через них ничего не передаем).

есть еще вариант  сделать   форму с хиден полем , в котором   яваскриптом писать    id  видимого слоя  и  вместо релоада  делать   submit()   в себя же.


вопщем, какой вариант будет лучше?

Автор: ksnk 17.9.2007, 17:00
Кукисы- лучше, так как при скрытой форме експлорер будет тебя о чем-то странном просить, когда ты нажмешь на кнопку релод, какие-то подозрительнве данные куда-то послать smile... 

Автор: tempman 17.9.2007, 17:17
Цитата(ksnk @  17.9.2007,  17:00 Найти цитируемый пост)
Кукисы- лучше, так как при скрытой форме експлорер будет тебя о чем-то странном просить, когда ты нажмешь на кнопку релод, какие-то подозрительнве данные куда-то послать smile...  


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

Автор: ksnk 17.9.2007, 17:46
tempman, Тогда не понятно, чем этот метод отличается от простой передачи в адресной строке. Результат, практически тот-же - грязная адресная строка, вот разве что телодвижения немного различаются...

Автор: tempman 17.9.2007, 17:58
Цитата(ksnk @  17.9.2007,  17:46 Найти цитируемый пост)
tempman, Тогда не понятно, чем этот метод отличается от простой передачи в адресной строке. Результат, практически тот-же - грязная адресная строка, вот разве что телодвижения немного различаются... 


да различее действительно минимальноsmile) 
короче ясно ,   вариантов не очень много для выбораsmile

Автор: Stampede 17.9.2007, 21:24
Ха-ха, смотрите-ка какую интересную штучку я щас обнаружил.

Вкратце ход мысли был примерно таков: хорошо, после перезагрузки страницы весь старый DOM прекращает свое существование. Но постойте, ведь кроме document есть и более глобальные объекты! Как, например, насчет window?

Ну и вот, стал я, значить, пытаться присваивать разные проперти: window.stuff = 'abc'  и пр. Смотрю - не присваиваются.

Ну-ну, подумал я про себя. Типа, думаете, защитились, запретили присвоение кастомных пропертей? Ничо, на всякую хитрую попу найдется болт с резьбой. Какие там у нас есть еще глобальные объекты?

Попробовал функцию alert. Выяснилось, что свойства цепляются нормально, но при перезагрузке теряются.

Попробовал еще какие-то объекты, и вдруг - ХОБА! Объект navigator выдал искомое поведение! Скопируйте себе на любую страницу, в любое место вот такой код:

Код

<script type="text/javascript">
if (navigator.stuff) {
    navigator.stuff = navigator.stuff + 1;
}
else {
    navigator.stuff = +1;
}

document.write('navigator.stuff=' + navigator.stuff);
</script>


Сделали? А теперь понажимайте рефреш...

Видим последовательно увеличивающийся счетчик. Так и подмывает воскликнуть фразу из анекдота: "А ручки-то вот они!" (с)

Тем, кто-то еще не до конца осознал всю важность этого открытия: дело, понятно, не в счетчике. Дело в том, что мы таким образом получаем возможность передавать от страницы к странице какую угодно инфу и в каком угодно объеме! Безо всяких кукисов!

Да ведь это открывает простор для таких новых трюков, что аж дух захватывает!

Но не спешите радоваться, господа. Как говорил Лис в Маленьком Принце, "нет в мире совершенства".

Во-первых, как выяснилось в ходе кратких экспериментов, это не работает кросс-сайтно. При переходе на другой домен присвоенные кастомные значения дружно слетают. То есть шпионить уже не получится. Но нам это и ни к чему: карма целее будет.

А вот теперь самый главный облом: это работает только в Фаерфаксе. Ни в Опере, ни в Осле подобного эффекта добиться не удалось.

И тем не менее... Кто сказал, что свет сошелся клином на объекте navigator? Есть ведь немало и других, не менее глобальных объектов, а у них - встроенные свойства, которые, возможно, не переинициализируются со сменой страницы. И кто знает, не оставили ли разработчики по недосмотру (или шутки ради) какую-нибудь лазейку для передачи инфы между страницами, а то и между сайтами? И пусть эти объекты-лазейки разнятся от браузера к браузеру - ничего, мы напишем тоненькую обертку, скрывающую детали, и назовем ее просто и скромно: bridge.js! И посвятим ее форуму Винград!

Так она и прогремит на весь мир: Vingrad Bridge smile

А что, слабо? Кто желает поучаствовать - прошу записываться smile

Автор: dsCode 17.9.2007, 22:51
Stampede, хм... Интересная находка. Причем, проперть сохраняется в любом "сайте" (файле - я открывал два файла в одном табе/окне) - stuff правильно был отображен в обоих. Хех =)) Вот это, действительно, интересно. Кстати, так же, именно в FF элементы формы сохраняют свои значения после F5 (например, был пустой <input type="text" />, вводим значение, обновляем - оно там), правда после Ctrl-F5 это не действует. Но здесь.. И после Ctrl-F5 проперть на месте. Ха-ха =) Можно порыться в js самой мозилы - может там что интересное найдется. Еще - stuff, естественно, исчезает при открытии страницы в новом табе/странице - там свой объект navigator создался.

Автор: SelenIT 17.9.2007, 23:00
Stampede, блеск! +1 однозначно!

Я тут погуглил немного тему - похоже, такого применения navigator'а ранее в истории не встречалось, так что с открытием! Однако, оказывается, существует кроссбраузерный и вроде как вполне легальный http://www.boutell.com/newfaq/creating/scriptpass.html - через свойство window.name (конечно, с ограничением на строковый тип значения, но разве это остановит JSON-щиков со стажем!).

Заодно нашел несколько упоминаний о еще одной "особенности" FF-овского navigator'а и его свойств (https://bugzilla.mozilla.org/show_bug.cgi?id=342267, http://securityvulns.ru/Ndocument641.html и еще http://www.google.com.by/search?q=Mozilla+Firefox+Javascript+navigator+Object+Vulnerability&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a). Правда, ту дырку вроде как прикрыли...

P.S. А в IE, оказывается, еще http://msdn.microsoft.com/library/default.asp?url=/workshop/author/persistence/overview.asp есть... аж 64 кБ на страницу...

dsCode,
Цитата

в FF элементы формы сохраняют свои значения после F5

Это можно "выключить", указав для них autocomplete="off"

Автор: Stampede 17.9.2007, 23:48
Цитата(SelenIT @  17.9.2007,  14:00 Найти цитируемый пост)
Однако, оказывается, существует кроссбраузерный и вроде как вполне легальный способ передачи состояния без кук - через свойство window.name (конечно, с ограничением на строковый тип значения, но разве это остановит JSON-щиков со стажем!).


Я на объект name только покосился: никак не ожидал, что он будет сохраняться между переходами. А он, оказывается, вона как - даже между сайтами работает! И действительно, кроссбраузерно!

По поводу нецелевого использования переменной name: я почти два года назад рассматривал возможность в точности такого же хака в отношении потоков Java: http://forum.vingrad.ru/forum/topic-72778/anchor-entry577255/0.html. И в частности, говорил там такие слова: 

Цитата(Stampede @  1.12.2005,  10:40 Найти цитируемый пост)
Ну и вот я давай смотреть, нет ли чего похожего в Thread. На первый взгляд как будто нет. Но вот на второй... Если внимательно приглядеться, есть такой метод, setName(String name), и соответствующий геттер. А что такое, товарищи, String name? Да ведь это же бездонное вместилище какой угодно инфы!


Действительно, далеко не все отдают себе отчет, что строкой можно закодировать практически все, что угодно - хоть трилогию Матрица в коллекционном издании. Вопрос лишь в том, каким физическим параметром ограничивается длина. А уж в какой форме сериализовать - это уже дело техники. Но в JavaScript, конечно, сам бог велел использовать JSON.

Насчет секьюрности ничего особенно страшного нет: можно сохранять инфу в зашифрованном виде.

Короче, есть серьезный повод подумать о новых, неведомых раньше, прорывных решениях. Пойду загружать подкорку smile

Автор: Zeroglif 18.9.2007, 10:28
Цитата(SelenIT @  18.9.2007,  00:00 Найти цитируемый пост)
Я тут погуглил немного тему - похоже, такого применения navigator'а ранее в истории не встречалось, так что с открытием!

Древнейшая недокументированная редко используемая фича (то работает, то нет, то на одном домене, то нет, то в одном браузере, то нет, то считают багом, то нет...).

"Ранее в истории":

1997 год
http://groups.google.com/group/comp.lang.javascript/msg/ffaa117043c0d51f?hl=ru&
1998 год
http://groups.google.com/group/comp.lang.javascript/msg/4f0cdee30f2e5b56?hl=ru&
1999 год (рассматривается в качестве Security Vunerability)
http://web.archive.org/web/20000209143711/http://irt.org/navigator/index.htm
1999 год
http://groups.google.com/group/comp.lang.javascript/msg/57559ef97a114c14?hl=ru&
И так далее поближе к нашему веку, если погуглить, то становится ясно, что каждый год эта фишка снова всплывает, как только встаёт вопрос о сохранении какой-нибудь мелочи: позиции скролла и т.п.
http://www.codingforums.com/showpost.php?p=160806&postcount=6
http://www.webdeveloper.com/forum/archive/index.php/t-27455.html
IE кстати, не остался в стороне (IE5.5/IE6.0), но с определённого момента (XP SP 2) это дело прикрыли
http://support.microsoft.com/kb/884698

Автор: dsCode 18.9.2007, 11:13
Zeroglif, так что, значит полагаться на это не стоит? В какой-то момент все это может рухнуть (если это баг, а не "недокументированная редко используемая фича")? Но пока оно есть, вероятно, это может быть серьезной дыркой. И единственным способом, который гарантированно вернет правильный параметр, является передача через URL (если куки отключены и нет серверной части)?

P.S.: а вообще, интересные "фичи" - ни про navigator.myProperty, ни про window.name я не знал. Thx =)

Автор: Zeroglif 18.9.2007, 11:19
Цитата(dsCode @  18.9.2007,  12:13 Найти цитируемый пост)
...полагаться на это не стоит?

Не стоит.

Цитата(dsCode @  18.9.2007,  12:13 Найти цитируемый пост)
...все это может рухнуть?

Легко.

Автор: SelenIT 18.9.2007, 13:04
Zeroglif, ух ты... так дотошно в глубь веков (нашего и прошлого;) я не копал... респектище Вашей эрудиции (впрочем, как всегда;)!

Ну а по поводу window.name - оно ведь, похоже, работает более-менее стабильно и единообразно во всех реализациях, включая Оперную? Так что не слишком серьезные вещи (вроде той же позиции скроллинга и т.п.) ему все-таки можно доверить... или могут быть еще какие-нибудь подводные грабли?

Автор: Zeroglif 18.9.2007, 14:20
Цитата(SelenIT @  18.9.2007,  14:04 Найти цитируемый пост)
работает более-менее стабильно и единообразно во всех реализациях

Возможно, в лучшие годы IE-only и IE-почти-only многие этим и пользовались, но в качестве универсального решения сегодняшнего дня, когда движков больше, их версии меняются, "всем известное поведение" в плане безопасности и стабильности явно проигрывает "документированному поведению". В этом смысле, что navigator.prop=..., что window.name=... - одна фигня...  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)