Учебное пособие по CGI-программированию
Страница 16. Взаимодействие с браузером


Взаимодействие с браузером

Теперь поговорим о разных браузерах вы знаете что браузеры бывают разные,разных версий на разных платформах, поддерживают и не разные тэги и глюки у них тоже разные.....;((( .
Это могло попортить много нервов WEB-дизайнерам и конечно же нам ,CGI-програмистам. Профессионально написаный сайт от просто хорошего отличается тем что хорошо выглядит Не только на экране того браузера,которым пользуется сам его автор,а на других тоже.
Если вы используете JavaScript для своих страничек,то вы уже наверно использовали (или хотя бы вам в голову приходила мысль использовать)свойства navigator.AppName navigator.AppCodeName navigator.appVersion navigator.userAgent:

<SCRIPT language="JavaScript"> 
if(navigator.AppName=="Netscape"){
/*Сделать чо-нибудь специфичное для Netscape*/
} else if(navigator.AppName=="Microsoft Internet Explorer"){
/*Сделать чо-нибудь специфичное для Explorer*/
} else
{ /*Не делаем специфичных вещей-хрен его знает с каким браузером мы имеем дело*/ }
</SCRIPT> или <SCRIPT language="JavaScript">
if((navigator.AppName=="Netscape")&&(parseFloat(navigator.appVersion)<3.0)){
document.writeln("Пользуетесь слишком старым браузером");
} </SCRIPT>
Ну не волнуйтесь вы так ,мы CGI-программисты не в самых худших условиях на этот счет. Вспомните о том что браузер сам при запросе посылает вам данные о себе и о своей версии. И делает он это для того,чтобы эту информацию можно было учесть.
В запросе он указывает User-Agent: которое и попадает на сервере в переменную среды HTTP_USER_AGENT ,которую и можно использовать.
Например если в ней содержится Mozilla/3.01Gold (Win95;I) то значит вы имеете дело с Netscape (Mozilla-кодовое название Netscape Navigator'а),версии 3.01Gold и далее после имени и версии может следовать необязательная информация ,например как в приведеном примере о платформе Win95 и о том является ли версия U -для США (USA) или I -международной(International). Напомню,что такая информация необязательна.(То есть если браузер послал информацию User-Agent: то гарантировано расчитывать вы можете только на Название/Версия).
Ну вот я слишком много развел демагогии,пора переходить к практическим примерам.
Допустим ваш скрипт генерирует какие-то тэги,которые слишком старые браузеры не поддерживают,причем без них не обойдешся,они составляют всю 'изюминку' сайта.
#!/usr/bin/perl #oldbrowser.cgi print "Content-Type: text/html\n\n"; 
if(defined ($ENV{'HTTP_USER_AGENT'})){
$browser=$ENV{'HTTP_USER_AGENT'};
($vers)=($browser=~/\/(\d+\.\d+)/);
if(($browser=~/mozilla/i)&&($vers<=2.0)){
print "<HTML><HEAD><TITLE>Too old!</TITLE></HEAD>";
print "<BODY bgcolor=\"red\" text=\"black\">";
print "<CENTER><H1>Ваш Netscape Слишком старый для этого сайта";
print "(старость не радость)</H1></CENTER>";
print "</BODY></HTML>";
exit;
}
if(($browser=~/msie/i)&&($vers<=3.0)){
print "<HTML><HEAD><TITLE>Too old!</TITLE></HEAD>";
print "<BODY bgcolor=\"red\" text=\"black\">";
print "<CENTER><H1>Ваш Explorer устарел";
print "(не пора ли сделать апгрейт хотя бы до 4.0 версии)</H1></CENTER>";
print "</BODY></HTML>"; exit; } } print "<HTML><HEAD>.........";
Ну уже почувствовали,насколько это здорово.А вот еще примерчик.Это из разряда того, что тэги бывают разные.Например в Explorer есть тэг BGSOUND предназначеный для проигрывания музыки на страничке.(В Netscape этого тега нет,и поэтому для втыкания музыки приходится использовать подключаемые модули plugin).Мутится с этими Плугинами Вам в облом,а хочется побаловать человека хорошей музыкой,если браузер позволяет.
 ... ... if($ENV{'HTTP_USER_AGENT'}=~/msie/i){
print "<BGSOUND xsrc=\"jmj00.mid\">";
} elsif($ENV{'HTTP_USER_AGENT'}=~/mozilla/i){
#Оставлю сдесь коментарий,что воткну что-нибудь типа музыки,для Netscap'а ,
#Когда мне не будет так в облом это делать....... }
Ну вот вы уже можете управлять этим процессом.Только не забывайте,что если вы не получили информацию о клиенте(так может быть,если например ваш скрипт вызвал какая-нибудь поисковая машина) то не в этом случае не надо делать никаких предположений,а просто пусть ваш скрипт продолжает делать то что должен был делать.

Как всегда Примерчик на последок.Этот примерчик позволит выбирать из списка файлов. и загружать что пользователь хочет.
#!/usr/bin/perl #download.cgi sub urldecode{ 
local($val)=@_;
$val=~s/\+/ /g;
$val=~s/%([0-9A-H]{})/pack('C',hex($1))/ge; return $val;
}
@Filelist=qw(index.html readme.txt jmj00.mid gunshot.wav foto.gif);
@Sel_list=(); if($ENV{'REQUEST_METHOD'} eq 'GET'){$query=$ENV{'QUERY_STRING'};
} elsif($ENV{'REQUEST_METHOD'} eq 'POST'){
sysread(STDIN,$query,$ENV{'CONTENT_LENGTH'});
}
if($query eq ''){
#Если никаких данных не подано на обработку,то сгенерируем форму,
#которую и предложим заполнить пользователю.
print "Content-Type: text/html\n\n";
print "<HTML><HEAD><TITLE>File Downloading</TITLE></HEAD>";
print "<BODY bgcolor=\"white\">";
print "Выберите файлы которые вы хотите загрузить:<BR>";
print "<FORM METHOD=\"POST\">";
print "<SELECT NAME=\"file\" size=4 multiple>";
foreach(@Filelist){
print "<OPTION value=\"$_\">$_";
}
print "</SELECT><BR>";
print "<INPUT TYPE=\"Submit\" value=\"Download!\">";
print "</FORM>";
print "</BODY></HTML>"
}
else{
@formfields=split /&/,$query;
foreach(@formfields){ if(/^file=(.*)/){push(@Sel_list,urldecode($1));
}
}
unless(@Sel_list){
print "Content-Type: text/html\n\n";
print "<HTML><BODY><CENTER><H1>Вы должны выбрать что-то из списка";
print "</H1></CENTER></BODY></HTML>";
}
else{
print "Content-Type: multipart/mixed;
boundary=\"bhy3e23r4t34tnehtpo7678nneu4232y213vdg\"\n\n";
print "--bhy3e23r4t34tnehtpo7678nneu4232y213vdg\n";
foreach(@Sel_list){
print "Content-Type: application/x-qwerty;
name=\"$_\"\n\n"; open F,"$_";
print <F>;
close F;
print "\n--bhy3e23r4t34tnehtpo7678nneu4232y213vdg\n";
}
print "Content-Type: text/html\n\n";
print "<HTML><H1>Thats all folks!</H1></HTML>";
print "\n--bhy3e23r4t34tnehtpo7678nneu4232y213vdg--\n";
}
}

 
« Предыдущая статья