2010-01-04 11 views
16

Tôi muốn xác định rằng trình duyệt của các máy khách trong opera hoặc không sử dụng javascript.cách xác định trình duyệt opera bằng cách sử dụng javascript

+0

Tại sao bạn cần để phát hiện Opera? Và, từ câu hỏi của bạn, có vẻ như bạn muốn phát hiện người dùng mà không cần JS ... điều đó là không thể sử dụng JS. – James

+0

tôi cần phải gọi một hàm js chỉ khi có trình duyệt là opera thats whay tôi đang ở đây ...... – Avinash

+2

Bất cứ khi nào có thể, hãy thử phát hiện sự cố chứ không phải trình duyệt. Tôi thừa nhận rằng điều này đôi khi khó khăn: ( – hallvors

Trả lời

6

Đối tượng navigator chứa tất cả thông tin bạn cần. Điều này nên làm:

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

Bạn nên sử dụng Xem câu trả lời của @ S.Mark –

+5

Tôi đồng ý rằng bạn nên sử dụng tính năng phát hiện bất cứ khi nào có thể, nhưng đây vẫn là câu trả lời chính xác cho câu hỏi rõ ràng * cách xác định xem khách hàng có đang chạy opera * hay không. câu hỏi là * làm thế nào để ngăn chặn của tôi nếu chức năng opera cụ thể này tồn tại * thì việc kiểm tra chức năng đó sẽ thích hợp hơn. Đề nghị của S.Mark, trong khi khá thuận tiện (tôi upvoted nó, quá), hầu như không có tính năng phát hiện ở tất cả. Nó dựa vào một đối tượng chỉ có mặt trong opera, và kiểm tra nó, có, nhưng nó không kiểm tra tính năng * cụ thể * (không biết đến chúng ta) làm nền tảng cho yêu cầu kiểm tra opera. –

+5

Justin ... Chuỗi điều hướng được thiết kế để phát hiện trình duyệt. Sử dụng tính năng phát hiện để phát hiện trình duyệt thậm chí còn tệ hơn việc sử dụng phát hiện trình duyệt đơn giản. – James

0

bạn có phiền khi sử dụng jQuery không?

sau đó bạn có thể sử dụng jQuery.browser (see documnentation)

Nhưng jQuery-kẻ khuyên không sử dụng này.

Chúng tôi khuyến cáo không nên sử dụng bất động sản này, hãy thử sử dụng tính năng phát hiện thay thế (xem jQuery.support)

Edit:

Đối với Mootools: sử dụng window.opera (xem documentation)

+0

Tôi đang sử dụng mootools 1.2, vậy làm thế nào để làm điều đó trong mootools1.2? – Avinash

+0

Tôi đã chỉnh sửa bài đăng của mình, nhưng imho này có thể được tìm thấy rất dễ dàng với google (như tôi đã làm) – Natrium

+0

-1 Tại sao đề xuất điều gì đó mà ngay cả các nhà sản xuất đề xuất chống lại? –

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

Không đùa, có một đối tượng opera trong trình duyệt opera.

Bạn có thể nghĩ, đối tượng opera có thể ghi đè, nhưng navigator cũng có thể ghi đè.

CẬP NHẬT:

Để có được kết quả chính xác hơn, bạn có thể làm như

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

Và tôi nhận thấy, Opera có cả addEventListener và attachEvent, do đó cũng là một cách khác như

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

+1 để phát hiện tính năng –

+3

@Justin, đây không phải là tính năng phát hiện. Nếu bất cứ điều gì, nó là phát hiện trình duyệt dựa trên tính năng. Xem http://www.nczonline.net/blog/2009/12/29/feature-detection-is-not-browser-detection/ ... Ngoài ra 'window.opera && Object.toString.call (window.opera) == "[đối tượng Opera]" 'sẽ là một kiểm tra vững chắc hơn. – James

+0

Cảm ơn J-P, nhưng 'Object.toString.call (window.opera)' không hoạt động trong opera 10.10 của tôi, vì vậy tôi đã cập nhật bản nhạc của mình để làm việc. – YOU

7

Trong Prototype.js, we use this inference:

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

Điều này chủ yếu kiểm tra rằng đối tượng window.opera tồn tại và giá trị [[Class]] bên trong của nó là "Opera". Đây là một thử nghiệm vững chắc hơn là chỉ kiểm tra sự tồn tại window.opera, vì ít có khả năng xảy ra biến số opera toàn cầu không liên quan cản trở và dẫn đến kết quả dương tính giả.

Nói về biến toàn cục không liên quan, hãy nhớ rằng trong MSHTML DOM, ví dụ, các phần tử có thể được giải quyết bằng id/name trên toàn cầu; điều này có nghĩa là sự hiện diện của một số thứ như <a name="opera" href="...">foo</a> trong đánh dấu sẽ dẫn đến việc window.opera tham chiếu đến phần tử neo đó. Có dương tính giả của bạn ...

Nói cách khác, kiểm tra [[Class]] giá trị, không chỉ là sự tồn tại.

Và tất nhiên, hãy luôn suy nghĩ kỹ trước khi đánh hơi cho trình duyệt. Thông thường có những cách tốt hơn để giải quyết vấn đề;)

P.S.Có một cơ hội cho các phiên bản Opera trong tương lai thay đổi [[Class]] của window.opera, nhưng điều đó dường như không chắc.

+3

Không hoạt động nữa –

30

Giờ Opera sử dụng công cụ kết xuất của Chrome, giải pháp được chấp nhận không còn hoạt động nữa.

Đại lý chuỗi tài xuất hiện như thế này:

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

Từ định danh duy nhất cho Opera là phần OPR.

Đây là mã tôi sử dụng, phải khớp với Opera cũ hoặc Opera mới. Nó làm cho các Opera var một giá trị boolean (đúng hay sai):

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

+0

Cảm ơn. Nó hoạt động. Phát hiện Opera. – dnns

+0

Hoặc? '/ Opera | OPR \ //. Test (navigator.userAgent)' –

6

Những câu trả lời ở trên không còn làm việc trong Opera mới 30. Kể từ Opera hiện nay sử dụng Chromium. Vui lòng sử dụng dưới đây:

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

mới Opera 30 phát hành bây giờ sử dụng đầy đủ Chromium và cũng thay đổi của họ userAgent để OPR