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

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

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

Strict Standards: Resource ID#26 used as offset, casting to integer (26) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Вызов window.scrollTo(0,0) при прохождении по ссылке внутри iframe
ТвойWeb ТвойWeb
Качественный Европейский хостинг
Форум для чайников
 Чат на форуме      Помощь      Поиск      Пользователи


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

> Без описания
tosha-xlr
Отправлено: 20 Сентября, 2008 - 10:24:13
Post Id



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)

 
 Top
Furax
Отправлено: 20 Сентября, 2008 - 23:07:05
Post Id



Бледнотик


Покинул форум
Сообщений всего: 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);
 
 Top
tosha-xlr
Отправлено: 21 Сентября, 2008 - 00:49:06
Post Id



Newbie


Покинул форум
Сообщений всего: 15
Дата рег-ции: Июнь 2005  
Откуда: Москва, Россия.

Карма 0

[+]


Вариант интересный, но если использовать SetInterval, проще и надёжнее на мой взгляд написать, скромно...
CODE:
setInterval('top.scrollTo(0,0)', 1);

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

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

Возник вопрос, почему updateIframeOnclick вызываясь раз в секунду поднимает страничку столь же молниеносно, как мой вариант?
 
 Top
Furax
Отправлено: 21 Сентября, 2008 - 05:15:06
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Потому что updateIframeOnclick сам ничего не поднимает, а лишь назначает обработчик события щелчка для элемента body документа, загруженного в iframe (то есть, если вместо текущего документа в iframe загрузится другой, не более чем через секунду для него также будет выставлен нужный onclick). А сама прокрутка происходит через 10 милисекунд после щалчка на любом месте документа в iframе. Кстати, делать чаще (как у Тебя) смысла всё равно нет - не различает человеческий глаз смену картинок, если она длится менее 1/16 секунды (кино, 25-й кадр и иже с ним).
 
 Top
Furax
Отправлено: 21 Сентября, 2008 - 05:27:06
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Кстати, есть альтернативный вариант: вместо ссылок и якорей использовать в самом iframе прокрутку javascriptом. Тогда, по идее, дёрганий внешнего документа быть не должно. Определить координаты, к которым надо прокрутить страницу, несложно: нужно прочитать свойство offsetTop у того элемента, к которому надо перейти.
 
 Top
tosha-xlr
Отправлено: 21 Сентября, 2008 - 06:21:55
Post Id



Newbie


Покинул форум
Сообщений всего: 15
Дата рег-ции: Июнь 2005  
Откуда: Москва, Россия.

Карма 0

[+]


Спасибо за обстоятельное объяснение и вариантик понравился, как будет время позамарачиваюсь, просто тут такой момент ещё, а вдруг у человека JS выключен, пропавший заголовок он переживёт, а вот с оглавлением будет сложнее, хотя без JS в текущем варианте он и оглавления то не увидит, ладно буду думать когда время будет...

А по поводу интервала хочу попробовать запустить на какой-нибудь совсем дохлой машинке, просто если не напрягает, то так текста меньше, понимаю, что 2 байта это мелочь, но я очень люблю, когда JS код используется минимально...
 
 Top
Furax
Отправлено: 21 Сентября, 2008 - 07:16:19
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Какие 2 байта? В смысле - вместо 100 написать 1, чтобы код короче был?..

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



Newbie


Покинул форум
Сообщений всего: 15
Дата рег-ции: Июнь 2005  
Откуда: Москва, Россия.

Карма 0

[+]


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

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



Newbie


Покинул форум
Сообщений всего: 15
Дата рег-ции: Июнь 2005  
Откуда: Москва, Россия.

Карма 0

[+]


Кстати придумал решение для замены
CODE:
setInterval(updateIframeOnclick, 1000);

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


А если используется JS, например, при наведении подгрузить, updateIframeOnclick можно вызвать из той функции которая подгружает документ...
 
 Top
Furax
Отправлено: 23 Сентября, 2008 - 07:55:49
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




А я не вижу смысла грузить машину сильнее, если эффект от этого не меняется. Радость Документ потяжелеет в лучшем случае на 1%, а загрузка процессора уменьшится в 100 раз.

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

Оптимальный вариант - это, конечно, разобраться с этим на уровне ссылок во вложенном документе, как я писал выше, осуществляя прокрутку внутреннего документа скриптом. Но если не хочется "портить" внутренний, которых, к тому же, много, - придётся просто периодически обновлять для него onclick.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 6 (гостей: 6, зарегистрированных: 0, скрытых: 0)
« JavaScript »


Все гости форума могут просматривать этот раздел.
Только администраторы и модераторы могут создавать новые темы в этом разделе.
Только администраторы и модераторы могут отвечать на сообщения в этом разделе.



Форум на AlfaSpace.NET


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

[Script Execution time: 0.0446]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33