faqs.org.ru

 Главная > Программирование > Web-программирование >

FAQ по HTML для чайников

Секция 3 из 3 - Предыдущая - Следующая
Все секции - 1 - 2 - 3

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

JavaScript был разработан Netscape. Он "родственник" Java, только содержит
меньший и более простой, немного измененный, набор команд. Структура
JavaScript и его синтаксис подобен Java, но JavaScript функционален только
когда включен как часть HTML страницы (на это указывает и его название
"ЯваСценарий"). Вы не можете разрабатывать автономные прикладные программы на
JavaScript. Он может использоваться а) в виде сценария внутри HTML в броузере,
совместимом с Netscape 2.0, и б) как сценарий, исполняемый поддерживающим
такие сценарии сервером.

JScript был "разработан" Microsoft. Функционально это тоже самое, что и
JavaScript. Названия разные из-за того, что JavaScript был уже запатентован
Netscape к тому времени, как Microsoft решила встроить в свой броузер
поддержку JavaScript. Вторая причина в том, что JScript не полностью следует
спецификации Netscape, и эти отличия дают немало радостных минут тем, кто
заботится о поддержке всех клиентских агентов.

Как дьявол - обезьяна Бога, так и JScript - обезьяна JavaScript'а.

>7.2. Чтобы при наведении мышки на ссылку выдавался
>мой текст, а не "http://www.name.ru/..."?

<a href="http://rhc.msk.ru"
   onMouseOver="window.status='мышка на ссылке';return true;"
   onMouseOut="window.status='мышка не на ссылке';return true;">
ссылка</a>.

>7.3. Как сделать кнопку "Back"?

<a href="javascript:history.back()">Назад</a>

>7.4. Как определить, что юзер открыл страницу не в кадре, и перевести
>его в кадр?

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

Пусть http://www.myserver.com/dir/frameset.html - это фреймсет, в котором есть
два фрейма: menu.html - меню, main - рабочее окно для main.html, 1.html,
2.html и т.д.

В случае, если фреймсет и вызванная страничка лежат на одном сервере, то в
<head> нужно вставить такой скрипт:

<script language="JavaScript">
<!--
if (parent) if (parent.pathname!='/dir/frameset.html') {
   var framesetURL='/dir/frameset.html?main='+escape(self.location.href)
   if (history) {
//проверяем, у нас JavaScript 1.1 или 1.0? В 1.0 объекта history нет,
// и в скобках будет undefuned, что для if все равно, что false.
     self.location.replace(framesetURL)
//этот метод из JS1.1 грамотнее, чем простой редирект, потому что
//не засоряет history.
   } else self.location=framesetURL;
}
//-->
</script>

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

<script language="JavaScript">
<!--
if (parent) {
  var parentURL='';
  with (parent.location) parentURL=hostname+pathname;
  if (parentURL!='www.myserver.com/dir/frameset.html') {
  var framesetURL='http://www.myserver.com/dir/frameset.html?main='+
    escape(self.location.href)
  if (history) {
    self.location.replace(framesetURL)
  } else self.location=framesetURL;
}
//-->
</script>

Если у вас на сервере работает CGI, PHP, или ASP, то фреймсет должен
обработать пришедший параметр $main и сформировать фреймсет.

Если это невозможно (страничка лежит на халявном серваке), то во frameset.html
в <head> нужно поставить:

<script language="JavaScript">
<!--
function loadMain() {
var mainPos=location.search.indexOf('main=')+5;
if (mainPos>4) {
  var mainURL=location.search.substring(mainPos,location.search.length);
  if (mainURL.indexOf('&')>-1) {
    mainURL=mainURL.substring(0,mainURL.indexOf('&'))
  }
  mainURL=unescape(mainURL);
  if (history) {
    self.frames.main.location.replace(mainURL)
  } else self.frames.main.location=mainURL
}
}
//-->
</script>

А в тег <frameset> нужно прописать параметр:
onLoad="loadMain();"

Тогда при внешней ссылке на 1.html или наборе в строке браузера
http://www.myserver.com/dir/1.html откроется фреймсет, и в нужный фрейм
автоматически загрузится 1.html.

>7.5. Как на JS при событии в одном из кадров поменять заголовок всего
>фреймсета? Хотелось бы, чтобы при смене страниц в заголовке окна
>броузера кроме названия сайта отображалось еще и наименование
>текущего раздела.

<head>
<script language="javascript">
<!--
function newTitle() {
top.document.title="НОВЫЙ ЗАГОЛОВОК";
}
-->
</script>
</head>

<body ONLOAD="newTitle();">

К счастью, в правильных браузерах это не работает. Следуйте более стандартным
решениям и перегружайте фреймсет.

>7.6. Как вставить музыку в html файл?

<script language="javascript">
<!--
  var Brwsr = window.navigator.appName
  if (Brwsr == "Microsoft Internet Explorer")
       { Cmd = "<BGSOUND SRC=music.mid>" }
  else { Cmd = "<EMBED SRC=music.mid HIDDEN=true>" }
  document.write( Cmd )
//-->
</script>

>7.7. Как определить разрешение у посетителя, и в зависимости от
>разрешения посылать на разные страницы?

Как понятно из нижеприведенного сценария, это полумеры. Если вы понимаете, что
такое HTML, то вы понимаете, что у вашего пользователя нет никакого экрана и
нет никакого разрешения.

<script language="javascript">
<!--
  var height=0;
  var width=0;

  if (self.screen)       // for NN4 and IE4
    {
     width = screen.width
     height = screen.height
    }
  else if (self.java)    // for NN3 with enabled Java
    {
     var jkit = java.awt.Toolkit.getDefaultToolkit();
     var scrsize = jkit.getScreenSize();
     width = scrsize.width;
     height = scrsize.height;
    }

  if (width == 800 && height == 600)
    { location.href = "800x600.htm" }
  else if (width == 640 && height == 480)
    { location.href = "640x480.htm" }
  else
    { location.href = "unknown.htm" }
//-->
</script>

>7.8. Как вставить дату последнего обновления?

<script language="JavaScript"><!--
document.write(document.lastModified)
--></script>

>7.9. Как сделать, чтобы при наведении мышки на картинку-ссылку, картинка
>изменилась?

<head>
<script language="javascript">
<!--
function ChangeImg() {
 if(document.images) {
  eval("document."+ChangeImg.arguments[0]+
  ".src=('"+ChangeImg.arguments[1]+"')");
 }
}

function preload() {
  if (document.images) {
    var imgsrc = preload.arguments;
    arr=new Array(imgsrc.length);
    for (var j=0; j<imgsrc.length; j++) {
      arr[j] = new Image;
      arr[j].src = imgsrc[j];
    }
  }
}
//-->
</script>
</head>

<body onLoad="preload('over1.gif', 'over2.gif', 'overN.gif')">

где overN.gif - картинка, которая должна показываться при наведении мышки.
onLoad нужен для того, чтобы картинки подгружались сразу, а не в то время,
когда навели мышку, так как на слабом канале эффекта сразу можно не заметить.

<a href="1.htm" onMouseOver="ChangeImg('image1','over1.gif')"
                onMouseOut="ChangeImg('image1','out1.gif')"><img
src="out1.gif" name="image1"></a>

<a href="2.htm" onMouseOver="ChangeImg('image2','over2.gif')"
                onMouseOut="ChangeImg('image2','out2.gif')"><img
src="out2.gif" name="image2"></a>

<a href="N.htm" onMouseOver="ChangeImg('imageN','overN.gif')"
                onMouseOut="ChangeImg('imageN','outN.gif')"><img
src="outN.gif" name="imageN"></a>

в <img> "name" нужно для того, чтобы JS знал, какой картинке соответствует
каждая ссылка.

>7.10. Как открыть по ссылке маленькое окошко нужного размера
>без панели инструментов, строки состояния и т.д.?

Категорически не рекомендуется конструкция вида
<a href="javascript:window.open()">

Правильный код:
<a href="page.html" target="_blank"
onclick="window.open(this.href,this.target,'width=XXX,height=YYY,'+
'location=no,toolbar=no,menubar=no,status=no');return false;">

Этот код обеспечит корректное открытие нового окна с нужным URL даже при
отключенных скриптах.

>7.11. Как сделать фотогалерею: чтобы в документе были маленькие картинки,
>а при нажатии на них открывались окошки с увеличенными картинками?

<html>
<head>
<title>Фотогалерея</title>
<script language="JavaScript">
<!--
function imgOpen(imgURL,imgWidth,imgHeight,Title) {
var imgWndw=window.open('','_blank','width='+imgWidth+',height='+
  imgHeight+',toolbar=no,menubar=no,location=no,status=no,'+
  'resizable=yes,scrollbars=no');
var imgTitle=(Title)?Title:imgURL+": "+imgWidth+'x'+imgHeight;
with (imgWndw.document){
  open();
  write('<ht'+'ml><he'+'ad><ti'+'tle>'+imgTitle+'</ti'+'tle>'+
  '</he'+'ad><bo'+'dy leftmargin="0" topmargin="0" '+
  'rightmargin="0" bottommargin="0" marginwidth="0" '+
  'marginheight="0"><img src="'+imgURL+'" width="'+imgWidth+
  '" height="'+imgHeight+'" border="0" alt="'+imgTitle+
  '"></bo'+'dy></ht'+'ml>');
  close();
}
return false
}
//-->
</script>
</head>
<body>
....
<a href="disco.jpg" target="_blank" onClick="return
imgOpen(this.href,400,300,'Я на дискотеке');"><img src="disco_small.gif"
width="80" height="60" alt="Я на дискотеке - 200 Кбайт" border="0"></a>
....
<a href="banja.jpg" target="_blank" onClick="return
imgOpen(this.href,200,300,'Я в бане');"><img src="banja_small.gif" width="40"
height="60" alt="Я в бане - 100 Кбайт" border="0"></a>
....
</body>
</html>

Этот метод грамотно "работает" и при отключении скриптов: открывает просто
новое окно браузера с нужной картинкой.

>7.12. Есть ли в JS функция, которая бы брала сценарий из внешнего файла?
>Как грамотно пользоваться внешними скриптами?
>Почему нельзя использовать внешние скрипты вместо SSI для вывода текста?
Внешние скрипты имеют кучу преимуществ перед внутренними - они
кэшируются в бродилке, позволяют писать библиотеки стандартных функций
для использования на нескольких страничках, не загромождают код HTML.

Но есть у них и недостатки - они плохо поддерживаются старыми
бродилками, кроме того, при вызове функции из внешнего скрипта мы не
можем быть уверены в том, что этот скрипт загрузился - в противном
случае будет выдано сообщение об ошибке. Особенно плачевно
заканчивается использование лентяями внешних скриптов вместо SSI для
вывода информации в документ (document.write).

Поэтому грамотный метод использования внешних скриптов такой.
В <head> документа, выше всех остальных внешних и внутренних скриптов
пишется:

<script language="JavaScript"><!--
var jsLoaded=false;
//--></script>

Внешний скрипт вставляется так:
<script language="JavaScript1.2" src="myscript.js"
type="text/javascript"></script>

Обратите внимание на параметр language - там стоит JavaScript1.2
вместо простого JavaScript для того, чтобы старые бродилки не пытались
загрузить то, что они все равно не поймут.

В файле myscript.js последней строчкой должно стоять:
jsLoaded=true;

Затем при необходимости использования функций из внешнего скрипта мы
поступаем так:

а) В блоке JavaScript:

<script language="JavaScript"><!--
....
// тили-тили
// трали-вали
if (jsLoaded) {
    // это дело мне по силе
    // откажусь теперь едва ли
} else {
    // это мы не проходили
    // это нам не задавали
}
....
//--></script>

б) При вызове функции по событию в теге HTML:
<a href="page.html"
onClick="return (jsLoaded)?externalFunction(...):true;">

>7.13. Почему NN некорректно ведет себя с русской буквой "я" в сценариях?

Теория: в яваскрипте не должно быть свободного знака 0xFF. Поэтому мы берем
знаки, которые могут перекодироваться в 0xFF, и предваряем их обратным слешем.
Если вы программировали на Си, такая запись вам знакома.

Практика:   кодировка      OxFF      во всех кодировках пишем
            1251           "я"       "\я"
            КОИ-8          "Ъ"       "\Ъ"

>7.14. Как убрать рамки вокруг ссылок?

На это явление жалуются только пользователи MSIE. Оно и понятно. Вставьте в
тег ссылки слова onFocus="this.blur()". Все те, кто привык, что курсор не
пропадает с глаз долой, скажут вам много теплых и ласковых слов.

>7.15. Как сделать выпадающее меню ссылок?

<body>
<form action="/cgi-bin/redir.cgi" method="post">
<select name="redirURL"
onChange="location=this.options[this.selectedIndex].value;">
  <option value="http://www.aaa.com/">AAA</option>
  <option value="http://www.bbb.com/">BBB</option>
  <option value="http://www.ccc.com/">CCC</option>
</select>
<noscript><input type="submit" value="Перейти!"></noscript>
</form>
</body>

Для тех, у кого отключены скрипты, создайте CGI для редиректа
(/cgi-bin/redir.cgi), перенаправляющий клиента на нужную страницу.

Секция 3 из 3 - Предыдущая - Следующая

Вернуться в раздел "Web-программирование" - Обсудить эту статью на Форуме
Главная - Поиск по сайту - О проекте - Форум - Обратная связь

© faqs.org.ru