2010-01-04 8 views
16

Quiero determinar que el navegador de las máquinas del cliente funcione o no con javascript.cómo determinar el navegador de la ópera usando javascript

+0

¿Por qué necesita para detectar Opera? Y, a partir de su pregunta, parece que desea detectar usuarios sin JS ... lo cual es algo imposible usando JS. – James

+0

necesito llamar a una función js solo si hay un navegador opera eso es lo que estoy aquí ...... – Avinash

+2

Siempre que sea posible, trate de detectar el problema y no el navegador. Admito que esto a veces es difícil :( – hallvors

Respuesta

6

El objeto navigator contiene toda la información que necesita. Esto debería hacer:

navigator.userAgent.indexOf("Opera"); 
+1

Debe usar detección de funciones siempre que sea posible. Consulte la respuesta de @ S.Mark. –

+5

Acepto que debe usar detección de características siempre que sea posible, pero esta sigue siendo una respuesta correcta a la pregunta explícita de * cómo determinar si un cliente está ejecutando opera *. la pregunta era * cómo disuadir el mío si esta función específica de la ópera existe *, entonces sería preferible verificar esa función. La sugerencia de S.Mark, si bien es bastante conveniente (también la elevé), difícilmente es la detección de características. Se basa en un objeto que solo está presente en la ópera, y lo comprueba, sí, pero no verifica la función * specific * (que desconocemos) que subyace al requisito de verificación de opera. –

+5

Justin ... La cadena de navegación está diseñada para la detección de navegadores. Usar la detección de características para detectar navegadores es aún peor que usar la detección de navegador simple. – James

0

¿te importa usar jQuery?

entonces puede utilizar jQuery.browser (see documnentation)

Pero los jQuery-chicos recomendar no utilizar este.

No recomendamos el uso de este propiedad, intenta utilizar la detección de características lugar (ver jQuery.support)

Editar:

Para Mootools: utilizar window.opera (ver documentation)

+0

estoy usando mootools 1.2, entonces, ¿cómo hacer eso en mootools1.2? – Avinash

+0

He editado mi publicación, pero esto se puede encontrar muy fácil con google (como lo hice) – Natrium

+0

-1 ¿Por qué sugerir algo que incluso los fabricantes sugieren en contra? –

19
if(window.opera){ 
    //do stuffs, for example 
    alert(opera.version()); //10.10 
} 

No es broma, hay un objeto opera en el navegador Opera.

Puede pensar que el objeto opera es reemplazable, pero navigator también se puede modificar.

ACTUALIZACIÓN:

Para obtener resultados más precisos, se podría hacer como

if (window.opera && opera.toString() == "[object Opera]"){ 
    //do stuffs, tested on opera 10.10 
} 

Y me di cuenta, Opera tiene tanto addEventListener y attachEvent, por lo que también es otra manera como

if (window.addEventListener && window.attachEvent){ 
    //do stuffs, tested on opera 10.10 
} 
+0

+1 para detección de características –

+3

@Justin, esto no es detección de características. En todo caso, es la detección del navegador basada en características. Ver http://www.nczonline.net/blog/2009/12/29/feature-detection-is-not-browser-detection/ ... También 'window.opera && Object.toString.call (window.opera) == "[object Opera]" 'sería una comprobación más sólida. – James

+0

Gracias J-P, pero 'Object.toString.call (window.opera)' no funciona en mi opera 10.10, así que actualicé el mío para el de trabajo. – YOU

7

En Prototype.js, we use this inference:

var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; 

Esto esencialmente comprueba que el objeto window.opera existe y su valor interno [[Class]] es "Opera". Esta es una prueba más sólida que la simple comprobación de la existencia de window.opera, ya que hay muchas menos posibilidades de que una variable opera global no relacionada se interponga y dé lugar a falsos positivos.

Hablando de variable global no relacionada, recuerde que en MSHTML DOM, por ejemplo, los elementos se pueden resolver por ID/nombre globalmente; esto significa que la presencia de algo como <a name="opera" href="...">foo</a> en un marcado dará como resultado window.opera haciendo referencia a ese elemento de anclaje. Ahí está su falso positivo ...

En otras palabras, pruebe el valor [[Class]], no solo la existencia.

Y, por supuesto, siempre piénselo dos veces antes de oler por el navegador. A menudo hay mejores formas de resolver un problema;)

P.S.Existe la posibilidad de versiones futuras de Opera cambiando [[Class]] de window.opera, pero eso parece poco probable.

+3

No funciona más –

30

Ahora que Opera usa el motor de renderizado de Chrome, la solución aceptada ya no funciona.

la cadena de agente de usuario muestra así:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.132

El único identificador para Opera es la parte OPR.

Aquí está el código que uso, que debe coincidir con la antigua Opera o la nueva Opera. Esto hace que la Opera var un valor booleano (verdadero o falso):

var Opera = (navigator.userAgent.match(/Opera|OPR\//) ? true : false);

+0

Gracias. Funciona. Detecta Opera. – dnns

+0

¿O? '/ Opera | OPR \ //. Test (navigator.userAgent)' –

6

Las respuestas anteriores ya no funcionan en el nuevo Opera 30. Desde Opera ahora usan cromo. Por favor, utilice el siguiente:

var isChromium = window.chrome, 
    isOpera = window.navigator.userAgent.indexOf("OPR") > -1 || window.navigator.userAgent.indexOf("Opera") > -1; 
if(isChromium !== null && isOpera == true) { 
    // is Opera (chromium) 
} else { 
    // not Opera (chromium) 
} 

El nuevo Opera 30 versión ahora utiliza plenamente cromo y también cambiaron su userAgent a OPR

Cuestiones relacionadas