2009-03-13 24 views
15

Amazon.com ha actualizado recientemente su javascript y está causando problemas con algunos navegadores Opera.¿Cuál es la forma correcta de detectar Opera usando jQuery?

Su código de detección del navegador se parece así, pero es defectuosa:

function sitbReaderIsCompatibleBrowser() { 
     if (typeof(jQuery) == 'undefined') { 
      return false; 
     } else { 
      var version = jQuery.browser.version || "0"; 
      var splitVersion = version.split('.'); 
      return (
        (jQuery.browser.msie && splitVersion[0] >= 6) // IE 6 and higher 
       || (jQuery.browser.mozilla && (
         (splitVersion[0] == 1 && splitVersion[1] >= 8) // Firefox 2 and higher 
        || (splitVersion[0] >= 2) 
        )) 
       || (jQuery.browser.safari && splitVersion[0] >= 500) // Safari 5 and higher 
       || (jQuery.browser.opera && splitVersion[0] >= 9) // Opera 5 and higher 
      ); 
     } 
} 

Nada obviamente equivocada salta a mí con este código, pero nunca he utilizado jQuery antes, así que no sé .

Aunque parece que este código intenta dejar pasar a los usuarios de Opera, cuando visito la página con Opera 9.64 recibo un mensaje de "navegador no compatible". Si cambio la configuración de Opera para que se informe como Firefox, ¡la página funciona a la perfección! Con eso en mente, estoy bastante seguro de que es un problema con el script y no con el navegador.

¿Algún experto de jQuery tiene alguna sugerencia?

Puede replicar el comportamiento visitando cualquier libro en Amazon y haciendo clic en el enlace "mirar dentro de este libro".

+0

estoy usando Opera 9.64 también, pero todo lo que la página me está diciendo es que Amazon línea del lector funciona mejor con IE> 6.0, Firefox> 1.5 o Safari> 2,0 –

+3

Un buen ejemplo de por qué la detección del navegador y mensajes "navegador no compatible" casi siempre son una mala idea. – tgecho

+0

Bueno, * este * fragmento de sniffing específico intenta de hecho permitir Opera, pero como una de las respuestas a continuación dice que Amazon tiene más explorador olfateando en otro lado, incluido el rastreo del lado del servidor, no es compatible con Opera. – hallvors

Respuesta

5

verifico para Opera como esto:

if (/Opera/.test (navigator.userAgent)) // do something 

¿Por qué quieres jQuery?

+0

No, es Amazon. Escribí su soporte técnico, pero como siempre la gente de soporte técnico nunca había oído hablar de javascript. Aargh. Me parece que es más productivo enviarles una solución que pedir ayuda, ya que una solución podría ser reenviada a un programador en lugar de una CSR. –

+2

Ahh, lo mejor que puede hacer cualquier desarrollador web es dejar de detectar navegadores :-) –

0

No estoy seguro (nunca reviso para la ópera de todos modos) pero si la funcionalidad incorporada de jQuery no detecta la opera, puede ser un error con el jQuery que necesita ser reparado. Sospecho que si ese es el caso, debería resolverse con bastante rapidez.

+1

jQuery dice que es compatible con Opera, y la página de ejemplo en http://docs.jquery.com/Utilities/jQuery.browser detecta mi navegador perfectamente. No creo que sea un error de jQuery. Tiene que ser algo sobre la forma en que lo están usando. –

5

Es mucho mejor detectar las capacidades de JavaScript en lugar del navegador userAgent.

es decir, DOM, XmlHttpRequest, modelo de concurso completo (event.target vs event.srcElement), ActiveX, Java, etc

Al centrarse en las funciones de la API que se requieren, en lugar de un navegador de destino se creará una mayor robusto conjunto de scripts, e inevitablemente menos carcasa especial.

Este enlace aquí en opera probablemente le dirá más

20

Antes de jQuery 1.3, se puede utilizar jQuery.browser:

if($.browser.opera){ 
    alert("You're using Opera version "+$.browser.version+"!"); 
} 

partir de la versión 1.3, debe utilizar jQuery.support lugar.

La razón principal para esto es que debería evitar la búsqueda de navegadores, ya que las características pueden cambiar de una versión a otra, lo que hace que el código se vuelva obsoleto en poco tiempo.

En su lugar, siempre debe intentar usar feature detection. Esto le permitirá ver si el navegador actual es compatible con la función que está intentando usar, independientemente de la marca del navegador, versión, etc.

+0

Spot-on. Ese es el código que estoy buscando. Ahora espero que Amazon escuche ... :) –

+0

Me alegra ayudar, Lista. ¿Podrías por favor marcar como resuelto si esto te ayudó? ¡Gracias! – Seb

+1

Para ser claros, jQuery 1.3+ en realidad no elimina jQuery.browser. '" jQuery.browser no se eliminará de versiones futuras "'. Pero tienes razón en la detección de características. – Yahel

10

Hay un objeto especial window.opera que está presente en todos los Opera 5+ navegadores. Así que algo tan simple como:

if (window.opera && window.opera.buildNumber) { 
    // we are in Opera 
} 

sería suficiente.

+4

No, no será suficiente. - Porque, si en algún lugar de la página, tiene un elemento con 'id =" opera "', entonces 'if (window.opera)' informará verdadero. En todos los navegadores – c69

+1

Entonces puede hacer esto si (window.opera && window.opera.version) esto no será cierto en otros navegadores. –

+0

Buen punto, he actualizado mi respuesta. – jayarjo

0

En los tiempos actuales de HTML5, también puede verificar las características del navegador con frecuencia.

if (!window.FormData) { alert("xmlhttprequest L2 FormData interface not available"); } 
1

La razón principal por la que Amazon no funciona en Opera es debido a que la envíe código diferente del lado del servidor ya ... Si visita la misma página con Firefox y luego guardar esa página y vuelve a abrir en Opera funciona bien ...

Pero se comprometieron a arreglar eso en algún momento en enero ...

0

creo que de esta manera es la mejor
si (window.opera.version() == 12) {}
Este ejemplo comprobar si la versión de la ópera es de 12. Muy útil cuando tengo problemas con Font- cara en Opera.

Cuestiones relacionadas