Обнаруживать пользователей iPad с помощью jQuery?

Есть ли способ определить, использует ли текущий пользователь iPad с помощью jQuery / JavaScript?


person Community    schedule 06.01.2011    source источник


Ответы (4)


Обнаружение iPad

Вы сможете обнаружить пользователя iPad, взглянув на userAgent свойство:

var is_iPad = navigator.userAgent.match(/iPad/i) != null;

Обнаружение iPhone / iPod

Аналогичным образом свойство platform для проверки наличия таких устройств, как iPhone или плееры iPod:

function is_iPhone_or_iPod(){
     return navigator.platform.match(/i(Phone|Pod))/i)
}

Примечания

Несмотря на то, что это работает, вам, как правило, следует избегать выполнения специфичного для браузера обнаружения, поскольку оно часто может быть ненадежным (и может быть подделано). Предпочтительно использовать актуальную функцию / a> в большинстве случаев, что можно сделать с помощью такой библиотеки, как Modernizr.

Как указано в ответе Бреннена, при выполнении этого обнаружения в приложении Facebook могут возникнуть проблемы. Пожалуйста, посмотрите его ответ, чтобы справиться с этим сценарием.

Связанные ресурсы

person Rion Williams    schedule 06.01.2011
comment
ха-ха, вы делаете разницу между подходом jQuery и подходом Javascript? - person Harmen; 06.01.2011
comment
Я полагаю, что иногда люди не хотят использовать библиотеки. Но да, в этом нет необходимости, но мне нравятся эти жирные категории. - person Rion Williams; 06.01.2011
comment
Почему здесь 2 больших пальца вниз? - person Rocket Hazmat; 06.01.2011
comment
Есть ли способ его обнаружения на основе функций поддержки, чтобы не использовать пользовательский агент навигатора? - person albanx; 21.01.2011
comment
Одна опечатка (должен быть iPad вместо iPod) - нет. - person Satish; 21.04.2011
comment
Спасибо, Сатиш - я планировал, что этот раздел будет для iPod. Я включил это как дополнение к исходному вопросу. - person Rion Williams; 21.04.2011
comment
@Rionmonster: разве код jQuery не использует !== null, чтобы быть быстрее? :-) Просто шучу! Спасибо за повторный анализ всей статьи, которую вы предоставили, и за то, что поделились этим кодом. - person Marco Demaio; 09.09.2011
comment
Я не понимаю, что такое подход jQuery. Я пришел сюда в поисках чего-то в jQuery.browser или методах поддержки, так как ранее я решил использовать это, например, для проблем совместимости. - person Neo; 12.09.2011
comment
Разве это не должно быть navigator.userAgent? - person addedlovely; 16.02.2012
comment
return navigator.platform.match (/ i (Phone | Pod) / i) У него должна быть одна закрывающая скобка! В коде он возвращает navigator.platform.match (/ i (Phone | Pod) *) * / i) Не могу его редактировать, так как для редактирования требуется 6 символов. - person ivan133; 14.10.2017
comment
Предупреждение! Это не работает с последним обновлением iOS! - person PaRoxUs; 18.10.2019

Хотя принятое решение правильно для iPhone, оно неверно объявляет и isiPhone, и isiPad верными для пользователей, посещающих ваш сайт на свой iPad из приложения Facebook.

Принято считать, что устройства iOS имеют пользовательский агент для Safari и пользовательский агент для UIWebView. Это предположение неверно, поскольку приложения iOS могут настраивать свой пользовательский агент и настраивают его. Главный преступник здесь - Facebook.

Сравните эти строки пользовательского агента с устройств iOS:

# iOS Safari
iPad: Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3
iPhone: Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3

# UIWebView
iPad: Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/98176
iPhone: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Mobile/8B117

# Facebook UIWebView
iPad: Mozilla/5.0 (iPad; U; CPU iPhone OS 5_1_1 like Mac OS X; en_US) AppleWebKit (KHTML, like Gecko) Mobile [FBAN/FBForIPhone;FBAV/4.1.1;FBBV/4110.0;FBDV/iPad2,1;FBMD/iPad;FBSN/iPhone OS;FBSV/5.1.1;FBSS/1; FBCR/;FBID/tablet;FBLC/en_US;FBSF/1.0]
iPhone: Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; ru_RU) AppleWebKit (KHTML, like Gecko) Mobile [FBAN/FBForIPhone;FBAV/4.1;FBBV/4100.0;FBDV/iPhone3,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/5.1.1;FBSS/2; tablet;FBLC/en_US]

Обратите внимание, что на iPad строка пользовательского агента Facebook UIWebView включает «iPhone».

Старый способ идентификации iPhone / iPad с помощью JavaScript:

IS_IPAD = navigator.userAgent.match(/iPad/i) != null;
IS_IPHONE = navigator.userAgent.match(/iPhone/i) != null) || (navigator.userAgent.match(/iPod/i) != null);

Если бы вы использовали этот подход для обнаружения iPhone и iPad, у вас бы в конечном итоге IS_IPHONE и IS_IPAD были бы истинными, если пользователь переходит из Facebook на iPad. Это могло вызвать странное поведение!

Правильный способ идентификации iPhone / iPad в JavaScript:

IS_IPAD = navigator.userAgent.match(/iPad/i) != null;
IS_IPHONE = (navigator.userAgent.match(/iPhone/i) != null) || (navigator.userAgent.match(/iPod/i) != null);
if (IS_IPAD) {
  IS_IPHONE = false;
}

Мы объявляем IS_IPHONE ложным на iPad, чтобы прикрыть странный пользовательский агент Facebook UIWebView для iPad. Это один из примеров того, как сниффинг пользовательского агента ненадежен. Чем больше приложений iOS настраивают свой пользовательский агент, тем больше проблем будет возникать при сниффинге пользовательского агента. Если вы можете избежать сниффинга пользовательского агента (подсказка: CSS Media Queries), СДЕЛАЙТЕ ЭТО.

person Brennan Moore    schedule 21.10.2012
comment
Вы можете объединить соответствие вашего iPhone / iPod в одно регулярное выражение, например /iPh?o(ne|d)/i или /(iPhone|iPod)/i, если вы собираетесь выпускать iPhod: P. - person Cobby; 13.12.2012

Я использую это:

function fnIsAppleMobile() 
{
    if (navigator && navigator.userAgent && navigator.userAgent != null) 
    {
        var strUserAgent = navigator.userAgent.toLowerCase();
        var arrMatches = strUserAgent.match(/(iphone|ipod|ipad)/);
        if (arrMatches != null) 
             return true;
    } // End if (navigator && navigator.userAgent) 

    return false;
} // End Function fnIsAppleMobile


var bIsAppleMobile = fnIsAppleMobile(); // TODO: Write complaint to CrApple asking them why they don't update SquirrelFish with bugfixes, then remove
person Stefan Steiger    schedule 21.08.2012
comment
Спасибо, это именно то, что я искал. - person techie_28; 29.01.2013
comment
Он не работает на рабочем столе, потому что, если он не может ничего найти, возвращает объект с нулевым содержимым, я изменил второе условие и отлично работает: if (arrMatches! = Null) {return true; } - person Joe L.; 16.05.2014

Я использую это:

//http://detectmobilebrowsers.com/ + tablets
(function(a) {
    if(/android|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(ad|hone|od)|iris|kindle|lge |maemo|meego.+mobile|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|playbook|silk/i.test(a)
    ||
    /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))
    {
        window.location="yourNewIndex.html"
    }
})(navigator.userAgent||navigator.vendor||window.opera);
person Ntinos Koletsis    schedule 11.01.2013