2008-10-16 32 views
14

Tôi đã từng sử dụng Atlas. Gần đây tôi đã bắt đầu chuyển sang jQuery và đôi khi nguyên mẫu. Dự án mà tôi hiện đang làm việc đang sử dụng nguyên mẫu.Trình duyệt & phiên bản trong thư viện mẫu?

Trong nguyên mẫu, có cách nào dễ dàng để lấy tên và phiên bản trình duyệt không? Tôi đã xem qua tài liệu API và dường như không thể tìm thấy nó.

+0

Và như một sang một bên, tôi hiểu những cạm bẫy của mã hóa đối với một trình duyệt cụ thể và phiên bản của nó, trái với mã hóa đối với các tính năng có sẵn. – EvilSyn

+0

Thêm cọ rửa, và tôi thấy Prototype.Browser sẽ cung cấp cho tôi boolean trên IE hoặc Gecko, v.v. Vì vậy sẽ giúp .. Sẽ tốt hơn nếu nó có phiên bản trong đó nhưng tôi đoán tôi có thể viết JS cũ đơn giản cho rằng . – EvilSyn

Trả lời

3

Bạn đúng - nguyên mẫu không cung cấp tiện ích để xác định tên hoặc phiên bản trình duyệt.

Nếu bạn đặc biệt cần phải nhận được các thông tin trình duyệt như là một plugin, tôi sẽ đề nghị bổ sung thêm như sau (lấy từ trực tiếp jQuery):

var Browser = Class.create({ 
    initialize: function() { 
    var userAgent = navigator.userAgent.toLowerCase(); 
    this.version = (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1]; 
    this.webkit = /webkit/.test(userAgent); 
    this.opera = /opera/.test(userAgent); 
    this.msie = /msie/.test(userAgent) && !/opera/.test(userAgent); 
    this.mozilla = /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent); 
    } 
}); 
+2

Bạn có phần không chính xác, Prototype cung cấp một tiện ích để đoán tên trình duyệt như tôi hiển thị bên dưới. Và đoán thực sự là điều tốt nhất bạn có thể làm, vì bất kỳ trình duyệt nào cũng có thể nói dối về chuỗi tác nhân người dùng của nó. – nertzy

+0

Đây là một giải pháp tuyệt vời, cảm ơn.(Nó hoạt động tốt hơn Prototype, chỉ phân biệt giữa IE, Opera, WebKit, MobileSafari và Gecko - và không có số phiên bản mà không cần mã hóa nó.) –

+0

Thêm dòng: this.chrome = /chrome/.test (userAgent) ; thêm sự công nhận cho ... bạn đoán nó. (Lưu ý: Bạn cũng cần phải thêm: "&&! /chrome/.test (userAgent);" vào dòng Safari.) –

7

Prototype cung cấp một số cờ bạn có thể kiểm tra để có được một ý tưởng trình duyệt đang chạy. Hãy nhớ rằng thực hành tốt hơn là kiểm tra chức năng bạn muốn sử dụng hơn là kiểm tra một trình duyệt cụ thể.

Dưới đây là phần browser- và tính năng phát hiện prototype.js hiện trong cây nguồn:

var Prototype = { 
    Browser: { 
    IE:  !!(window.attachEvent && 
     navigator.userAgent.indexOf('Opera') === -1), 
    Opera: navigator.userAgent.indexOf('Opera') > -1, 
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, 
    Gecko: navigator.userAgent.indexOf('Gecko') > -1 && 
     navigator.userAgent.indexOf('KHTML') === -1, 
    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) 
    }, 

    BrowserFeatures: { 
    XPath: !!document.evaluate, 
    SelectorsAPI: !!document.querySelector, 
    ElementExtensions: !!window.HTMLElement, 
    SpecificElementExtensions: 
     document.createElement('div')['__proto__'] && 
     document.createElement('div')['__proto__'] !== 
     document.createElement('form')['__proto__'] 
    }, 
} 

Vì vậy, bạn có thể kiểm tra nếu trình duyệt hiện nay là IE bằng cách điều tra các giá trị của Prototype.Browser.IE, hoặc cách khác, hãy tương thích hơn trong tương lai và kiểm tra một tính năng cụ thể như XPath với Prototype.BrowserFeatures.XPath.

18

Là một hoàn để trả lời nertzy của bạn có thể thêm khả năng để phát hiện các phiên bản IE sử dụng này:

Prototype.Browser.IE6 = Prototype.Browser.IE && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) == 6; 
Prototype.Browser.IE7 = Prototype.Browser.IE && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) == 7; 
Prototype.Browser.IE8 = Prototype.Browser.IE && !Prototype.Browser.IE6 && !Prototype.Browser.IE7; 

Mặt khác bạn phải phát hiện chi tiết user agent trên phía máy chủ, quá. Dù sao phát hiện trình duyệt là một chiến lược thiếu sót nghiêm trọng khi viết các kịch bản trình duyệt chéo, điều đó chỉ được sử dụng khi phát hiện tính năng trình duyệt không thành công. Việc người dùng thay đổi chi tiết đại lý người dùng của họ khá dễ dàng.

+0

Vui lòng không trả lời câu hỏi này không quan tâm đến IE9 (vì nó có thể chưa tồn tại khi nó được đăng). –

+0

Đoán của tôi ít hơn 10% người dùng không biết cách thay đổi tác nhân người dùng của họ, vì vậy tôi đoán đó không phải là chiến lược xấu –

+0

Dòng cuối cùng cần được cập nhật cho IE9! Prototype.Browser.IE8 trả về true khi sử dụng phiên bản mới nhất của trình duyệt tuyệt vời. – jmlnik

2

Tôi có prototype.js mở rộng sau:

var Prototype = { ... }; 

với điều này:

// extension 
if (Prototype.Browser.IE) { 
    if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { 
     Prototype.BrowserFeatures['Version'] = new Number(RegExp.$1); 
    } 
} 

trình tốt cho tôi, gọi điện thoại cũng giống như:

if (Prototype.Browser.IE && Prototype.BrowserFeatures['Version'] == 8) { ... } 
3

tôi sử dụng này hơn và phía trên định nghĩa trình duyệt của Prototype.

Object.extend(Prototype.Browser, { 
    ie6: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 6 ? true : false) : false, 
    ie7: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 7 ? true : false) : false, 
    ie8: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 8 ? true : false) : false, 
    ie9: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 9 ? true : false) : false 
}); 

Hy vọng điều đó sẽ hữu ích!

0
  <script type="text/JavaScript"> 

       function getBrowserVersion() 
       { 
        var msg = "Not Recognised Browser"; 

        if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)) 
        { 
         var ffversion = new Number(RegExp.$1) 

         for (var i = 1; i < 20; i++) 
         { 
          if (ffversion == i) 
          { 
           msg = "FF" + i + "x"; 
           break; 
          } 
         } 
        } 
        else if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) 
        { 
         var ieversion = new Number(RegExp.$1) 

         for (var i = 1; i < 20; i++) 
         { 
          if (ieversion == i) 
          { 
           msg = "IE" + i + "x"; 
           break; 
          } 
         } 
        } 

        alert(msg); // return msg; 
       } 

      </script> 
+0

Chỉ có câu trả lời là không tốt. Vui lòng giải thích câu trả lời cùng với mã của bạn. –

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