2010-01-04 16 views
16

Ich möchte feststellen, dass der Browser des Client-Rechnern in Oper oder nicht mit Javascript.wie der Opera Browser mit Javascript

+0

Warum müssen Sie Opera erkennen? Und von Ihrer Frage scheint es, dass Sie Benutzer ohne JS erkennen wollen ... was JS irgendwie unmöglich macht. – James

+0

Ich muss eine js-Funktion nur aufrufen, wenn es einen Browser gibt, ist Opera whats why ich bin hier ...... – Avinash

+2

Wenn immer möglich, versuchen Sie, das Problem und nicht den Browser zu erkennen. Ich gebe zu, dass dies manchmal schwierig ist :( – hallvors

Antwort

6

Das Objekt navigator enthält alle Informationen, die Sie benötigen. Das sollte tun:

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

Du solltest verwenden Feature-Erkennung, wo immer möglich.Siehe @S.Marks Antwort: –

+5

Ich stimme zu, dass Sie die Feature-Erkennung wo immer möglich verwenden sollten, aber dies ist immer noch eine korrekte Antwort auf die explizite Frage * wie man feststellen kann, ob ein Client Opera * ausführt Die Frage war, wie man abschrecken sollte Wenn diese Oper-spezifische Funktion existiert *, dann wäre es besser, nach dieser Funktion zu suchen. Der Vorschlag von S.Mark ist zwar sehr praktisch (ich habe ihn ebenfalls hochgestuft), aber kaum eine Funktionserkennung. Es beruht auf einem Objekt, das nur in der Oper vorhanden ist, und prüft dies, ja, aber es prüft nicht auf die * spezifische * Funktion (die uns unbekannt ist), die der Opera-Check-Anforderung unterliegt. –

+5

Justin ... Die Navigator-Zeichenfolge wurde für die Browser-Erkennung entwickelt. Die Erkennung von Browsern mit Feature-Erkennung ist noch schlimmer als die einfache Browser-Erkennung. – James

0

stört es Sie mit jQuery?

dann können Sie jQuery.browser (see documnentation)

Aber die jQuery-Jungs empfehlen verwenden, dies nicht zu verwenden.

Wir empfehlen diese Eigenschaft gegen verwenden, versuchen Sie bitte stattdessen Funktion Erkennung zu verwenden (siehe jQuery.support)

Edit:

Für Mootools: window.opera (siehe documentation)

+0

Ich benutze Mootools 1.2, also wie geht das in mootools1.2? – Avinash

+0

Ich habe meinen Beitrag bearbeitet, aber ich kann dies sehr einfach mit Google finden (wie ich) – Natrium

+0

-1 Warum etwas vorschlagen, dass sogar die Macher schlagen dagegen? –

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

Kein Scherz, es gibt ein Objekt opera im Opera Browser.

Sie können denken, Objekt opera ist überschreibbar, aber navigator ist auch überschreibbar.

UPDATE:

genaueres Ergebnis zu erhalten, Sie wie

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

tun konnte, und ich bemerkte, haben Opera beide addEventListener und attachEvent, so gibt es auch eine andere Art und Weise wie

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

+1 für Merkmalserkennung –

+3

@Justin, dies ist keine Feature-Erkennung. Wenn überhaupt, ist es Feature-basierte Browsererkennung. Siehe http://www.nczonline.net/blog/2009/12/29/feature-detection-is-not-browser-detection/ ... Auch 'window.opera && Object.toString.call (window.opera) == "[object Opera]" 'wäre eine solide Prüfung. – James

+0

Danke J-P, aber 'Object.toString.call (window.opera)' funktioniert nicht in meiner Oper 10.10, also habe ich meins auf funktionierende aktualisiert. – YOU

7

In Prototype.js, we use this inference:

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

Dies prüft im Wesentlichen, ob window.opera Objekt existiert und sein interner Wert [[Klasse]] "Opera" ist. Dies ist ein soliderer Test als nur die Suche nach window.opera Existenz, da gibt es viel weniger Chance, dass einige nicht in Verbindung stehende globale Variable in die Quere kommen und zu falsch positiven Ergebnissen führen.

Apropos unabhängig voneinander globale Variable, nicht vergessen, dass in MSHTML DOM zum Beispiel Elemente global durch ID/Name aufgelöst werden können; Das bedeutet, dass das Vorhandensein von etwas wie <a name="opera" href="...">foo</a> in einem Markup zu window.opera führt, das auf dieses Ankerelement verweist. Es gibt Ihre falsche positive ...

Mit anderen Worten, Test [[Klasse]] Wert, nicht nur Existenz.

Und natürlich immer zweimal überlegen, bevor Sie für den Browser schnüffeln. Oft gibt es bessere Möglichkeiten, ein Problem zu lösen;)

P.S.Es gibt eine Chance, dass zukünftige Versionen von Opera [[Class]] von window.opera ändern, aber das scheint unwahrscheinlich.

+3

Funktioniert nicht mehr –

30

Jetzt, da Opera die Chrome-Rendering-Engine verwendet, funktioniert die akzeptierte Lösung nicht mehr.

Der User Agent String zeigt wie auf den Punkt:

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

Die einzige Kennung für Opera ist der OPR Teil.

Hier ist der Code, den ich verwende, der mit der alten Opera oder der neuen Opera übereinstimmen sollte. Es macht die Opera var einen Booleschen Wert (true oder false):

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

+0

Danke. Es klappt. Erkennt Opera. – dnns

+0

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

6

Die oben genannten Antworten nicht mehr in der neuen Oper arbeiten 30. Da Opera jetzt Chromium verwenden. Bitte benutzen Sie die folgenden:

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) 
} 

Die neue Opera 30 Release verwendet jetzt voll Chromium und verändert auch ihre userAgent zu OPR

Verwandte Themen