Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Вёрстка веб-сайтов > Проблема с фреймами.


Автор: Sergey N. Bocharov 27.9.2004, 14:10
Уважаемые господа и дамы, не могу понять в чем проблема ...?

Есть сайт - http://www.nikart.ru/index.htm - главная страница (index.htm) содержит следующую разметку (лишнее не копировал):

<html>
<head>
<frameset rows="177,*" frameborder="0" framespacing="0" border="0">
<frame name="mn" src="menu.htm" marginheight="0" maginwidth="0" scrolling="yes" noresize>
<frame name="inf" src="news.php" marginheight="0" maginwidth="0" scrolling="yes">
</frameset><noframes></noframes>
</head>
</html>


Вопрос состоит в следющем -> если в поисковую машину Rambler ввести слово - НикАрт - и по результатам поиска выбрать вторую ссылку:

(Продюсерский центр "НикАрт" - О КОМПАНИИ "НикАрт" (дата образования, основная деятельность, репертуар)
© НикАрт реклама Производитель кофе, из лучших сортов (качество с 1876 года) © НикАрт
22.09.2004 - 12 Kb - http://www.nikart.ru/company.php - Восстановить текст - Найти похожие
www.nikart.ru (всего 21))


то в результате открывается на ПОЛНЫЙ экран ТОЛЬКО нижний фрейм.

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

С уважением,
Sergey N. Bocharov

Автор: GoodBoy 27.9.2004, 14:39
Если не ошибаюсь, то так:
Код
<script>
if (self.top == self) location.replace("нужный_урл");
</script>

размести это в страницах, которые должны грузиться в фреймы.

Автор: Sergey N. Bocharov 27.9.2004, 15:10
Уважаемый GoodBoy.

Ваш совет не решил проблему, т.к. я разместил Ваш код на странице http://www.nikart.ru/company.php , в результате чего, теперь при загрузке этой страницы, появляется не нижний фрейм (как раньше это было), а ВЕРХНИЙ (меню) и ПРИ ЭТОМ пропадает НИЖНИЙ фрейм...

Мне надо, чтобы не только ОДИН фрейм отображался (верхний или нижний), а сразу ОБА, т.к. если бы зайти на сайт со страницы http://www.nikart.ru/index.htm

С уважением,
Sergey N. Bocharov

Автор: Maveric 27.9.2004, 15:48
Уважаемый, Sergey N. Bocharov.

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

З.Ы.
Кстати о фреймах написано немало статей. Большенство из которых сводятся к тому, что если не умешь работать с фреймами. Жделай по другому.

Автор: Aliance 27.9.2004, 16:15
Попробуй так:
Код

// НЕ работает в NN
if (top.location.href == self.location.href) {
   top.location.href = "http://www.nikart.ru/index.htm";
}


Можно еще использовать метод location.search(); и location.replace();, для востановления адреса, вида http://www.nikart.ru/index.htm?bla-bla...

Будут проблемы - обращайся!

Автор: Sergey N. Bocharov 27.9.2004, 16:25
Уважаемый Maveric, спасибо за разъяснение совета GoodBoy - я, но ...

1). Согласен, с фреймами опыта работы не имею - столкнулся в первый раз.
2). Сделать по-другому не могу, т.к. это не от меня зависит.

Теперь, после вашего дополнения (Maveric), указываю страницу с фреймами, ->

<script>
if (self.top == self) location.replace("index.htm");
</script>

теперь грузится ОБА фрейма, но вот в чем БЕДА, если человек в поисковой системе по запросу нашел всю туже страницу http://www.nikart.ru/company.php, а я прописал в javascript коде ссылку на страницу с фреймами (index.htm -- пример выше), то этот ЧЕЛОВЕК попадет не на страницу О КОМПАНИИ, а на страницу ПОСЛЕДНИЕ НОВОСТИ...

(-> и так всегда, если найдет другую страницу, к примеру http://www.nikart.ru/actor.php - страница Артисты, то нажав на ссылке по результатам поиска, он опять вновь попадет на страницу ПОСЛЕДНИЕ НОВОСТИ (т.к. в javascript коде указана ссылка на страницу с фреймами index.htm, которая грузит в верхнем фрейме menu.htm, а в нижнем start.php - т.е. СТРАНИЦУ ПОЛСЕДНИЕ НОВОСТИ). :--((((

Что же делать, у меня появилось пару идей:
1). Можно попробовать сделать копии страниц с фреймами, в которых будет верхний фрейм menu.htm, а нижний фрейм actor.php или company.php или .. и называть эти сраницы соответственно actor2.php, company2.php и делать ссылки в коде JavaScript на страницы actor2.php, company2.php - но это же просто маразм ...
2). Возможно ли как-нибудь получить ссылку, по которой человек попал на сайт?. Тогда можно было бы всегда делать ссылку в коде JavaScript на index.htm, а подгружать во второй фрейм ту ссылку, по которой человек зашел на сайт...

Извиняюсь за ошибки и семантику... спишу.

Автор: GoodBoy 27.9.2004, 16:47
Sergey N. Bocharov
А зачем вообще тут нужны фреймы????? Для того, чтобы постоянно вверху висела шапка???? Но ведь смотрится-то некрасиво, когда контент вниз прокручиваешь!!!!! Почему-бы не сделать страницу единой???

Автор: Sergey N. Bocharov 27.9.2004, 17:33
Уважаемый GoodBoy.

1). Хм... это конечно выход... вот только одно плохо - когда все на единой странице, тормозит сильно. :--(((.

2). Как я уже писал, это не от меня зависит, таково желания заказчика.

Уважаемые дамы и господа.

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





Автор: Aliance 27.9.2004, 18:11
Sergey N. Bocharov
Чем мой ответ не подходит? qstn.gif

Автор: Sergey N. Bocharov 27.9.2004, 18:18
Уважаемый Aliance, не заметил вашего ответа, сейчас попробую сделать то, что вы посоветовали.

Автор: Maveric 27.9.2004, 18:29
2 Sergey N. Bocharov

Надеюсь ответ Aliance Вам подойдет.

Но я бы всетаки предложил Вам сделать страничку единой. И ничего особо не тормозит при этом, ведь рисунки как правило идут в кэш. А текста там не много.

А для решения проблемы также можете передавать в качестве параметра адрес странички которую нужно открыть в нижнем врейме.

Еще можно на самой индексной страничке просмотреть адрес предыдущего локейшина и его открыть в нижнем фрейме. Тоесть схема такая, человек попал на нижний фрей, он переходит на индекс, индекс смотрит, что зашли, допустим, с эбаута и грузит эбаут в нижнем фрейме... Но вопрос. Стоит ли оно того?
Добавлено @ 18:31
Понимаю что это проблема с заказчиком

Но от себя хочу заметить, что хороших заказчиков почти не бывает. И профессионализм веб-мастера завист в первую очередь в умении объяснить заказчику, что ему надо.

Попытайся убедить клиента, что фреймы ему не нужны. И облегчишь себе жизнь.

Автор: Sergey N. Bocharov 27.9.2004, 18:53
Уважаемый Aliance, Ваш совет такой же (т.е такой же результат) как и совет GoodBoy.

Ух.
Так постараюсь, более детально обяъяснить, что требуется.

Значит так, есть сайт www.nikart.ru/INDEX.HTM - > страница index.htm содержит следующую разметку:

Код
<html>
<head>
<frameset rows="177,*" frameborder="0" framespacing="0" border="0">
<frame name="mn" src="menu.htm" marginheight="0" maginwidth="0" scrolling="yes" noresize>
<frame name="inf" src="news.php" marginheight="0" maginwidth="0" scrolling="yes">
</frameset><noframes></noframes>
</head>
</html>


Вопрос в следующем, возможно ли узнать с помощью JavaScript или PHP с какой страницы пришел пользователь НА САЙТ. -> далее такая у меня мысля, если узнать откуда пользователь пришел, то можно проанализировать url адрес, и пользователя отослать на нужную страницу на www.nikart.ru

Примерно так -> пришел пользователь с Rambler - а, и нажал на ссылку www.nikart.ru/company.php - ему отобразится страница с ОДНИМ нижним фреймом, (как будто её открыли используя target=_blank)... теперь используя Ваши советы, вставляем в эту страницу (company.php) JavaScript код, что-нибудь типа

Код
if (top.location.href == self.location.href) {
  top.location.href = "http://www.nikart.ru/index.htm";
}


в результате чего человек попадает НА СТРАНИЦУ, В КОТОРОЙ ОТОБРАЖАЕТСЯ ОБА ФРЕЙМА, но ОН ХОТЕЛ ЗАЙТИ НА СТРАНИЦУ О КОМПАНИИ (company.php), а попал на страницу INDEX.HTM, которая по умолчанию грузит во втором фрейме NEWS.PHP (а не COMPANY.PHP
)! (Фу...)

Так вот, если бы знать url адрес, откуда пользователь пришел, то можно проанализировать что идем после домена www.nikart.ru следует --- к примеру company.php и загрузить страницу index.htm, в которой ВО ВТОРОМ ФРЕЙМЕ БУДЕТ ГРУЗИТСЯ НЕ NEWS.PHP, а COMPANY.PHP
, т.е. INDEX.HTM выглядит теперь так должно

Код
<html>
<head>
<frameset rows="177,*" frameborder="0" framespacing="0" border="0">
<frame name="mn" src="menu.htm" marginheight="0" maginwidth="0" scrolling="yes" noresize>
<frame name="inf" src="company.php" marginheight="0" maginwidth="0" scrolling="yes">
</frameset><noframes></noframes>
</head>
</html>


(src во втором фрейме поменялся на company.php)

Уважаемые дамы и господа, подскажите, что же делать? (горю, завтра этот заказ сдавать, а блин фреймы огрызаются эх...)

Добавлено @ 18:58
Вот, вот Maveric -- ЭТО ТО ЧТО НУЖНО, НО КАК это РЕАЛИЗОВАТЬ, т.к. в JavaScript - е я не очень силен, если бы в PHP, то это другое дело.

От себя, к сожалению, не я с заказчиком разговариваю, мое дело сделать сайт.

Автор: Aliance 27.9.2004, 19:22
Цитата(Sergey @ 27.9.2004, 18:53)
Вопрос в следующем, возможно ли узнать с помощью JavaScript или PHP

Про php - это в другой раздел. Узнать можно. Я могу написать код библиотеки - она гарантированна даст тебе нужный результат.
Код

// Если среди пользователей будут пользователи, используюшие NN4
var isNav4 = (navigator.appName == "Netscape" && parseInt(navigator.appVersion) == 4);
if (top.location.href == self.location.href) {
   if (isNav4) {
       if (window.innerWidth != 0) {
           top.location.href = "http://www.nikart.ru/index.htm";
       }
   } else {
       top.location.href = "http://www.nikart.ru/index.htm";
   }
}

// Она же - в более усовершенствованном виде!!!
var isNav4 = (navigator.appName == "Netscape" && parseInt(navigator.appVersion) == 4);
if (parent == window) {
   // Ничего не делаем, если NN4 печатает фрейм
   if (!isNav4 || (isNav4 && window.innerWidth != 0)) {
       if (location.replace) {
          // Используем replace() для стирания страницы из журнала
          // Это нужно, чтобы пользователь, нажавший кнопку "Назад"
          //не попал в бесконечный цикл
          location.replace("http://www.nikart.ru/index.htm?content=" + escape(location.href));
       } else {
          location.href = "http://www.nikart.ru/index.htm?content=" + escape(location.href);
       }
   }
}


// "Вытягиваем" из строки поиска свойства и параметры...
function getSearchData() {
   var results = new Object();
   if (location.search.substr) {
       var input = unescape(location.search.substr(1));
       if (input) {
           var srchArray = input.split("&");
           var tempArray = new Array();
           for (var i = 0; i < srchArray.length; i++) {
               tempArray = srchArray[i].split("=");
               results[tempArray[0]] = tempArray[1];
           }
       }
   }
   return results;
}

// Устанавливаем в обработчик событий у элемента frameset
// onload="loadFrame()"
function loadFrame() {
   if (location.search) {
       var srchArray = getSearchData();
       if (srchArray["content"]) {
           self.content.location.href = srchArray["content"];
       }
   }
}

Автор: Alex Suslov 27.9.2004, 19:23
Кстати, народ, это верстка, а не дизайн! Модераторы, приучайте людей различать эти понятия! exclamation.gif

Автор: Aliance 27.9.2004, 19:23
Небольшая проблематичность заключается в особенности NN4, связанной с печатыванием нуль-фрейма, но это решаемо wink.gif
Удачи. Буду вопросы - задавайте. Функция должна работать!

Автор: Sergey N. Bocharov 27.9.2004, 19:38
Одно скажу Aliance -- я пошел, за справочником по JavaScript.

Автор: Sergey N. Bocharov 27.9.2004, 20:11
Уважаемый Aliance, все то же :--((((

Значит так. первую часть кода

Код
var isNav4 = (navigator.appName == "Netscape" && parseInt(navigator.appVersion) == 4);
if (parent == window) {
  // Ничего не делаем, если NN4 печатает фрейм
  if (!isNav4 || (isNav4 && window.innerWidth != 0)) {
      if (location.replace) {
         location.replace("http://www.nikart.ru/index.htm?content=" + escape(location.href));
      } else {
         location.href = "http://www.nikart.ru/index.htm?content=" + escape(location.href);
      }
  }
}


я вставил на страницу http://www.nikart.ru/actor.php

остальной код я вставил в страницу index.htm и вставил обработчик на frameset ...

и что же... да все таже фигня .... зайдя[s] на страницу http://www.nikart.ru/actor.php идет пересылка на http://www.nikart.ru/index.htm?content=http%3A//www.nikart.ru/actor.php при этом открывается ОБА фрейма, но ОПЯТЬ все то же - НЕ ТА СТРАНИЦА ВО ВТОРОМ ФРЕЙМЕ... надо чтобы открывалась actor.php во ВТОРОМ ФРЕЙМЕ...

Что же делать?

Автор: Aliance 27.9.2004, 20:35
Sergey N. Bocharov
withstupid.gif

Если набор фреймов состоит из одних и тех же док-тов, для восстановления структуры фреймов можно использовать код (первую его секцию), который следует включить в начало каждого документа во фрейме. Имеется обход вышеописанной ошибки в NN4
Код

// Если среди пользователей будут пользователи, используюшие NN4
var isNav4 = (navigator.appName == "Netscape" && parseInt(navigator.appVersion) == 4);
if (top.location.href == self.location.href) {
  if (isNav4) {
      if (window.innerWidth != 0) {
          top.location.href = "http://www.nikart.ru/index.htm";
      }
  } else {
      top.location.href = "http://www.nikart.ru/index.htm";
  }
}




Если среди ожидаемый посетителей нет пользователей NN4, то код можно сократить до вида:
Код

// НЕ работает в NN
if (top.location.href == self.location.href) {
  top.location.href = "http://www.nikart.ru/index.htm";
}


Последующие коды используются для более гибкого набора фрейма, когда содержимое фреймов может меняться (генерированным способом). В твоем случаи их использование не обязательно!

Что тебе надо:
функцию
Код

// Если среди пользователей будут пользователи, используюшие NN4
var isNav4 = (navigator.appName == "Netscape" && parseInt(navigator.appVersion) == 4);
if (top.location.href == self.location.href) {
  if (isNav4) {
      if (window.innerWidth != 0) {
          top.location.href = "http://www.nikart.ru/index.htm";
      }
  } else {
      top.location.href = "http://www.nikart.ru/index.htm";
  }
}

включить во все страницы, входящие в состав фреймов, тоесть, в твоем случаи, все, кроме index.html. Все прекрасно будет работать, даже в NN4 не будет никаких ошибок!!!

Что еще не ясно? Не стесняйся, форум создан для вопросов...

Надеюсь заработает, Илья.
Добавлено @ 20:37
И еще - естественно, функции, которые я тебе даю тебе нужно переделать под свой сайт!

ЗЫ: поставь в верхнем фрейме noscroll - иначе некрасиво

Автор: Sergey N. Bocharov 27.9.2004, 20:51
Илья (Aliance), огромное тебе спасибо за попытку обяъснить, но ведать мне не суждено понять, как сделать так чтобы ЗАРАБОТАЛО.. туповат ведать .. :--((( НУ грузится всегда INDEX.HTM, а внутри этой страницы ... верхний фрейм грузит menu.htm, а нижний фрейм грузит start.php - и это происходит, а мне надо чтобы start.php заменялось, в зависимости от куда пришел пользователью.!


Я вам повысил репутацию... спасибо за старания... Блин... вот даже репутацию не могу Вам повысить, дескать не хватает мне кол-ва сообщений (не менее ста) :--(((...

Блин, придется сделать без фреймов... затра ожидаю хорошего про.... дона... блин..


Добавлено @ 20:54
noscroll убрать нельзя... так выравнивание таблиц стоит по середине... если убрать noscroll, то верхний - фрейм таблица ... сместятся.. и будет ОЧЕНЬ плохо выглядеть

Автор: Aliance 27.9.2004, 21:21
Цитата(Sergey @ 27.9.2004, 20:51)
ведать мне не суждено понять

Нужно не сдаваться...

Попробуй так: оберни все эти функции в 1 функцию (к примеру myFunction2), и пропиши в индексовой странице следующее:
Код

myFunction() {
  if (myFunction2) {
     window.frames["inf"].location.href = self.location.href
}

Далее <frameset onload="myFunction();" ...>
Не уверен за правильность кода smile.gif

Цитата(Sergey @ 27.9.2004, 20:51)
даже репутацию не могу Вам повысить

По твоей просьбе это могут сделать модераторы

Про noscroll не подумал...
Хотя я могу решить эту проблемму с помощью JS...

Автор: Sergey N. Bocharov 27.9.2004, 22:44
Илья, замечательно конечно... но сдаться придется.... уже почти передел без фреймов.

Спасибо ещё раз.
Счастливо. adv/76.gif

Автор: GoodBoy 28.9.2004, 11:30
Sergey N. Bocharov
Значится так! Если на твоём хостинге есть поддержка SSI, то делаешь так:

index.htm:
Код
<html>
<head>
<frameset rows="177,*" frameborder="0" framespacing="0" border="0">
<frame name="mn" src="menu.htm" marginheight="0" maginwidth="0" scrolling="yes" noresize>
<frame name="inf" src="<!--#if expr="$QUERY_STRING=/\.php$/" --><!--#echo var="QUERY_STRING" --><!--#else -->news.php<!--#endif -->" marginheight="0" maginwidth="0" scrolling="yes">
</frameset><noframes></noframes>
</head>
</html>


далее в каждом файле, который должен загружаться в нижний фрейм прописываешь следующее:

Код
<script>
if (self.top == self) location.replace("index.html?имя_самого_файла");
</script>

т. е. в company.php пишешь
Код
<script>
if (self.top == self) location.replace("index.html?company.php");
</script>


в baby_pivo.php пишешь
Код
<script>
if (self.top == self) location.replace("index.html?baby_pivo.php");
</script>


и так далее!!!

Что это даст. При вызове файла index.htm напрямую будет загружен файл news.php, а при вызове файла company.php произойдет редирект на index.htm с параметром company.php и этот второй файл будет загружен в нижний фрейм!!!
:-))))))))))



Цитата(Sergey @ 27.9.2004, 21:51)
Блин... вот даже репутацию не могу Вам повысить, дескать не хватает мне кол-ва сообщений (не менее ста) :--(((...

Обратись к тем, у кого более 100 сообщений и, я думаю, тебе не откажут!!! :-)))))

Автор: Ignat 28.9.2004, 13:37
Offtop (после прочтения можно удалить):

- Сэр!
- Сэр!
- В сад, сэр!

Блин, читал тред и смеялся, прямо Смольное училище smile.gif

Автор: Sergey N. Bocharov 29.9.2004, 06:26
Уважаемые господа: Илья, GoodBoy - огромное СПАСИБО за терпение в объяснение и дельные советы, все же ЭТО заработало (последний совет GoodBoy - я).

Отдельное спасибо Ignat - у, вообще - то я написал, что в JavaScript очень плохо понимаю (если Вы внимательно читали все сообщения, то должны были это заметить, поэтому мне кажется не актуальным последнее замечание - hmmm.gif)

Еще раз спасибо за помощь.

Дополнение:
Для GoodBoy - я, в страницы надо вставлять не
Код
<script>
if (self.top == self) location.replace("index.html?baby_pivo.php");
</script>

а
Код
<script>
if (self.top == self) location.replace("index.htm?baby_pivo.php");
</script>


(index.htm)
wink.gif

Автор: GoodBoy 29.9.2004, 10:28
Цитата(Sergey @ 29.9.2004, 07:26)
Дополнение:
Для GoodBoy - я, в страницы надо вставлять не
Код
<script>
if (self.top == self) location.replace("index.html?baby_pivo.php");
</script>

а
Код
<script>
if (self.top == self) location.replace("index.htm?baby_pivo.php");
</script>


(index.htm)
wink.gif

Ну это уж зависит от того, кfкjй индексный файл используется на конкретном хосте!!! У тебя - index.htm у меня - index.html wink.gif

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