Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Изменение содержимого сразу двух фреймов


Автор: Vitalik 3.8.2007, 19:33
Собственно проблема следующая. Как мне кажется у нее должно быть какое-то банальное правильное решение, оно обязательно должно существовать..

Был обычный безфреймовый сайт. Слева табличка со ссылками. Нужно было его переделать на фреймы. Уже почти все готово, но не совсем..
Значится, у нас есть два фрейма (на самом деле три, трейтий вверху, но это не принципиально). Ситуация вполне обычная и стандартная: есть один фрейм - основной (в нем отображается текущее содержимое) и второй фрейм - дополнительный (в нем отображается менюшка, которая меняется в зависимости от содержимого основного фрейма).

Я долго думал, где бы мне задать вопрос об этом.. Форум "Вёрстка веб-сайтов" отпал, так как здесь скорее всего проблему невозможно решить только с помощью голого HTML. Думал потом создать ее в "JavaScript: Общие вопросы", но дело в том, что я и так знаю, как с помощью JavaScript изменить содержимое фрейма (кажется так: имя_фрейма.location.href = 'новый url'). Тут проблема несколько "ширше"..

Нужно не просто сделать "рядовую" ссылочку, меняющую содержимое двух фреймов. Хотелось бы, чтобы href у всех ссылок остался прежний, и никаких onclick по возможности не добавилось, просто у ссылок в дополнительном фрейме появляется target на основной фрейм, а все остальные ссылки остались бы вообще без изменений. В принципе может и ничего страшного не было бы, если бы добавить к каждой ссылочке какую-то ерунду, но ведь тогда и перелопачивать все файлы проекта придется, и страничка станет больше и неуклюжей.. Вобщем этого бы очень не хотелось..

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

if(!isset($_GET['navigator'])) {
    $link = "index.php?".$_SERVER['QUERY_STRING']."&navigator";
    echo "<script language='JavaScript'> parent.document.all.nav.src='$link'; </script>";
}

В файле index.php для каждого параметра action просто напросто идет такой код:
Код

case 'main':
    if(isset($_GET['navigator'])) {
        //: Выводим менюшку для дополнительного фрейма
    }
    else {
        //: Выводим основное содержимое в основной фрейм
    }
    break;

И все хорошо, все замечательно.. Если бы не несколько "но"..
Во-первых, этот навигатор (то есть менюшка в дополнительном фрейме) обновляется только тогда, когда полностью обновится страница в основном фрейме. А это ведь бывает до нескольких секунд приходится ждать и как-то не эстетично получается, когда вот уже видна загрузка новой страницы, а дополнительный фрейм содержит старую менюшку..
Во-вторых, очень неприятно, что история посещения содержит в два раза больше элементов.. То есть чтобы попасть на прошлую страницу нужно два раза щелкнуть по кнопке "Назад" (один раз для обновления навигатора, один раз для основного содержимого). Это очень-очень неудобно..

Если для решения этой проблемы нужен только JS, то можете перемещать эту тему туда.. user posted image
Просто я подумал, что может вдруг придется и серверную часть затронуть.. Да и куски PHP-кода здесь присутствуют..

Автор: Vitalik 4.8.2007, 20:22
Гм.. Неужели ни у кого никогда не возникало подобных проблем?.. user posted image

Может быть все-таки мне стоит создать пару конкрентых вопросов в форуме по JS, может можно будет обойтись JS-шными "заплатками" к существующему методу?..

Автор: Oflashp 4.8.2007, 20:54
Ajax в руки, фреймы в жопу и поехали.
Или юзай плавающие фреймы
Или disable:none|block

Автор: Vitalik 4.8.2007, 21:07
Oflashp, спасибо за ответ smile

Дело в том, что нужно, чтобы основное содержимое скролилось, в то время как менюшка оставалась на месте. Это обязательное условие.
Поэтому, наверное, единственным альтернативным вариантом будет плавающий фрейм. Но есть ли какой-то принципиальный выигрыш от этого? Чем с плавающим фреймом проще работать?.. Может я чего-то не понимаю.. user posted image

Добавлено @ 21:08
Гм.. Сейчас вдруг пришла мысль.. Интересно, можно ли поместить содержимое в DIV и там как-то заставить его скролиться? smile

Добавлено через 6 минут и 34 секунды
Вот только жалко будет все обратно переделывать.. Так намучился с этими фреймами.. smile

Автор: Oflashp 5.8.2007, 01:05
Цитата(Vitalik @ 4.8.2007,  21:07)
Oflashp, спасибо за ответ smile

Дело в том, что нужно, чтобы основное содержимое скролилось, в то время как менюшка оставалась на месте. Это обязательное условие.
Поэтому, наверное, единственным альтернативным вариантом будет плавающий фрейм. Но есть ли какой-то принципиальный выигрыш от этого? Чем с плавающим фреймом проще работать?.. Может я чего-то не понимаю.. user posted image

Добавлено @ 21:08
Гм.. Сейчас вдруг пришла мысль.. Интересно, можно ли поместить содержимое в DIV и там как-то заставить его скролиться? smile

Добавлено @ 21:14
Вот только жалко будет все обратно переделывать.. Так намучился с этими фреймами.. smile

Для броузеров кроме IE доступно свойство position:fixed которое держит в заданном месте любой обьект и прокручивает ос страницей.

Добавлено через 2 минуты и 10 секунд
По поводу загрузки, в дополнительном окне пихаешь всё в див, с свойством по умолчанию visibility: none
И в конце окна основного пусть скрипт пишет яву, которая будет менять это свойство...или перегружать фрейм.

Автор: Vitalik 5.8.2007, 14:05
Цитата(Oflashp @  5.8.2007,  00:05 Найти цитируемый пост)
Для броузеров кроме IE доступно свойство position:fixed которое держит в заданном месте любой обьект и прокручивает ос страницей.

То есть такое можно сделать, например, с менюшкой, я правильно понял?
Гм.. То, что IE не поддерживает это очень плохо.. Хотелось бы все-таки, чтобы проект работал и под этим основным (в плане доступности) браузере.. :(

Цитата(Oflashp @  5.8.2007,  00:05 Найти цитируемый пост)
По поводу загрузки, в дополнительном окне пихаешь всё в див, с свойством по умолчанию visibility: none
И в конце окна основного пусть скрипт пишет яву, которая будет менять это свойство...или перегружать фрейм.

Не очень понял.. Это относится к текущему решению с фреймами?
То есть просто при изменении основного содержимого сделать скрипт, который бы обновлял содержимое дополнительного фрейма?
Но ведь сейчас именно так и сделано и это порождает две проблемы, описанные выше (проблема с историей и проблема с задержкой обновления).. :(


P.S.
Я еще не интересовался, но может вы подскажете. Можно ли сделать скролируемый DIV и как это лучше сделать. DIV с полосой прокрутки, при чем DIV на всю оставшуюся часть страницы.. Возможно?

Автор: Vitalik 5.8.2007, 14:39
Выяснил, что можно сделать скролируемый DIV так:
Код

<div style='overflow: scroll; width: 800; height: 100%'>
... очень много текста ...
</div>

Таким образом поместив его справа от менюшки можно добиться в точности такого же эффекта, как и с помощью фреймов.. smile
Эх, как жаль, что я сразу до этого не догадался.. Придется теперь "откатываться" назад.. smile

<оффтопик>
P.S. Есть ли здесь на форуме самый обычный грустный смайл?.. Не сердитый анимационный, который сейчас под "sad", а тот что был давным давно под ":(". Или хотя бы аналогичный по смыслу. А то очень не хватает иногда..
</оффтопик>

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