2013-09-23 6 views
1

Хорошо, это краевой кейс, который мне удалось приземлиться. Я тестирую свое приложение на новой операционной системе Tizen. В моем JS-коде есть тысячи проверок навигатора. Что-то вроде:Как установить навигатор userAgent?

navigator.userAgent.toLocaleLowerCase().indexOf("android") || navigator.userAgent.toLocaleLowerCase().indexOf("iPad") 

Теперь пользователь userAgent Tizen OS на моем тестовом устройстве не имеет ни одной из этих строк. В результате многие мои css и JS ломаются. Я сейчас в режиме POC и не хочу тратить время на добавление дополнительной проверки ко всем этим условиям. Есть ли способ программно установить userAgent? Что-то вдоль линий:

navigator.userAgent += " Tizen" //does not work. 

MDN говорит свою собственность на чтение-запись. Однако я не могу его модифицировать. Помогите мне с этим. Или другой умный способ подделать userAgent или правильный способ установить это. Благодарю.

+3

Это очень плохой подход. Даже в цитированной вами статье MDN четко сказано: «Идентификация браузера, основанная на обнаружении строки пользовательского агента, ненадежна и не рекомендуется (...)». Обнаружение функции намного проще и безопаснее. Также, возможно, подумайте об использовании [Modernizr] (http://modernizr.com/). – MMM

+0

btw: '.toLocaleLowerCase(). IndexOf (« iPad »)' наверняка никогда не сработает, не так ли? «iPad» - это не нижний регистр. – Spudley

+0

@Spudley: да, это моя опечатка. –

ответ

8

Мой JS код тысячи штурман чеков

В этом случае ваш JS код, который виноват.

В основном вы обнаружили, что причина, по которой UA-обнаружение UA считается действительно плохой практикой.

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

И тысячи строк этого материала в браузере ???? Это может сделать только плохие вещи для производительности вашего сайта.

Есть ли способ программно установить userAgent? MDN говорит о своем свойстве чтения и записи.

Строка UserAgent является значением, доступным только для чтения.

Однако можетoverride the getter, поэтому есть способы сделать его доступным для записи. Уродливо, но возможно.

Я бы рекомендовал не делать этого.

Даже без браузеров, намеренно изменяющих свои строки UA, чтобы разбить этот код (что они делают), ваша задача принципиально бесконечна; вам придется постоянно пересматривать этот код каждый раз, когда будет выпущено новое устройство/браузер/версия, а ваши тысячи строк кода будут продолжать увеличиваться и увеличиваться.

Плюс, конечно, он будет полностью ненадежным, если пользователь изменит строку UA своего браузера.

Исправьте его с помощью взлома, если хотите, но имейте в виду, что это все больше и больше будет потреблять ваше время. Вам действительно нужно рассмотреть возможность переключения на лучшую практику кодирования, такую ​​как обнаружение функции, а не на обнаружение UA.

+0

Как запоздалая мысль, «тысячи таких проверок» - это преувеличение, стоящее на двух downvotes. Спасибо за взломать. Мне просто нужно определить некоторые вещи и принять некоторые решения. –

4

Недавно я создал сущность, чтобы сделать readonly свойства доступными для записи (вы можете найти пример, чтобы перезаписать navigator.userAgent). Как сказал Спрули, это уродливо и не рекомендуется, но я использовал его для модульных тестов для изменения пользовательских агентов на лету, поэтому будьте осторожны.

Gist: https://gist.github.com/moehlone/bed7dd6cb38fc55bd640

+1

Это было идеально для меня, так как я хотел использовать socket.io с React Native, но как только вы добавляете socket.io, вам нужно установить агент пользователя в «ReactNative», иначе вы не сможете использовать отладчик! Спасибо! –

Смежные вопросы