2009-02-26 4 views
4

В одном из моих классов веб-разработки мы попросили создать скрипт, который обнаруживает браузеры NE4, NE6 +, IE4, IE6 +, которые отображают совместимый CSS-скрипт для каждого браузера.Что такое лучший способ обнаружения браузера в Javascript?

он дал нам статью, чтобы прочитать о них и статья упоминается this site

один из студентов сказал, что это

Лучший выбор для совместимости Javascript является тестирование для браузера возможностей, когда вы хочу сделать что-то. Одной из основных причин для этого является то, что в будущем будет создано больше и больше браузеров.

Теперь мои вопросы таковы, каким образом это лучший способ обнаружить обнаружение объектов браузера пользователей или использование объекта Navigator?

ответ

4

Лучший способ избежать использования кода, зависящего от браузера, насколько это возможно, но где это абсолютно необходимо, используйте код, который был проверен правильно, написанный людьми, которые знают намного больше, чем вы и я. Я бы предложил JQuery, так как это моя библиотека выбора, но есть много других (YUI популярен, как и Scriptilicious и т. д.). Google JQuery для начала работы. Кроме того, google «John Resig at Google», чтобы узнать, сможете ли вы поговорить с ним, где он обсуждает некоторые методы, которые он использует для обнаружения возможностей браузера. Это очень умно, поскольку он адаптируется, когда браузеры исправляют свои устаревшие проблемы.

1

best Способ не обнаружить его, но использовать кросс-браузерную библиотеку, такую ​​как jQuery. Это также имеет много других преимуществ с точки зрения выразительности.

+0

Слишком плохо до недавнего времени Jquery был кросс-браузер из-за браузерное обнюхивание. –

+0

Твоя суть в том, что именно? Что я должен просто дублировать способ работы jQuery, но не использовать его? Преимущество использования jQuery заключается в том, что вам не нужно заботиться о том, какой браузер вы используете. Тяжелая работа была сделана для вас (и вы также получаете бонусный материал). – paxdiablo

7

Стандартный способ определить, какой браузер используется, - проверить поставляемый агент пользователя.

var BrowserDetect = { 
    init: function() { 
     this.browser = this.searchString(this.dataBrowser) || "An unknown browser"; 
     this.version = this.searchVersion(navigator.userAgent) 
      || this.searchVersion(navigator.appVersion) 
      || "an unknown version"; 
     this.OS = this.searchString(this.dataOS) || "an unknown OS"; 
    }, 
    searchString: function (data) { 
     for (var i=0;i<data.length;i++) { 
      var dataString = data[i].string; 
      var dataProp = data[i].prop; 
      this.versionSearchString = data[i].versionSearch || data[i].identity; 
      if (dataString) { 
       if (dataString.indexOf(data[i].subString) != -1) 
        return data[i].identity; 
      } 
      else if (dataProp) 
       return data[i].identity; 
     } 
    }, 
    searchVersion: function (dataString) { 
     var index = dataString.indexOf(this.versionSearchString); 
     if (index == -1) return; 
     return parseFloat(dataString.substring(index+this.versionSearchString.length+1)); 
    }, 
    dataBrowser: [ 
     { 
      string: navigator.userAgent, 
      subString: "Chrome", 
      identity: "Chrome" 
     }, 
     { string: navigator.userAgent, 
      subString: "OmniWeb", 
      versionSearch: "OmniWeb/", 
      identity: "OmniWeb" 
     }, 
     { 
      string: navigator.vendor, 
      subString: "Apple", 
      identity: "Safari", 
      versionSearch: "Version" 
     }, 
     { 
      prop: window.opera, 
      identity: "Opera" 
     }, 
     { 
      string: navigator.vendor, 
      subString: "iCab", 
      identity: "iCab" 
     }, 
     { 
      string: navigator.vendor, 
      subString: "KDE", 
      identity: "Konqueror" 
     }, 
     { 
      string: navigator.userAgent, 
      subString: "Firefox", 
      identity: "Firefox" 
     }, 
     { 
      string: navigator.vendor, 
      subString: "Camino", 
      identity: "Camino" 
     }, 
     {  // for newer Netscapes (6+) 
      string: navigator.userAgent, 
      subString: "Netscape", 
      identity: "Netscape" 
     }, 
     { 
      string: navigator.userAgent, 
      subString: "MSIE", 
      identity: "Explorer", 
      versionSearch: "MSIE" 
     }, 
     { 
      string: navigator.userAgent, 
      subString: "Gecko", 
      identity: "Mozilla", 
      versionSearch: "rv" 
     }, 
     {  // for older Netscapes (4-) 
      string: navigator.userAgent, 
      subString: "Mozilla", 
      identity: "Netscape", 
      versionSearch: "Mozilla" 
     } 
    ], 
    dataOS : [ 
     { 
      string: navigator.platform, 
      subString: "Win", 
      identity: "Windows" 
     }, 
     { 
      string: navigator.platform, 
      subString: "Mac", 
      identity: "Mac" 
     }, 
     { 
       string: navigator.userAgent, 
       subString: "iPhone", 
       identity: "iPhone/iPod" 
     }, 
     { 
      string: navigator.platform, 
      subString: "Linux", 
      identity: "Linux" 
     } 
    ] 

}; 
BrowserDetect.init(); 

http://www.quirksmode.org/js/detect.html

+0

+1, поскольку это единственный ответ, который, скорее всего, действительно поможет ему с его назначением. –

+1

Проверка на основе UA плохо в целом, поскольку вы в конечном итоге блокируете браузеры независимо от того, исправляют ли они ошибки или нет, не работают с новыми браузерами и т. Д. Отличным примером является то, что Chrome должен подменять Safari на несколько сайтов из-за сайтов, в которых есть белый список хороших браузеров, а также черный список плохого. – olliej

+0

@Olliej: Вы собираетесь проголосовать за ответ, который конкретно относится к вопросу, когда сам вопрос является домашним заданием. Я очень сомневаюсь, что учитель будет счастлив, когда ученик вернется и скажет: «Вы не должны так поступать», вместо того, чтобы делать то, что ему сказали. – TheTXI

1

Честно говоря, если вы пытаетесь обнаружить браузер вы атакуя неправильно проблема. Мой совет будет заключаться в обнаружении функций, которые вы хотите использовать, и деградации на основе этого. Например, если вам нужно создать XMLHttpRequest нечто похожее на следующее будет работать:

var xhr = null; 
    if (typeof(XMLHttpRequest) !== 'undefined') 
     xhr = new XMLHttpRequest(...); 
    else if (typeof(ActiveXObject) !== 'undefined') 
     xhr = new ActiveXObject('Microsoft.XMLHTTP'); 

    if (xhr != null) 
     ...do something with it 
    else 
     throw "No XMLHttpRequest"; 

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

Однако, если вы можете использовать библиотеку Ajax, как JQuery, Prototype, Dojo, YUI, и т.д., что, вероятно, ваш лучший выбор, поскольку они уже абстракции встраивается.

+2

-1, он сказал в своем вопросе, что это для класса, нет никаких оснований, чтобы прыгать на него, чтобы «атаковать неправильную проблему». Это задание. –

+2

@Paolo: Согласен. Я слишком часто вижу это на этом сайте, где люди, отвечая на вопрос, будут пытаться управлять OP по дороге, которую они хотят, вместо того, чтобы просто отвечать на вопрос, как это было предложено. – TheTXI

+2

Я должен не согласиться - стоит знать, что вы задаете неправильный вопрос. Похоже, его лектор не имеет большого опыта в реальном мире или не использует его. Подход Брайана составляет 100%, за исключением того, что другие люди (читай JQuery) уже сделали это :-). – Travis

5

В одном из моих В классах веб-разработки мы попросили создать скрипт, который обнаруживает NE4, NE6 +, IE4, IE6 +

Ваш веб-класс разработки безнадежно, смешно устарел.

В те времена, когда Netscape4 и IE4 были обычными браузерами, часто приходилось обнюхивать тип браузера и обслуживать их разными таблицами стилей и сценариев, поскольку их поддержка стилей и функций DHTML была настолько различной.

В наши дни браузер с базовым уровнем, самый низкий уровень качества, о котором вам нужно беспокоиться, является прочным IE6. Почти никто не использует ничего ниже, потому что IE6 поставляется с XP, а использование не обновленных боксов Win2K и Win9X исчезающе мало. Конечно, никто во Вселенной не использует IE4 или ужасный Netscape 4; очень немногие текущие веб-сайты даже будут работать над ними.

Благодаря веб-стандартам, все другие браузеры, на которые вы можете настроить таргетинг (IE7 +, Firefox2 +, Opera, Safari, Chrome, Konqueror), как правило, достаточно близки к совместимости, что вам редко приходится делать много обнаружения браузера. IE6 действительно требует некоторой осторожности, но обычно, если вы используете режим стандартов, вы можете обойтись с помощью нескольких хакеров CSS (в частности, «* html») и некоторых возможностей для обмана в скриптах, а не для того, чтобы обслуживать совершенно другой контент для него.

Теперь мои вопросы таковы, каким образом это лучший способ обнаружить обнаружение объектов браузера пользователей или использование объекта Navigator?

Обнаружение объекта/метода.

Избегайте объекта навигатора, когда это возможно; он часто лежит в целях совместимости, а строки сканирования, чтобы попытаться выработать имена браузеров, могут легко отключить неожиданные токены в строке user-agent.

В случае, если вам необходимо специально определить IE6 (что, безусловно, является наиболее распространенным браузером для обнаружения и добавления обходных решений), и нет подходящего способа использования нюхания, лучше использовать conditional compilation, чем навигатор. userAgent обработка.

+1

Да, я знаю, что этот курс является извиняющимся из-за этого, но это нечеткое назначение для класса, но что я могу сделать lol – Ender

+1

В этом случае вопрос не столько «Что такое лучший способ обнаружения браузера в Javascript?», как «Какая глупость я должен сделать, чтобы удовлетворить моего преподавателя?» :-) – bobince

1

Вы хотите использовать Conditionizr, который показывает надежный тест/обнаружить дополнения для этого: http://conditionizr.com

Например:

conditionizr.add('safari', [], function() { 
    return /constructor/i.test(window.HTMLElement); 
});