PC Help

 Към заглавната страница на PC HelpТърсене


Софтуер

 

Frames vs. No Frames –
Как да преодолеем проблемите

По отношение на рамките (frames) сред web дизайнерите съществува доста твърдо разделение на “за” и “против”. Всяка от страните има основателни аргументи, и те не са за пренебрегване. Но нека най-напред да кажем какво точно представлява концепцията на тези “рамки” (frames).

Идеята

Когато заредите някоя web страница, имате възможност да разгледате съдържанието й. Това в много случаи предполага превъртане на страницата, тъй като тя съдържа доста информация – твърде много, за да се събере на един екран. Но ако навигацията на сайта, част от който е разглежданата страница, е поместена в началото на всяка такава страница, то вие трябва да се върнете в началото на страницата, за да се прехвърлите в друга част от сайта. Frames концепцията дава възможност на един екран (като части от общата frames страница, която ги извиква) да се поместят произволен брой страници едновременно. Освен тях браузерът ви зарежда и самата frames страница, която служи и за описване на разположението им на екрана. Линковете от една от тези рамки (frames) обикновено се отварят в друга, и точно това е идеята на базирането на навигацията на този принцип – потребителят постоянно има на екрана си навигацията на сайта, и не му се налага да превърта (страницата), докато я достигне. Нещо повече – когато навигацията е изнесена в отделен frame, се намалява обема на страниците със съдържание, следователно те се изтеглят по-бързо.

Проблемите

Дотук всичко беше добре. Но както казахме, има и недостатъци. И те не се крият в съвместимостта с браузерите – процентът на потребителите, ползващи браузери без поддръжка на frames е изключително малък, и е съсредоточен сред слепите потребители (но и те се справят с frames). Основният довод срещу рамките са търсещите машини в Internet. Те индексират всяка страница от сайтовете, и когато някой потребител търси определена информация, му я предоставят. И то във вид на линк към съответната страница, а не към индексната frames страница! С други думи, прекрасно изградената с frames навигация може да бъде напълно безсмислена за посетителите, дошли от търсачките, тъй като те може просто да не разберат, че страницата е част от сайт, притежаващ навигационна система! Останалото от този сайт ще остане невидимо за потребителя, а едва ли искате да стане това.

Стената от проблеми може да се прескочи!

За да решим проблема, първо трябва да си изясним в какво се състои той. Това е зареждането само на страницата, която търсачката намери – без изобщо да се извиква индексната страница. Следователно трябва да направим така, че зареждането на извиканата страница да предизвиква зареждане и на останалите frame-ове, съдържащи навигацията или каквото е във вашия случай.

За целта първо трябва да видим какво съдържа кода на индексната страница. Ето примерен код за страница, изградена от 3 рамки – лява (за навигация), дясна (за съдържание) и горна (за заглавна картинка). Съдържанието на таговете, които в случая не са от значение, затова го пропускаме:


<html>

<head>
<title>Заглавие на страницата, което да се показва в Title лентата на браузера</title>
</head>

<frameset rows="100,*" >
<frame name="banner" target="contents" src="banner.htm">
<frameset cols="150,*">
<frame name="contents" target="main" src="nav.htm">
<frame name="main" target="_self" src="main.htm">
</frameset>

<noframes>
<body>
<p>Тъй като сайтът е изграден с помощта на фреймове, в търсачките ще видите точно този текст. А ако виждате този текст и след като сте отворили сайта, то вашият браузер не поддържа фреймове. Моля, използвайте кой да е утвърден браузер, излязъл след 1995 г. (Internet Explorer, Netscape, Opera, Mozilla и всичко друго, чието име сте чували поне 2 пъти)</p>
</body>
</noframes>

</html>


Разгледайте кода. Описанието на конструкцията на рамките е във <frameset> таговете. Src=”{име на файл}” показва коя страница се извиква като съдържание на съответния frame. Именно с тази страница ще работим.

Това, което трябва да направим, е да накараме съответната страница да провери дали е част от нашата фреймова конструкция, или е извикана сама в браузера. Тази фреймова конструкция се явява “родител” (parent) за разглежданата страница. Да кажем, че индексната фреймова страница е файл с име frames.html. За самата проверка ще използваме JavaScript. Като клиентска технология той е независим от възможностите на сървъра, и поради това може а се ползва във всички страници без ограничения. Възможният проблем в този случай е, че някои потребители изключват JavaScript функциите на браузера си. Те обаче далеч не са много.

И така, за да направим проверката ползваме следния код:


<SCRIPT LANGUAGE="JavaScript">
<!--
function framecheck()
      {var parentframe = 'frames.html';

      if (parent.location.href == self.location.href)
            {var current = window.self.location.pathname;
            window.location.replace (parentframe + '?' + current);
            }
      };
//-->
</SCRIPT>


В тялото (<body>) на самия HTML файл добавяме извикване на тази проверка при зареждане на страницата:

<body onLoad="framecheck()">

Разбира се, кода за проверката винаги може да се измести и във външен .js файл, за да се използва той във всяка страница от сайта (със съответната референция за местоположението му).

Проверката води до зареждане на страницата frames.html, ако страницата със съдържание (в която е вграден скрипта) е била извикана извън фреймовата конструкция. Задачата сега е frames.html да извика цялата фреймова конструкция, като постави проблемната страница на мястото, на което би трябвало да бъде. Ето и кода на frames.html, който прави това:

<HTML>
<HEAD> <TITLE>Parent Frameset</title></HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!-- Hide from non-javascript browsers
document.write('<FRAMESET ROWS="100,*">');
document.write('<FRAME NAME="banner" target="contents" SRC="banner.htm">');
document.write('<frameset cols="150,*">');
document.write(' <FRAME NAME="contents" target="main" SRC="nav.htm">');
document.write('<FRAME SRC="nav.html" NAME="nav">');
document.write('<FRAME NAME="main" target="_self" SRC="' + location.search.substring(1) + '">');
document.write('</FRAMESET>');
//-->
</SCRIPT>
</HTML>

Както забелязвате, скриптът не изписва main.htm като страница, която да бъде поставена на мястото на страницата, извикана от потребителя. Именно това е идеята – JavaScript конструкцията замества името на страницата, и по този начин скриптът работи във всички случаи, без значение какво е името на проблемната страница.

Няколко думи в заключение

Както видяхте, да се предизвика с JavaScript извикване на навигацията от дадена фреймова конструкция не е толкова трудно. Използването на този скрипт обаче дава и допълнителни възможности. Ако ползвате горния (в този случай) frame за заглавна картинка, левия – за меню, а десния за съдържание, можете чрез задаване на target="_parent" за линковете да насочите отварянето на страници със съдържание да замества цялата начална фреймова конструкция, а като спестите JavaScript изписването на горния фрейм за втория индекс (и зададете втора страница с меню – аналогична на първата, но с target="{страницата_със_съдържание}"), можете директно да “изхвърлите” горния frame в случаите, когато ви се налага да пестите екранна площ навсякъде в самия сайт, но желаете да оставите допълнително разкрасена “фасадата”.

Назад


Webmaster