Главная > Программирование > 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-программирование" - Обсудить эту статью на Форуме |
Главная - Поиск по сайту - О проекте - Форум - Обратная связь |