Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Определение типа браузера [обсуждение] (Александр Михалицын)
Author Message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Tue Feb 03, 2009 1:41 pm ()
   Post subject:
Reply with quote


М

Выделено из темы «определение браузера»,
расположенной в форуме Склад готовых решений :: JavaScript (04 Февраля 2009, 19:36).
Back to top
View user's profile Send private message Send e-mail
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Tue Feb 03, 2009 1:41 pm (спустя 1 секунду; написано за 2 минуты)
   Post subject: Определение типа браузера [обсуждение]
Reply with quote

k0rzhik,
ммм. Маленький такой вопрос, почему:
Code (JavaScript): скопировать код в буфер обмена
var info = function(){
   return { ff: s, ie8, <...> };
}
,а не:
Code (JavaScript): скопировать код в буфер обмена
var info = new function(){
   this.ff = s;
   this.ie8 = <...>; etc
}
Это сократит объем вашего кода почти в 2 раза...

Last edited by Александр Михалицын on Thu Sep 30, 2010 6:42 pm; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
k0rzhik
Заглянувший



Joined: 03 Feb 2009
Posts: 4
Карма: 1
   поощрить/наказать


PostPosted: Tue Feb 03, 2009 2:52 pm (спустя 1 час 11 минут; написано за 42 секунды)
   Post subject:
Reply with quote

В оригинальной версии, используемой для моего фреймворка, так и есть.
Сюда выложил с ретурном сугубо для наглядности.
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Wed Feb 04, 2009 11:06 am (спустя 20 часов 13 минут; написано за 2 минуты 26 секунд)
   Post subject:
Reply with quote

k0rzhik,
ясно. И все же лучше именно так (хотябы потому, что тут 25 строк, а у вас 38 :), а ведь сниферы браузеров должны быть компактными ;)):
Code (JavaScript): скопировать код в буфер обмена
var info = new function(ie)
{
   var d = document, w = window, qsel = !!d.querySelectorAll,
   csel = !!d.getElementsByClassName;
   this.ff = !!w.Iterator && !!d.addEventListener && /a/[-1] == 'a';
   this.ff2 = this.ff && (function x(){})[-6] == 'x';
   this.ff3 = csel && this.ff && (function x(){})[-5] == 'x';
   this.ie = (ie && '\v' == 'v');
   this.ie5 = this.ie && ie == 5;
   this.ie6 = this.ie && (ie == 6 || (d.compatMode && d.all && !!d.readyState));
   this.ie7 = this.ie && (ie == 7 && d.documentElement && typeof d.documentElement.style.maxHeight != "undefined");
   this.ie8 = this.ie && (ie == 8 && qsel);
   this.safari = /a/.__proto__ == '//';
   this.chrome = /source/.test((/a/.toString + ''));
   this.opera = (!ie && !!w.opera && w.opera.toString() === "[object Opera]" && /^function \(/.test([].sort));
   var div = d.createElement('div'),
   body = d.body;
   div.innerHTML = '<style>#_t{display:none;}#_t[rel^="D"]{display:block;}</style><span id="_t" rel="Detect"></span>';
   div.style.display = 'none';
   body.appendChild(div);
   var obj = d.getElementById('_t'),
   stat = w.getComputedStyle ? w.getComputedStyle(obj, null).getPropertyValue("display") : obj.currentStyle ? obj.currentStyle.display : null;
   this.css3 = (stat == "block");
   body.removeChild(div);
}(0 /*@cc_on + (@_jscript_version * 10 % 10) @*/);
А после JSMin'a вот:
Code (JavaScript): скопировать код в буфер обмена
var info=new function(ie) {var d=document,w=window,qsel=!!d.querySelectorAll,csel=!!d.getElementsByClassName;this.ff=!!w.Iterator&&!!d.addEventListener&&/a/[-1]=='a';this.ff2=this.ff&&(function x(){})[-6]=='x';this.ff3=csel&&this.ff&&(function x(){})[-5]=='x';this.ie=(ie&&'\v'=='v');this.ie5=this.ie&&ie==5;this.ie6=this.ie&&(ie==6||(d.compatMode&&d.all&&!!d.readyState));this.ie7=this.ie&&(ie==7&&d.documentElement&&typeof d.documentElement.style.maxHeight!="undefined");this.ie8=this.ie&&(ie==8&&qsel);this.safari=/a/.__proto__=='//';this.chrome=/source/.test((/a/.toString+''));this.opera=(!ie&&!!w.opera&&w.opera.toString()==="[object Opera]"&&/^function \(/.test([].sort));var div=d.createElement('div'),body=d.body;div.innerHTML='
'
;div.style.display='none';body.appendChild(div);var obj=d.getElementById('_t'),stat=w.getComputedStyle?w.getComputedStyle(obj,null).getPropertyValue("display"):obj.currentStyle?obj.currentStyle.display:null;this.css3=(stat=="block");body.removeChild(div);}(0 /*@cc_on + (@_jscript_version * 10 % 10) @*/);
И кстати маленький недостаточек:
Code (any language): скопировать код в буфер обмена
{ 'ff': false, 'ff2': false, 'ff3': false, 'ie': 0, 'ie5': 0, 'ie6': 0, 'ie7': 0, 'ie8': 0, 'safari': false, 'chrome': false, 'opera': true, 'css3': true }
Я думаю что все 0 все таки лучше сделать false. ;) (Хотя это не беда, но все же, доведем ваш объект до совершенства. =))

Last edited by Александр Михалицын on Fri Mar 26, 2010 6:28 pm; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Wed Feb 04, 2009 10:31 pm (спустя 11 часов 24 минуты; написано за 1 минуту 33 секунды)
   Post subject:
Reply with quote

Александр Михалицын
Охренеть... Господа, вам чтоли делать нечего...
Code (JavaScript): скопировать код в буфер обмена
var op  = !!window.opera, ie  = document.all && !op;
А определять webkit и mozill'у я вообще не вижу смысла, они итак всё поддерживают :).
Back to top
View user's profile Send private message Send e-mail
Denis Usenko
Участник форума



Joined: 06 Feb 2006
Posts: 54
Карма: 13
   поощрить/наказать


PostPosted: Thu Feb 05, 2009 8:51 am (спустя 10 часов 20 минут; написано за 1 минуту 55 секунд)
   Post subject:
Reply with quote

Лучше вообще не определять браузер ))
Back to top
View user's profile Send private message
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Thu Feb 05, 2009 9:17 am (спустя 25 минут; написано за 32 секунды)
   Post subject:
Reply with quote

Александр Михалицын
Раз пошла такая пьянка и все равно используются условные комментарии от MS, то и определять версии IE следует через них.
Кстати, переменную qsel стоит вообще ликвидировать, она используется один раз.
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Thu Feb 05, 2009 9:27 am (спустя 10 минут; написано за 45 секунд)
   Post subject:
Reply with quote

Забавная тема. Для 99% код бесполезен, а 1% уже имеет такое же своё =)
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Thu Feb 05, 2009 10:42 am (спустя 1 час 14 минут; написано за 2 минуты 17 секунд)
   Post subject:
Reply with quote

Quote:
Охренеть... Господа, вам чтоли делать нечего...
ЭЭЭ! Юр, а при чем тут Александр Михалицын =),
не я же код писал, ну написал человек -- и спасибо ему. А елси вам ненужно -- так не пользуйтесь. ;)

Denis Usenko,
в чем-то вы правы, но бывают ситуации где без этого не обойтись.

WingedFox,
возможно, но все таки 1% код такой все таки нужен! (Например я такой не писал =))

Ksnk,
ууу. Вопрос к автору, а не ко мне. =)
Back to top
View user's profile Send private message Send e-mail
k0rzhik
Заглянувший



Joined: 03 Feb 2009
Posts: 4
Карма: 1
   поощрить/наказать


PostPosted: Wed Feb 11, 2009 4:40 am (спустя 5 дней 17 часов 58 минут; написано за 3 минуты 41 секунду)
   Post subject:
Reply with quote

Ух сколько я всего пропустил:)

Ksnk
Отвечаю на вопрос про qsel. Если вам он не нужен, можете заменить его на локальную переменную:)
Мне он нужен был, так как в своем фреймворке я реализовывал расширенные css3 селекторы.

Александр Михалицын
По поводу 0 заменить на false:
false /*@cc_on || (@_jscript_version * 10 % 10) @*/
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Wed Feb 11, 2009 11:37 am (спустя 6 часов 57 минут; написано за 2 минуты 21 секунду)
   Post subject:
Reply with quote

k0rzhik wrote:
h
,
тогда работать не будет... Вы не поняли, никто не мешает там сделать что-то типа:
Code (JavaScript): скопировать код в буфер обмена
var a = 1;
if (a !== true && a == true) {
   a = true;
} else if (a !== false && a == false) {
   a = false;
}
Например, на случай если какой-то человек будет использовать этот код как:
Code (JavaScript): скопировать код в буфер обмена
if (info.ie === true) { ... } //
 
Back to top
View user's profile Send private message Send e-mail
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Wed Feb 11, 2009 1:55 pm (спустя 2 часа 18 минут; написано за 2 минуты 54 секунды)
   Post subject:
Reply with quote

k0rzhik wrote:
Отвечаю на вопрос про qsel. Если вам он не нужен, можете заменить его на локальную переменную:)
Мне он нужен был, так как в своем фреймворке я реализовывал расширенные css3 селекторы.
? Вообще-то эта переменная используется только в строке ie8=_ie && (ie == 8 && qsel), и больше нигде, так что ее можно преписать так.
ie8=_ie && (ie == 8 &&!!d.querySelectorAll)
А про css3 стало совсем непонятно, какое отношение эта переменная имеет к ним.. и она точно была глобальной? :-)
Back to top
View user's profile Send private message Send e-mail
k0rzhik
Заглянувший



Joined: 03 Feb 2009
Posts: 4
Карма: 1
   поощрить/наказать


PostPosted: Thu Feb 12, 2009 12:16 am (спустя 10 часов 20 минут; написано за 4 минуты 3 секунды)
   Post subject:
Reply with quote

Александр Михалицын
Ну даже не знаю:) я использую так:
Code (JavaScript): скопировать код в буфер обмена
if (info.ie){...}
Ksnk
Ну вот, например, надо найти все дочерние ссылки в дивах.
Код на jquery или любой другой библиотеке:
Code (JavaScript): скопировать код в буфер обмена
var links = $("div > a")
а функцию $ можно записать так
Code (JavaScript): скопировать код в буфер обмена
var $ = !info.qsel
  ? function(...){ /*тут все жутко заморочено :)*/ }
  : function(q){
    return document.querySelectorAll(q);
  }
ЗЫ
Глобальной она не была, но вы поняли, что я имел ввиду :)
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Thu Feb 12, 2009 8:53 am (спустя 8 часов 37 минут; написано за 2 минуты 47 секунд)
   Post subject:
Reply with quote

Вообще говоря, для таких целей используется паттерн "bridge (en.wikipedia.org/wiki/Bridge_pattern)", что снимает заморочки с глобальным "определением типа браузера".
Back to top
View user's profile Send private message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Thu Mar 25, 2010 2:42 pm (спустя 1 год 1 месяц 13 дней 5 часов 48 минут; написано за 5 секунд)
   Post subject:
Reply with quote

хром не определяется.
Back to top
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML