Strict Standards: Resource ID#33 used as offset, casting to integer (33) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#35 used as offset, casting to integer (35) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#36 used as offset, casting to integer (36) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Версия для печати :: Вызов window.scrollTo(0,0) при прохождении по ссылке внутри iframe
ТвойWeb » WebMaster класс » JavaScript » Вызов window.scrollTo(0,0) при прохождении по ссылке внутри iframe

Страниц (2): [1] 2 »
 

1. tosha-xlr - 20 Сентября, 2008 - 10:24:13 - перейти к сообщению
Имеем: Страницу с 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)
2. Furax - 20 Сентября, 2008 - 23:07:05 - перейти к сообщению
Увы, с точки зрения 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);
3. tosha-xlr - 21 Сентября, 2008 - 00:49:06 - перейти к сообщению
Вариант интересный, но если использовать SetInterval, проще и надёжнее на мой взгляд написать, скромно...
CODE:
setInterval('top.scrollTo(0,0)', 1);

Я на самом деле так писать не хотел, потому как думал ресурсы есть будет, попробовал, вроде не грузит машину...

Единственный минус вашего и моего вариантов, проскакивает кадр когда поднимается вверх iframe и получается неприятное для меня моргание, хочется конечно что-то поинтереснее придумать, хотя наверно и не выйдет...

Возник вопрос, почему updateIframeOnclick вызываясь раз в секунду поднимает страничку столь же молниеносно, как мой вариант?
4. Furax - 21 Сентября, 2008 - 05:15:06 - перейти к сообщению
Потому что updateIframeOnclick сам ничего не поднимает, а лишь назначает обработчик события щелчка для элемента body документа, загруженного в iframe (то есть, если вместо текущего документа в iframe загрузится другой, не более чем через секунду для него также будет выставлен нужный onclick). А сама прокрутка происходит через 10 милисекунд после щалчка на любом месте документа в iframе. Кстати, делать чаще (как у Тебя) смысла всё равно нет - не различает человеческий глаз смену картинок, если она длится менее 1/16 секунды (кино, 25-й кадр и иже с ним).
5. Furax - 21 Сентября, 2008 - 05:27:06 - перейти к сообщению
Кстати, есть альтернативный вариант: вместо ссылок и якорей использовать в самом iframе прокрутку javascriptом. Тогда, по идее, дёрганий внешнего документа быть не должно. Определить координаты, к которым надо прокрутить страницу, несложно: нужно прочитать свойство offsetTop у того элемента, к которому надо перейти.
6. tosha-xlr - 21 Сентября, 2008 - 06:21:55 - перейти к сообщению
Спасибо за обстоятельное объяснение и вариантик понравился, как будет время позамарачиваюсь, просто тут такой момент ещё, а вдруг у человека JS выключен, пропавший заголовок он переживёт, а вот с оглавлением будет сложнее, хотя без JS в текущем варианте он и оглавления то не увидит, ладно буду думать когда время будет...

А по поводу интервала хочу попробовать запустить на какой-нибудь совсем дохлой машинке, просто если не напрягает, то так текста меньше, понимаю, что 2 байта это мелочь, но я очень люблю, когда JS код используется минимально...
7. Furax - 21 Сентября, 2008 - 07:16:19 - перейти к сообщению
Какие 2 байта? В смысле - вместо 100 написать 1, чтобы код короче был?..

Что касается отключенного JS - можно делать так:
CODE:
<a href="#anchor" onclick="window.scrollTo(200, 0); return false;">
В этом случае при отключенном JS будет, как и раньше, осуществляться навигация по якорям, а при включенном - прокрутка.
8. tosha-xlr - 21 Сентября, 2008 - 14:37:53 - перейти к сообщению
Именно так, по поводу двух байтов, просто не вижу смысла писать больше, если и так работает и не мешает работе системы ни в одном браузере...

Ясно, спасибо, буду думать, как сделать, пока вариант который я написал полностью устраивает, завтра сдавать, а вообще идея с использованием JavaScript для скроллинга понравилась, интересная, может буду потом парсить split'ом весь документ, как огромную строку, где автоматически будут проставляться Id для оглавления, нумирация ставиться, разные варианты просмотра (с нумированным оглавлением, ещё как-нибудь) вобщем когда есть пара массивов с темами и содержанием материал можно представить любым образом, только вот строка на 700Кб может долго парситься, ладно это дело будущего...
9. tosha-xlr - 21 Сентября, 2008 - 14:58:32 - перейти к сообщению
Кстати придумал решение для замены
CODE:
setInterval(updateIframeOnclick, 1000);

На случай, если подгружается новый документ по нажатию на обычные ссылки.
CODE:
<body onclick="updateIframeOnclick">


А если используется JS, например, при наведении подгрузить, updateIframeOnclick можно вызвать из той функции которая подгружает документ...
10. Furax - 23 Сентября, 2008 - 07:55:49 - перейти к сообщению
А я не вижу смысла грузить машину сильнее, если эффект от этого не меняется. Радость Документ потяжелеет в лучшем случае на 1%, а загрузка процессора уменьшится в 100 раз.

Заменить setInterval onclickом не удастся: во-первых, клик по ссылки в iframе не будет обработан во внешним документом; во-вторых, событие onclick во внутреннем документе будет обработано гораздо раньше, чем во фрейм загрузится новый документ. А пока он не загрузился (по крайней мере, не дошла очередь до <body>Подмигивание - прописывать body.onclick для него бесполезно.

Оптимальный вариант - это, конечно, разобраться с этим на уровне ссылок во вложенном документе, как я писал выше, осуществляя прокрутку внутреннего документа скриптом. Но если не хочется "портить" внутренний, которых, к тому же, много, - придётся просто периодически обновлять для него onclick.

Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0375]     [ Gzipped ]