2009-03-13 18 views
15

Amazon.com gần đây đã cập nhật javascript của họ và nó gây ra sự cố với một số trình duyệt Opera.Cách chính xác để phát hiện Opera bằng jQuery là gì?

đang phát hiện trình duyệt của họ trông giống như vậy, nhưng nó bị lỗi:

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

Không có gì rõ ràng sai nhảy ra lúc tôi với mã này, nhưng tôi đã không bao giờ sử dụng jQuery trước vì vậy tôi không biết .

Mặc dù mã này có vẻ như đang cố gắng để người dùng Opera thông qua, khi tôi truy cập trang bằng Opera 9.64 tôi nhận được thông báo "trình duyệt không được hỗ trợ". Nếu tôi thay đổi cài đặt của Opera để tự báo cáo là Firefox, trang hoạt động hoàn hảo! Với ý nghĩ đó, tôi chắc chắn đó là vấn đề với kịch bản chứ không phải trình duyệt.

Bất kỳ chuyên gia jQuery nào đều có đề xuất?

Bạn có thể sao chép hành vi bằng cách truy cập bất kỳ sách nào trên Amazon và nhấp vào liên kết "xem bên trong sách này".

+0

Tôi đang sử dụng Opera 9.64 nhưng tất cả trang đó cho tôi biết rằng Amazon Online Reader hoạt động tốt nhất với IE> 6.0, Firefox> 1.5 hoặc Safari> 2.0 –

+3

Ví dụ về lý do tại sao trình duyệt phát hiện và thông báo "trình duyệt không được hỗ trợ" hầu như luôn là một ý tưởng tệ hại. – tgecho

+0

Vâng, * đoạn trích đánh dấu cụ thể này thực sự cố gắng cho phép Opera, nhưng là một trong những câu trả lời dưới đây cho biết Amazon có nhiều trình duyệt đánh hơi hơn ở nơi khác, kể cả đánh hơi phía máy chủ, không thân thiện với Opera. – hallvors

Trả lời

5

tôi kiểm tra cho Opera như thế này:

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

Tại sao bạn muốn jQuery?

+0

Tôi không - đó là Amazon. Tôi đã viết hỗ trợ kỹ thuật của họ, nhưng như thường lệ, những người hỗ trợ kỹ thuật chưa bao giờ nghe nói về javascript. Aargh. Tôi cho rằng hiệu quả hơn khi gửi cho họ sự cố hơn là yêu cầu trợ giúp, vì bản sửa lỗi thực sự có thể được chuyển tiếp đến một lập trình viên thay vì CSR. –

+2

Ahh, điều tốt nhất mà bất kỳ nhà phát triển web nào cũng có thể làm là ngừng phát hiện trình duyệt nào :-) –

0

Tôi không biết chắc chắn (tôi chưa bao giờ thực sự kiểm tra opera) nhưng nếu chức năng jQuery tích hợp không phát hiện được opera, có thể là lỗi với jQuery cần được sửa. Tôi sẽ nghi ngờ nếu đó là trường hợp, nó sẽ được giải quyết khá nhanh chóng.

+1

jQuery nói Opera tương thích và trang ví dụ tại http://docs.jquery.com/Utilities/jQuery.browser phát hiện trình duyệt của tôi hoàn hảo. Tôi không nghĩ đó là lỗi jQuery. Nó phải là một cái gì đó về cách họ đang sử dụng nó. –

5

Tốt hơn nhiều là phát hiện khả năng javascript thay vì trình duyệt userAgent.

tức DOM, XMLHttpRequest, mô hình eventing (event.target vs event.srcElement), ActiveX, Java vv

Bằng cách tập trung vào các chức năng API mà bạn sẽ yêu cầu, chứ không phải là một trình duyệt mục tiêu mà bạn sẽ tạo ra một nhiều hơn tập hợp các tập lệnh mạnh mẽ và chắc chắn ít vỏ đặc biệt hơn.

Liên kết này đây tại opera lẽ sẽ cho bạn biết thêm

20

Trước jQuery 1.3, bạn có thể sử dụng jQuery.browser:

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

Từ phiên bản 1.3, bạn nên sử dụng jQuery.support để thay thế.

Lý do chính cho việc này là nên tránh kiểm tra trình duyệt vì các tính năng có thể thay đổi từ phiên bản sang phiên bản, làm cho mã của bạn lỗi thời nhanh chóng.

Bạn nên luôn sử dụng feature detection để thay thế. Điều này sẽ cho phép bạn xem liệu trình duyệt hiện tại có hỗ trợ tính năng bạn đang cố gắng sử dụng hay không, bất kể thương hiệu trình duyệt, phiên bản, v.v.

+0

Spot-on. Đó là mã tôi đang tìm kiếm. Bây giờ hy vọng Amazon sẽ lắng nghe ... :) –

+0

Vui mừng được giúp đỡ, Lista. Bạn có thể đánh dấu là đã được giải quyết nếu điều này giúp bạn không? Cảm ơn! – Seb

+1

Để rõ ràng, jQuery 1.3+ không thực sự loại bỏ jQuery.browser. '" jQuery.browser sẽ không bị xóa khỏi các phiên bản sau "'. Tuy nhiên, bạn nói đúng về tính năng phát hiện. – Yahel

10

Có một đối tượng đặc biệt window.opera hiện diện trong tất cả Opera 5+ trình duyệt. Vì vậy, một cái gì đó đơn giản như:

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

là đủ.

+4

Không, nó sẽ không đủ. - Bởi vì, nếu ở đâu đó trong trang, bạn có phần tử với 'id =" opera "', sau đó 'if (window.opera)' sẽ báo cáo đúng. Trong tất cả các trình duyệt. – c69

+1

Sau đó, bạn có thể thực hiện việc này nếu (window.opera && window.opera.version) điều này sẽ không đúng trong các trình duyệt khác. –

+0

Điểm tốt, tôi đã cập nhật câu trả lời của mình. – jayarjo

0

Trong thời gian HTML5 hiện tại, bạn cũng có thể kiểm tra các tính năng của trình duyệt thay thế thường xuyên.

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

Lý do chính khiến Amazon thất bại trên Opera là vì gửi mã khác từ phía máy chủ ... Nếu bạn truy cập cùng một trang với Firefox và sau đó lưu trang đó và mở lại nó trong Opera ...

Nhưng họ hứa sẽ khắc phục điều đó đôi khi trong tháng Giêng ...

0

Tôi nghĩ rằng cách này là tốt nhất
if (window.opera.version() == 12) {}
Ví dụ này kiểm tra xem phiên bản opera là 12. Rất hữu ích khi tôi có vấn đề với in- mặt trong Opera.

Các vấn đề liên quan