Страниц (2): [1] 2 » |
|
Без описания |
Поиск в теме | Версия для печати |
tosha-xlr |
Отправлено: 20 Сентября, 2008 - 10:24:13
|
Newbie
Покинул форум
Сообщений всего: 15
Дата рег-ции: Июнь 2005
Откуда: Москва, Россия.
Карма 0
[+]
|
Имеем: Страницу с iframe внутри которого лежит страница c переходами на якоря (по ссылкам типа "lala.html#lala" ).
Проблема 1: При переходе на эту ссылку iframe поднимается на начало страницы (прячет шапку с логотипом)
Проблема 2: Если прописать в основной странице что-то типа <body onclick="window.scrollTo(0,0)">, то onclick будет действовать везде кроме нужной области iframe (а может просто рано срабатывает...)
Проблема 3: Отсутствие обработки каких либо событий для тега iframe.
Проблема 4: Если сделать прозрачный Div на всю страницу и по нажатию на него запустить window.scrollTo(0,0), то он работать конечно будет, но не даст проходить по ссылкам, которые находятся под ним, что не приемлимо.
Возможное решение: Предполагаю есть какой-то способ прописать внутри iframe при прохождении по ссылке обращение к основному окну (но такой вариант мне не очень нравится, т.к. придётся встраивать этот код в несколько страниц)
Желаемое решение: Хотелось бы увидеть код который можно выложить на основной страничке и при переходе по ссылкам внутри ifame вызывался window.scrollTo(0,0)(Отредактировано автором: 20 Сентября, 2008 - 10:26:26) |
|
|
Furax |
Отправлено: 20 Сентября, 2008 - 23:07:05
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
Увы, с точки зрения JavaScriptа в iframe загружен совсем другой документ, а не внешний, так что события внутреннего документа не могут быть так просто обработаны внешним. Кроме того, есть ещё одно ограничение: взаимодействие фреймов возможно в том и только том случае, если они принадлежат к одному и тому же домену.
Есть два пути: либо прописать обработчики события onclick явно во внутреннем документе, либо определять их из внешнего. Второй вариант, как я понял, предпочтительнее. Выглядеть он будет как-то так (код во внешнем документе):
CODE:function scrollTopToTop()
{
setTimeout('top.scrollTo(0,0)', 10); //Таймаут - чтобы прокрутка не произошла раньше перехода по ссылке
}
function updateIframeOnclick()
{
try
{
if (!top.iframe_name.document.body.onclick)
top.iframe_name.document.body.onclick = scrollTopToTop;
}
catch (e)
{}
}
setInterval(updateIframeOnclick, 1000); |
|
|
tosha-xlr |
Отправлено: 21 Сентября, 2008 - 00:49:06
|
Newbie
Покинул форум
Сообщений всего: 15
Дата рег-ции: Июнь 2005
Откуда: Москва, Россия.
Карма 0
[+]
|
Вариант интересный, но если использовать SetInterval, проще и надёжнее на мой взгляд написать, скромно...
CODE:setInterval('top.scrollTo(0,0)', 1);
Я на самом деле так писать не хотел, потому как думал ресурсы есть будет, попробовал, вроде не грузит машину...
Единственный минус вашего и моего вариантов, проскакивает кадр когда поднимается вверх iframe и получается неприятное для меня моргание, хочется конечно что-то поинтереснее придумать, хотя наверно и не выйдет...
Возник вопрос, почему updateIframeOnclick вызываясь раз в секунду поднимает страничку столь же молниеносно, как мой вариант? |
|
|
Furax |
Отправлено: 21 Сентября, 2008 - 05:15:06
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
Потому что updateIframeOnclick сам ничего не поднимает, а лишь назначает обработчик события щелчка для элемента body документа, загруженного в iframe (то есть, если вместо текущего документа в iframe загрузится другой, не более чем через секунду для него также будет выставлен нужный onclick). А сама прокрутка происходит через 10 милисекунд после щалчка на любом месте документа в iframе. Кстати, делать чаще (как у Тебя) смысла всё равно нет - не различает человеческий глаз смену картинок, если она длится менее 1/16 секунды (кино, 25-й кадр и иже с ним). |
|
|
tosha-xlr |
Отправлено: 21 Сентября, 2008 - 06:21:55
|
Newbie
Покинул форум
Сообщений всего: 15
Дата рег-ции: Июнь 2005
Откуда: Москва, Россия.
Карма 0
[+]
|
Спасибо за обстоятельное объяснение и вариантик понравился, как будет время позамарачиваюсь, просто тут такой момент ещё, а вдруг у человека JS выключен, пропавший заголовок он переживёт, а вот с оглавлением будет сложнее, хотя без JS в текущем варианте он и оглавления то не увидит, ладно буду думать когда время будет...
А по поводу интервала хочу попробовать запустить на какой-нибудь совсем дохлой машинке, просто если не напрягает, то так текста меньше, понимаю, что 2 байта это мелочь, но я очень люблю, когда JS код используется минимально... |
|
|
tosha-xlr |
Отправлено: 21 Сентября, 2008 - 14:37:53
|
Newbie
Покинул форум
Сообщений всего: 15
Дата рег-ции: Июнь 2005
Откуда: Москва, Россия.
Карма 0
[+]
|
Именно так, по поводу двух байтов, просто не вижу смысла писать больше, если и так работает и не мешает работе системы ни в одном браузере...
Ясно, спасибо, буду думать, как сделать, пока вариант который я написал полностью устраивает, завтра сдавать, а вообще идея с использованием JavaScript для скроллинга понравилась, интересная, может буду потом парсить split'ом весь документ, как огромную строку, где автоматически будут проставляться Id для оглавления, нумирация ставиться, разные варианты просмотра (с нумированным оглавлением, ещё как-нибудь) вобщем когда есть пара массивов с темами и содержанием материал можно представить любым образом, только вот строка на 700Кб может долго парситься, ладно это дело будущего... |
|
|
Furax |
Отправлено: 23 Сентября, 2008 - 07:55:49
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
А я не вижу смысла грузить машину сильнее, если эффект от этого не меняется. Документ потяжелеет в лучшем случае на 1%, а загрузка процессора уменьшится в 100 раз.
Заменить setInterval onclickом не удастся: во-первых, клик по ссылки в iframе не будет обработан во внешним документом; во-вторых, событие onclick во внутреннем документе будет обработано гораздо раньше, чем во фрейм загрузится новый документ. А пока он не загрузился (по крайней мере, не дошла очередь до <body> - прописывать body.onclick для него бесполезно.
Оптимальный вариант - это, конечно, разобраться с этим на уровне ссылок во вложенном документе, как я писал выше, осуществляя прокрутку внутреннего документа скриптом. Но если не хочется "портить" внутренний, которых, к тому же, много, - придётся просто периодически обновлять для него onclick. |
|
|
|
Поиск в теме | Версия для печати |
Страниц (2): [1] 2 » |
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0, скрытых: 0) |
« JavaScript » |
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
|
|
|