| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > Слои и location.reload() нужна помощь |
| Автор: tempman 17.9.2007, 14:47 | ||||
| Здравствуйте. Помогите , пожалуйста , найти вариант решения. Имеется html страница со слоями . По умолчанию когда страница подгружается все слои display="none". Тыкая на определенные кнопки на странице можно какой либо из слоев сделать display="block" (все остальные становятся display="none", т.е. видимый слой всегда только один) . На странице имеется таймер , по истечению которого происходит window.location.reload(). Возник вопрос , как при reload страницы оставить видимым слой, который в данный момент был display="bock". вариант типа :
не работает (то есть страница релоадится, но слой после этого уже не показывается нужный) а такой вариант :
после релоада страницы выдвет алерт окно, тыкая на ок в котором на странице появляется нужный слой. Но тыкать каждый раз на кнопку не подходит. Помогите с вариантом решения пожалуйста. |
| Автор: dsCode 17.9.2007, 15:23 |
| tempman, хех =) странно... где это сохраняется этот код, если он выполняется после перезагрузки страницы? Примерное объяснение причины есть: в первом случае "limits" еще не успевает догрузиться, а во тором - alert(...) притормаживает основной процесс и "limits" догружается. Но мне интересно не это, интересно, почему код, ниже window.location.reload(); срабатывает после перезагрузки страницы? А вообще, решением может быть - по клику div'а сохранять его id в куках, например, а в onLoad'e страницы устанавливать этот div, взяв id из куки. |
| Автор: SelenIT 17.9.2007, 15:49 |
| tempman, элегантнее, чем через куки, боюсь, не получится. Фактически, когда Вы перегружаете страницу манипуляциями с location, старая страница со всей DOM и скриптами, строго говоря, перестает существовать. А полагаться на скрипты уже несуществующей страницы так же ненадежно, как и на любых других призраков... |
| Автор: tempman 17.9.2007, 15:58 | ||
спасибо ... я пытался сам объяснить это начальнику, надеюсь хоть общественому мнению он поверит остается засада с выключенными кукисами в браузере. правильно - а нефик отключать!!! |
| Автор: dsCode 17.9.2007, 16:03 |
| tempman, и в чем тут попа? Если номер таба (дива) нигде (на сервере) у Вас не сохраняется, дивы показываются/скрываются клиентом - где еще сохранить номер нужного дива, чтобы при релоаде (!) когда страница перегенерится полностью (!) включая javascript код, показывать нужный див? Где, если не в куках? P.S.: кто-нибудь, все-таки, может объяснить, почему код, ниже window.location.reload(); срабатывает после перезагрузки страницы? |
| Автор: tempman 17.9.2007, 16:10 | ||
я нет по поводу кукисов - спасибо нашел |
| Автор: ksnk 17.9.2007, 16:47 |
| tempman, можно совместить оба способа - хранение в куках и передачу номера DIV'а в адресной строке. Нужно просто проверить возможность установки кукисов (установив, прочитав и сравнив) и если они не работают - использовать второй вариант. |
| Автор: tempman 17.9.2007, 16:56 | ||
только что узнал , что мы оказывается воопще не работаем с кукисами ( через них ничего не передаем). есть еще вариант сделать форму с хиден полем , в котором яваскриптом писать id видимого слоя и вместо релоада делать submit() в себя же. вопщем, какой вариант будет лучше? |
| Автор: ksnk 17.9.2007, 17:00 |
| Кукисы- лучше, так как при скрытой форме експлорер будет тебя о чем-то странном просить, когда ты нажмешь на кнопку релод, какие-то подозрительнве данные куда-то послать |
| Автор: tempman 17.9.2007, 17:17 | ||
кукисы не юзаем потому что у тех кому пишем в браузерах кукисы отключены (пишем для внутренних нужд организации) а если метод в этой форме будет гет а не пост? вроде когда все параметры в строке адреса - он эту табличку не выводит, или все же выкидывает? |
| Автор: ksnk 17.9.2007, 17:46 |
| tempman, Тогда не понятно, чем этот метод отличается от простой передачи в адресной строке. Результат, практически тот-же - грязная адресная строка, вот разве что телодвижения немного различаются... |
| Автор: tempman 17.9.2007, 17:58 | ||
да различее действительно минимально короче ясно , вариантов не очень много для выбора |
| Автор: Stampede 17.9.2007, 21:24 | ||
| Ха-ха, смотрите-ка какую интересную штучку я щас обнаружил. Вкратце ход мысли был примерно таков: хорошо, после перезагрузки страницы весь старый DOM прекращает свое существование. Но постойте, ведь кроме document есть и более глобальные объекты! Как, например, насчет window? Ну и вот, стал я, значить, пытаться присваивать разные проперти: window.stuff = 'abc' и пр. Смотрю - не присваиваются. Ну-ну, подумал я про себя. Типа, думаете, защитились, запретили присвоение кастомных пропертей? Ничо, на всякую хитрую попу найдется болт с резьбой. Какие там у нас есть еще глобальные объекты? Попробовал функцию alert. Выяснилось, что свойства цепляются нормально, но при перезагрузке теряются. Попробовал еще какие-то объекты, и вдруг - ХОБА! Объект navigator выдал искомое поведение! Скопируйте себе на любую страницу, в любое место вот такой код:
Сделали? А теперь понажимайте рефреш... Видим последовательно увеличивающийся счетчик. Так и подмывает воскликнуть фразу из анекдота: "А ручки-то вот они!" (с) Тем, кто-то еще не до конца осознал всю важность этого открытия: дело, понятно, не в счетчике. Дело в том, что мы таким образом получаем возможность передавать от страницы к странице какую угодно инфу и в каком угодно объеме! Безо всяких кукисов! Да ведь это открывает простор для таких новых трюков, что аж дух захватывает! Но не спешите радоваться, господа. Как говорил Лис в Маленьком Принце, "нет в мире совершенства". Во-первых, как выяснилось в ходе кратких экспериментов, это не работает кросс-сайтно. При переходе на другой домен присвоенные кастомные значения дружно слетают. То есть шпионить уже не получится. Но нам это и ни к чему: карма целее будет. А вот теперь самый главный облом: это работает только в Фаерфаксе. Ни в Опере, ни в Осле подобного эффекта добиться не удалось. И тем не менее... Кто сказал, что свет сошелся клином на объекте navigator? Есть ведь немало и других, не менее глобальных объектов, а у них - встроенные свойства, которые, возможно, не переинициализируются со сменой страницы. И кто знает, не оставили ли разработчики по недосмотру (или шутки ради) какую-нибудь лазейку для передачи инфы между страницами, а то и между сайтами? И пусть эти объекты-лазейки разнятся от браузера к браузеру - ничего, мы напишем тоненькую обертку, скрывающую детали, и назовем ее просто и скромно: bridge.js! И посвятим ее форуму Винград! Так она и прогремит на весь мир: Vingrad Bridge А что, слабо? Кто желает поучаствовать - прошу записываться |
| Автор: 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,
Это можно "выключить", указав для них autocomplete="off" |
| Автор: Stampede 17.9.2007, 23:48 | ||||
Я на объект name только покосился: никак не ожидал, что он будет сохраняться между переходами. А он, оказывается, вона как - даже между сайтами работает! И действительно, кроссбраузерно! По поводу нецелевого использования переменной name: я почти два года назад рассматривал возможность в точности такого же хака в отношении потоков Java: http://forum.vingrad.ru/forum/topic-72778/anchor-entry577255/0.html. И в частности, говорил там такие слова:
Действительно, далеко не все отдают себе отчет, что строкой можно закодировать практически все, что угодно - хоть трилогию Матрица в коллекционном издании. Вопрос лишь в том, каким физическим параметром ограничивается длина. А уж в какой форме сериализовать - это уже дело техники. Но в JavaScript, конечно, сам бог велел использовать JSON. Насчет секьюрности ничего особенно страшного нет: можно сохранять инфу в зашифрованном виде. Короче, есть серьезный повод подумать о новых, неведомых раньше, прорывных решениях. Пойду загружать подкорку |
| Автор: Zeroglif 18.9.2007, 10:28 | ||
Древнейшая недокументированная редко используемая фича (то работает, то нет, то на одном домене, то нет, то в одном браузере, то нет, то считают багом, то нет...). "Ранее в истории": 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 |
Не стоит. Легко. |
| Автор: SelenIT 18.9.2007, 13:04 |
| Zeroglif, ух ты... так дотошно в глубь веков (нашего и прошлого;) я не копал... респектище Вашей эрудиции (впрочем, как всегда;)! Ну а по поводу window.name - оно ведь, похоже, работает более-менее стабильно и единообразно во всех реализациях, включая Оперную? Так что не слишком серьезные вещи (вроде той же позиции скроллинга и т.п.) ему все-таки можно доверить... или могут быть еще какие-нибудь подводные грабли? |
| Автор: Zeroglif 18.9.2007, 14:20 | ||
Возможно, в лучшие годы IE-only и IE-почти-only многие этим и пользовались, но в качестве универсального решения сегодняшнего дня, когда движков больше, их версии меняются, "всем известное поведение" в плане безопасности и стабильности явно проигрывает "документированному поведению". В этом смысле, что navigator.prop=..., что window.name=... - одна фигня... |