Javascript kiểm tra xem trình duyệt là ie hay chrome

Ví dụ: nếu bạn muốn làm điều gì đó cụ thể, cung cấp một polifill cho một biểu thức chính quy khi trình duyệt là Safari, bạn hãy làm điều này

Show

if (navigator.userAgent.includes('Safari')) {
  // the user is running Safari
  // do something useful
}

Mặt khác, nếu bạn muốn làm điều gì đó cho tất cả các trình duyệt trừ

if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
5, bạn kiểm tra xem
if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
6 có bao gồm chuỗi tìm kiếm của bạn không

if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}

Sử dụng if (!navigator.userAgent.includes('Chrome')) { // the user is NOT running Chrome } 7 và if (!navigator.userAgent.includes('Chrome')) { // the user is NOT running Chrome } 8

Để thay thế cho

if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
0, bạn cũng có thể sử dụng phương pháp
if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
7. Nếu nó trả về
if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
2, điều này có nghĩa là không tìm thấy chuỗi tìm kiếm

if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}

Nếu bạn không chắc trình duyệt người dùng được viết chính xác như thế nào, bạn có thể thử sử dụng hàm

if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
8 trên
if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
4

Xin chào các bạn, Trong bài đăng này, chúng ta sẽ tìm hiểu cách giải câu đố lập trình Javascript Detect If Browser Is Not Google Chrome bằng cách sử dụng ngôn ngữ lập trình

if(!!window.chrome !== true){
	alert("Please use Google Chrome to access this site");
}

Chúng tôi đã có thể khắc phục sự cố Javascript Detect If Browser Is Not Google Chrome bằng cách xem xét một số ví dụ khác nhau

Làm cách nào để kiểm tra trình duyệt nào đang được sử dụng trong JavaScript?

JavaScript có một đối tượng tiêu chuẩn được gọi là bộ điều hướng chứa dữ liệu về trình duyệt đang được sử dụng. Phát hiện trình duyệt bằng JavaScript

Làm cách nào để biết tôi đang sử dụng IE hoặc Chrome trong JavaScript?

hãy để chromeAgent = userAgentString. indexOf(“Chrome” ) > -1; . Tác nhân người dùng của trình duyệt Internet Explorer là “MSIE” hoặc “rv. ”. 29-Jun-2022

Làm cách nào để biết trình duyệt của tôi là Chrome?

Trích xuất thông tin từ tác nhân người dùng, kiểm tra xem nó có chứa tên trình duyệt không. Ví dụ: để kiểm tra trình duyệt Chrome – if (navigator. đại lý người dùng. indexOf(“Chrome”). =06-Jan-2022

Làm cách nào bạn có thể phát hiện tên trình duyệt của khách hàng trong JavaScript?

Bạn có thể sử dụng bộ điều hướng. appName và bộ điều hướng. thuộc tính userAgent. Thuộc tính userAgent đáng tin cậy hơn appName vì, ví dụ: Firefox (và một số trình duyệt khác) có thể trả về chuỗi “Netscape” làm giá trị của navigator

Làm thế nào để bạn biết tôi đang sử dụng trình duyệt nào?

Trên thanh công cụ của trình duyệt, nhấp vào “Trợ giúp” hoặc biểu tượng Cài đặt. Nhấp vào tùy chọn menu bắt đầu “Giới thiệu” và bạn sẽ thấy loại và phiên bản trình duyệt bạn đang sử dụng. 18-Apr-2019

Các phương pháp phổ biến để phát hiện loại trình duyệt đang chạy trên máy khách là gì?

Các phương pháp phổ biến để phát hiện loại trình duyệt đang chạy trên máy khách là gì? . )2. 4. 2 câu hỏi

  • A. Sử dụng JavaScript để truy vấn tiêu đề userAgent
  • B. sử dụng cửa sổ. phương thức addEventListener
  • C. Sử dụng thẻ khung nhìn
  • D. Sử dụng nhà cung cấp DisplayMode

appCodeName trong JavaScript là gì?

Thuộc tính appCodeName trả về tên mã trình duyệt

Chrome có sử dụng AppleWebKit không?

AppleWebKit là mã định danh công cụ kết xuất web được sử dụng trên các thiết bị của Apple và được hỗ trợ bởi một số loại thiết bị khác như BlackBerry. KHTML là một công cụ được Safari và Chrome sử dụng

Thẻ nào được sử dụng để phát hiện JavaScript?

nhãn

Tên ứng dụng điều hướng trong Javascript là gì?

Nó được sử dụng để trả về tên của trình duyệt. Nó là một thuộc tính chỉ đọc và các giá trị được nó trả về khác nhau giữa các trình duyệt. nó trả về một chuỗi đại diện cho tên của trình duyệt. 10-Aug-2022

Cung cấp các trang web hoặc dịch vụ khác nhau cho các trình duyệt khác nhau thường là một ý tưởng tồi. Mọi người đều có thể truy cập Web, bất kể họ đang sử dụng trình duyệt hoặc thiết bị nào. Có nhiều cách để phát triển trang web của bạn dần dần tự nâng cao dựa trên tính khả dụng của các tính năng thay vì nhắm mục tiêu vào các trình duyệt cụ thể

Tuy nhiên, các trình duyệt và tiêu chuẩn không hoàn hảo và vẫn có một số trường hợp cạnh cần phát hiện trình duyệt. Sử dụng tác nhân người dùng để phát hiện trình duyệt có vẻ đơn giản, nhưng thực tế để làm tốt nó là một vấn đề rất khó. Tài liệu này sẽ hướng dẫn bạn làm điều này một cách chính xác nhất có thể

Ghi chú. Nó đáng để lặp lại. rất hiếm khi nên sử dụng đánh hơi tác nhân người dùng. Bạn hầu như luôn có thể tìm ra cách tốt hơn, tương thích rộng rãi hơn để giải quyết vấn đề của mình

Cân nhắc trước khi sử dụng tính năng phát hiện trình duyệt

Khi xem xét sử dụng chuỗi tác nhân người dùng để phát hiện trình duyệt nào đang được sử dụng, bước đầu tiên của bạn là cố gắng tránh nó nếu có thể. Bắt đầu bằng cách cố gắng xác định lý do tại sao bạn muốn làm điều đó

Bạn đang cố gắng khắc phục một lỗi cụ thể trong một số phiên bản của trình duyệt?

Tìm hoặc hỏi trong các diễn đàn chuyên ngành. bạn không phải là người đầu tiên gặp phải vấn đề này. Ngoài ra, các chuyên gia hoặc những người có quan điểm khác có thể cung cấp cho bạn các ý tưởng để khắc phục lỗi. Nếu sự cố có vẻ không phổ biến, bạn nên kiểm tra xem lỗi này đã được báo cáo cho nhà cung cấp trình duyệt thông qua hệ thống theo dõi lỗi của họ chưa (Mozilla; WebKit; Blink; Opera). Các nhà sản xuất trình duyệt chú ý đến các báo cáo lỗi và phân tích có thể gợi ý về các cách giải quyết lỗi khác

Bạn đang cố kiểm tra sự tồn tại của một tính năng cụ thể?

Trang web của bạn cần sử dụng một tính năng Web cụ thể mà một số trình duyệt chưa hỗ trợ và bạn muốn đưa những người dùng đó đến một trang Web cũ hơn với ít tính năng hơn nhưng bạn biết rằng nó sẽ hoạt động. Đây là lý do tồi tệ nhất để sử dụng phát hiện tác nhân người dùng vì tỷ lệ cược cuối cùng là tất cả các trình duyệt khác sẽ bắt kịp. Ngoài ra, việc kiểm tra mọi trình duyệt ít phổ biến hơn và kiểm tra các tính năng Web đó là không thực tế. Bạn không bao giờ nên đánh hơi tác nhân người dùng. Thay vào đó, luôn có cách khác là thực hiện phát hiện tính năng

Bạn có muốn cung cấp HTML khác tùy thuộc vào trình duyệt đang được sử dụng không?

Đây thường là một cách làm không tốt, nhưng có một số trường hợp điều này là cần thiết. Trong những trường hợp này, trước tiên bạn nên phân tích tình huống của mình để chắc chắn rằng điều đó thực sự cần thiết. Bạn có thể ngăn chặn nó bằng cách thêm một số yếu tố

if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
1 hoặc
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
2 phi ngữ nghĩa không? . Ngoài ra, hãy suy nghĩ lại về thiết kế của bạn. bạn có thể sử dụng tính năng nâng cao lũy tiến hoặc bố cục linh hoạt để giúp loại bỏ nhu cầu thực hiện việc này không?

Tránh phát hiện tác nhân người dùng

Nếu bạn muốn tránh sử dụng phát hiện tác nhân người dùng, bạn có các tùy chọn

phát hiện tính năng

Phát hiện tính năng là khi bạn không cố gắng tìm ra trình duyệt nào đang hiển thị trang của mình mà thay vào đó, bạn kiểm tra xem tính năng cụ thể mà bạn cần có khả dụng hay không. Nếu không, bạn sử dụng dự phòng. Trong những trường hợp hiếm hoi khi hành vi khác nhau giữa các trình duyệt, thay vì kiểm tra chuỗi tác nhân người dùng, thay vào đó, bạn nên triển khai thử nghiệm để phát hiện cách trình duyệt triển khai API và xác định cách sử dụng nó từ đó. Một ví dụ về phát hiện tính năng như sau. Vào năm 2017, hỗ trợ giao diện thử nghiệm chưa được gắn cờ của Chrome trong các biểu thức thông thường, nhưng không có trình duyệt nào khác hỗ trợ nó. Vì vậy, bạn có thể đã nghĩ để làm điều này

// This code snippet splits a string in a special notation
let splitUpString;
if (navigator.userAgent.includes("Chrome")) {
  // YES! The user is suspected to support look-behind regexps
  // DO NOT USE /(?<=[A-Z])/. It will cause a syntax error in
  // browsers that do not support look-behind expressions
  // because all browsers parse the entire script, including
  // sections of the code that are never executed.
  const camelCaseExpression = new RegExp("(?<=[A-Z])");
  splitUpString = (str) => String(str).split(camelCaseExpression);
} else {
  // This fallback code is much less performant, but works
  splitUpString = (str) => str.replace(/[A-Z]/g, "z$1").split(/z(?=[A-Z])/g);
}

console.log(splitUpString("fooBare")); // ["fooB", "are"]
console.log(splitUpString("jQWhy")); // ["jQ", "W", "hy"]

Đoạn mã trên sẽ đưa ra một số giả định không chính xác. Đầu tiên, giả định rằng tất cả các chuỗi tác nhân người dùng bao gồm chuỗi con "Chrome" đều là Chrome. Chuỗi UA nổi tiếng là gây hiểu nhầm. Sau đó, giả định rằng tính năng tìm kiếm sẽ luôn khả dụng nếu trình duyệt là Chrome. Tác nhân có thể là phiên bản Chrome cũ hơn, từ trước khi hỗ trợ được thêm vào hoặc (vì tính năng này đang được thử nghiệm vào thời điểm đó) nên có thể là phiên bản Chrome mới hơn đã loại bỏ tác nhân đó. Quan trọng nhất, nó cho rằng không có trình duyệt nào khác hỗ trợ tính năng này. Hỗ trợ có thể đã được thêm vào các trình duyệt khác bất cứ lúc nào, nhưng mã này sẽ tiếp tục chọn con đường kém hơn

Thay vào đó, có thể tránh được các sự cố như thế này bằng cách kiểm tra sự hỗ trợ của chính tính năng đó

________số 8

Như đoạn mã trên chứng minh, luôn có cách để kiểm tra hỗ trợ trình duyệt mà không cần tác nhân người dùng đánh hơi. Không bao giờ có bất kỳ lý do gì để kiểm tra chuỗi tác nhân người dùng cho việc này

Cuối cùng, các đoạn mã trên gây ra một vấn đề nghiêm trọng với mã hóa trên nhiều trình duyệt luôn phải được tính đến. Không vô tình sử dụng API mà bạn đang thử nghiệm trong các trình duyệt không được hỗ trợ. Điều này nghe có vẻ hiển nhiên và đơn giản, nhưng đôi khi không phải vậy. Ví dụ: trong đoạn mã trên, việc sử dụng lookbehind trong ký hiệu biểu thức chính quy ngắn (ví dụ: /reg/igm) sẽ gây ra lỗi trình phân tích cú pháp trong các trình duyệt không được hỗ trợ. Vì vậy, trong ví dụ trên, bạn sẽ sử dụng new RegExp("(?<=look_behind_stuff)");

Tăng cường tiến bộ

Kỹ thuật thiết kế này liên quan đến việc phát triển trang Web của bạn theo 'lớp', sử dụng cách tiếp cận từ dưới lên, bắt đầu với lớp đơn giản hơn và cải thiện khả năng của trang web trong các lớp liên tiếp, mỗi lớp sử dụng nhiều tính năng hơn

Thoái hóa biến chất

Đây là cách tiếp cận từ trên xuống, trong đó bạn xây dựng trang web tốt nhất có thể bằng cách sử dụng tất cả các tính năng bạn muốn, sau đó tinh chỉnh nó để làm cho nó hoạt động trên các trình duyệt cũ hơn. Điều này có thể khó thực hiện và kém hiệu quả hơn so với tăng cường lũy ​​tiến, nhưng có thể hữu ích trong một số trường hợp

phát hiện thiết bị di động

Có thể cho rằng việc sử dụng phổ biến nhất và lạm dụng việc đánh hơi tác nhân người dùng là để phát hiện xem thiết bị có phải là thiết bị di động hay không. Tuy nhiên, mọi người thường bỏ qua những gì họ thực sự theo đuổi. Mọi người sử dụng tác nhân người dùng đánh hơi để phát hiện xem thiết bị của người dùng có thân thiện với cảm ứng và có màn hình nhỏ hay không để họ có thể tối ưu hóa trang web của mình cho phù hợp. Mặc dù việc đánh hơi tác nhân người dùng đôi khi có thể phát hiện ra những điều này, nhưng không phải tất cả các thiết bị đều giống nhau. một số thiết bị di động có kích thước màn hình lớn, một số máy tính để bàn có màn hình cảm ứng nhỏ, một số người sử dụng TV thông minh, đây hoàn toàn là một trò chơi bóng hoàn toàn khác và một số người có thể tự động thay đổi chiều rộng và chiều cao của màn hình bằng cách lật máy tính bảng của họ sang một bên. Vì vậy, đánh hơi tác nhân người dùng chắc chắn không phải là cách để đi. Rất may, có nhiều lựa chọn thay thế tốt hơn. Sử dụng Bộ điều hướng. maxTouchPoints để phát hiện xem thiết bị của người dùng có màn hình cảm ứng hay không. Sau đó, mặc định quay lại kiểm tra màn hình tác nhân người dùng chỉ khi (. ("maxTouchPoints" trong bộ điều hướng)) { /*Mã tại đây*/}. Sử dụng thông tin này để biết thiết bị có màn hình cảm ứng hay không, không thay đổi toàn bộ bố cục của trang web chỉ dành cho thiết bị cảm ứng. bạn sẽ chỉ tạo thêm công việc và bảo trì cho chính mình. Thay vào đó, hãy thêm các tiện ích liên lạc như các nút lớn hơn, dễ bấm hơn (bạn có thể làm điều này bằng cách sử dụng CSS bằng cách tăng kích thước phông chữ). Dưới đây là một ví dụ về mã tăng phần đệm của #exampleButton lên 1em trên thiết bị di động

let hasTouchScreen = false;
if ("maxTouchPoints" in navigator) {
  hasTouchScreen = navigator.maxTouchPoints > 0;
} else if ("msMaxTouchPoints" in navigator) {
  hasTouchScreen = navigator.msMaxTouchPoints > 0;
} else {
  const mQ = matchMedia?.("(pointer:coarse)");
  if (mQ?.media === "(pointer:coarse)") {
    hasTouchScreen = !!mQ.matches;
  } else if ("orientation" in window) {
    hasTouchScreen = true; // deprecated, but good fallback
  } else {
    // Only as a last resort, fall back to user agent sniffing
    const UA = navigator.userAgent;
    hasTouchScreen =
      /\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
      /\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA);
  }
}

if (hasTouchScreen) {
  document.getElementById("exampleButton").style.padding = "1em";
}

Đối với kích thước màn hình, hãy sử dụng cửa sổ. chiều rộng bên trong và cửa sổ. addEventListener("resize", () => { /*refresh những thứ phụ thuộc vào kích thước màn hình*/ }). Điều bạn muốn làm đối với kích thước màn hình không phải là cắt giảm thông tin trên màn hình nhỏ hơn. Điều đó sẽ chỉ làm phiền mọi người vì nó sẽ buộc họ phải sử dụng phiên bản dành cho máy tính để bàn. Thay vào đó, hãy cố gắng có ít cột thông tin hơn trên trang dài hơn trên màn hình nhỏ hơn trong khi có nhiều cột hơn với trang ngắn hơn trên kích thước màn hình lớn hơn. Có thể dễ dàng đạt được hiệu ứng này bằng cách sử dụng hộp linh hoạt CSS, đôi khi có số float dưới dạng dự phòng một phần

Ngoài ra, hãy cố gắng di chuyển thông tin ít liên quan/quan trọng hơn xuống dưới cùng và nhóm nội dung của trang lại với nhau một cách có ý nghĩa. Mặc dù không có chủ đề, nhưng có lẽ ví dụ chi tiết sau đây có thể cung cấp cho bạn thông tin chi tiết và ý tưởng thuyết phục bạn từ bỏ việc đánh hơi tác nhân người dùng. Chúng ta hãy tưởng tượng một trang bao gồm các hộp thông tin; . Mỗi hộp có một hình ảnh, tổng quan và một sự thật lịch sử thú vị. Hình ảnh được giữ ở kích thước hợp lý tối đa ngay cả trên màn hình lớn. Với mục đích nhóm nội dung một cách có ý nghĩa, tất cả các hộp dành cho mèo được tách ra khỏi tất cả các hộp dành cho chó sao cho các hộp dành cho mèo và chó không bị trộn lẫn với nhau. Trên một màn hình lớn, nó tiết kiệm không gian để có nhiều cột để giảm không gian lãng phí ở bên trái và bên phải của hình ảnh. Các hộp có thể được tách thành nhiều cột thông qua hai phương pháp công bằng như nhau. Từ thời điểm này trở đi, chúng ta sẽ giả sử rằng tất cả các hộp dành cho chó nằm ở đầu mã nguồn, rằng tất cả các hộp dành cho mèo ở cuối mã nguồn và tất cả các hộp này đều có cùng một phần tử cha. Tất nhiên, có một ví dụ duy nhất về hộp dành cho chó ngay phía trên hộp dành cho mèo. Phương pháp đầu tiên sử dụng các Hộp linh hoạt theo chiều ngang để nhóm nội dung sao cho khi trang được hiển thị cho người dùng cuối, tất cả các hộp dành cho chó nằm ở đầu trang và tất cả các hộp dành cho mèo ở phía dưới trang. Phương pháp thứ hai sử dụng bố cục Cột và gửi lại tất cả những con chó ở bên trái và tất cả những con mèo ở bên phải. Chỉ trong trường hợp cụ thể này, việc không cung cấp dự phòng cho các hộp linh hoạt/nhiều cột là phù hợp, dẫn đến một cột gồm các hộp rất rộng trên các trình duyệt cũ. Cũng xem xét những điều sau đây. Nếu nhiều người truy cập trang web để xem mèo, thì có thể nên đặt tất cả mèo trong mã nguồn cao hơn chó để nhiều người có thể tìm thấy những gì họ đang tìm kiếm nhanh hơn trên màn hình nhỏ hơn nơi nội dung thu gọn

Next, always make your code dynamic. The user can flip their mobile device on its side, changing the width and height of the page. Or, there might be some weird flip-phone-like device thing in the future where flipping it out extends the screen. Do not be the developer having a headache over how to deal with the flip-phone-like device thing. Never be satisfied with your webpage until you can open up the dev tools side panel and resize the screen while the webpage looks smooth, fluid, and dynamically resized. The simplest way to do this is to separate all the code that moves content around based on screen size to a single function that is called when the page is loaded and at each resize event thereafter. If there is a lot calculated by this layout function before it determines the new layout of the page, then consider debouncing the event listener such that it is not called as often. Also note that there is a huge difference between the media queries

if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
3,
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
4, and
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
5:
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
3 excludes
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
3, whereas
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
4 includes
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
3.
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
5 is a poor man's version of
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
4: do not use
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
5 because the layout might break on very high font sizes on very high definition devices in the future. Always be very deliberate about choosing the right media query and choosing the right >=, <=, >, or < in any corresponding JavaScript because it is very easy to get these mixed up, resulting in the website looking wonky right at the screen size where the layout changes. Thus, thoroughly test the website at the exact widths/heights where layout changes occur to ensure that the layout changes occur properly.

Làm tốt nhất việc đánh hơi tác nhân người dùng

Sau khi xem xét tất cả các lựa chọn thay thế tốt hơn ở trên để đánh hơi tác nhân người dùng, vẫn có một số trường hợp tiềm năng mà việc đánh hơi tác nhân người dùng là phù hợp và hợp lý

Một trong những trường hợp như vậy là sử dụng tác nhân người dùng đánh hơi làm dự phòng khi phát hiện xem thiết bị có màn hình cảm ứng hay không. Xem phần Phát hiện thiết bị di động để biết thêm thông tin

Một trường hợp khác là để sửa lỗi trong trình duyệt không tự động cập nhật. Internet Explorer (trên Windows) và Webkit (trên iOS) là hai ví dụ hoàn hảo. Trước phiên bản 9, Internet Explorer gặp sự cố với lỗi hiển thị, lỗi CSS, lỗi API, v.v. Tuy nhiên, trước phiên bản 9, Internet Explorer rất dễ bị phát hiện dựa trên các tính năng dành riêng cho trình duyệt có sẵn. Webkit tệ hơn một chút vì Apple buộc tất cả các trình duyệt trên iOS phải sử dụng Webkit nội bộ, do đó người dùng không có cách nào để có được một trình duyệt cập nhật tốt hơn trên các thiết bị cũ hơn. Hầu hết các lỗi có thể được phát hiện, nhưng một số lỗi cần nhiều nỗ lực hơn để phát hiện hơn những lỗi khác. Trong những trường hợp như vậy, có thể hữu ích khi sử dụng tính năng đánh hơi tác nhân người dùng để tiết kiệm hiệu suất. Ví dụ: Webkit 6 có lỗi theo đó khi hướng thiết bị thay đổi, trình duyệt có thể không kích hoạt trình nghe MediaQueryList khi cần. Để khắc phục lỗi này, hãy quan sát mã bên dưới

if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
0

Phần nào của tác nhân người dùng chứa thông tin bạn đang tìm kiếm?

Vì không có sự đồng nhất về phần khác nhau của chuỗi tác nhân người dùng, nên đây là phần phức tạp

Tên trình duyệt

Khi mọi người nói rằng họ muốn "phát hiện trình duyệt", thường thì họ thực sự muốn "phát hiện công cụ kết xuất". Bạn có thực sự muốn phát hiện Firefox thay vì SeaMonkey hay Chrome thay vì Chromium không?

Hầu hết các trình duyệt đặt tên và phiên bản ở định dạng BrowserName/VersionNumber, với ngoại lệ đáng chú ý là Internet Explorer. Nhưng vì tên không phải là thông tin duy nhất trong chuỗi tác nhân người dùng ở định dạng đó, bạn không thể khám phá tên của trình duyệt, bạn chỉ có thể kiểm tra xem tên bạn đang tìm kiếm. Nhưng lưu ý rằng một số trình duyệt đang nói dối. Ví dụ, Chrome báo cáo cả Chrome và Safari. Vì vậy, để phát hiện Safari, bạn phải kiểm tra chuỗi Safari và không có chuỗi Chrome, Chromium thường tự báo cáo là Chrome hoặc Seamonkey đôi khi tự báo cáo là Firefox

Ngoài ra, chú ý không sử dụng biểu thức chính quy đơn giản trên BrowserName, tác nhân người dùng cũng chứa các chuỗi bên ngoài cú pháp Keyword/Value. Chẳng hạn, Safari & Chrome chứa chuỗi 'like Gecko'

EnginePhải chứaKhông được chứaFirefox
let isLookBehindSupported = false;

try {
  new RegExp("(?<=)");
  isLookBehindSupported = true;
} catch (err) {
  // If the agent doesn't support look behinds, the attempted
  // creation of a RegExp object using that syntax throws and
  // isLookBehindSupported remains false.
}

const splitUpString = isLookBehindSupported
  ? (str) => String(str).split(new RegExp("(?<=[A-Z])"))
  : (str) => str.replace(/[A-Z]/g, "z$1").split(/z(?=[A-Z])/g);
6
let isLookBehindSupported = false;

try {
  new RegExp("(?<=)");
  isLookBehindSupported = true;
} catch (err) {
  // If the agent doesn't support look behinds, the attempted
  // creation of a RegExp object using that syntax throws and
  // isLookBehindSupported remains false.
}

const splitUpString = isLookBehindSupported
  ? (str) => String(str).split(new RegExp("(?<=[A-Z])"))
  : (str) => str.replace(/[A-Z]/g, "z$1").split(/z(?=[A-Z])/g);
7Seamonkey
let isLookBehindSupported = false;

try {
  new RegExp("(?<=)");
  isLookBehindSupported = true;
} catch (err) {
  // If the agent doesn't support look behinds, the attempted
  // creation of a RegExp object using that syntax throws and
  // isLookBehindSupported remains false.
}

const splitUpString = isLookBehindSupported
  ? (str) => String(str).split(new RegExp("(?<=[A-Z])"))
  : (str) => str.replace(/[A-Z]/g, "z$1").split(/z(?=[A-Z])/g);
7Chrome
let isLookBehindSupported = false;

try {
  new RegExp("(?<=)");
  isLookBehindSupported = true;
} catch (err) {
  // If the agent doesn't support look behinds, the attempted
  // creation of a RegExp object using that syntax throws and
  // isLookBehindSupported remains false.
}

const splitUpString = isLookBehindSupported
  ? (str) => String(str).split(new RegExp("(?<=[A-Z])"))
  : (str) => str.replace(/[A-Z]/g, "z$1").split(/z(?=[A-Z])/g);
9
let hasTouchScreen = false;
if ("maxTouchPoints" in navigator) {
  hasTouchScreen = navigator.maxTouchPoints > 0;
} else if ("msMaxTouchPoints" in navigator) {
  hasTouchScreen = navigator.msMaxTouchPoints > 0;
} else {
  const mQ = matchMedia?.("(pointer:coarse)");
  if (mQ?.media === "(pointer:coarse)") {
    hasTouchScreen = !!mQ.matches;
  } else if ("orientation" in window) {
    hasTouchScreen = true; // deprecated, but good fallback
  } else {
    // Only as a last resort, fall back to user agent sniffing
    const UA = navigator.userAgent;
    hasTouchScreen =
      /\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
      /\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA);
  }
}

if (hasTouchScreen) {
  document.getElementById("exampleButton").style.padding = "1em";
}
0Chromium
let hasTouchScreen = false;
if ("maxTouchPoints" in navigator) {
  hasTouchScreen = navigator.maxTouchPoints > 0;
} else if ("msMaxTouchPoints" in navigator) {
  hasTouchScreen = navigator.msMaxTouchPoints > 0;
} else {
  const mQ = matchMedia?.("(pointer:coarse)");
  if (mQ?.media === "(pointer:coarse)") {
    hasTouchScreen = !!mQ.matches;
  } else if ("orientation" in window) {
    hasTouchScreen = true; // deprecated, but good fallback
  } else {
    // Only as a last resort, fall back to user agent sniffing
    const UA = navigator.userAgent;
    hasTouchScreen =
      /\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
      /\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA);
  }
}

if (hasTouchScreen) {
  document.getElementById("exampleButton").style.padding = "1em";
}
0Safari
let hasTouchScreen = false;
if ("maxTouchPoints" in navigator) {
  hasTouchScreen = navigator.maxTouchPoints > 0;
} else if ("msMaxTouchPoints" in navigator) {
  hasTouchScreen = navigator.msMaxTouchPoints > 0;
} else {
  const mQ = matchMedia?.("(pointer:coarse)");
  if (mQ?.media === "(pointer:coarse)") {
    hasTouchScreen = !!mQ.matches;
  } else if ("orientation" in window) {
    hasTouchScreen = true; // deprecated, but good fallback
  } else {
    // Only as a last resort, fall back to user agent sniffing
    const UA = navigator.userAgent;
    hasTouchScreen =
      /\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
      /\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA);
  }
}

if (hasTouchScreen) {
  document.getElementById("exampleButton").style.padding = "1em";
}
2
let isLookBehindSupported = false;

try {
  new RegExp("(?<=)");
  isLookBehindSupported = true;
} catch (err) {
  // If the agent doesn't support look behinds, the attempted
  // creation of a RegExp object using that syntax throws and
  // isLookBehindSupported remains false.
}

const splitUpString = isLookBehindSupported
  ? (str) => String(str).split(new RegExp("(?<=[A-Z])"))
  : (str) => str.replace(/[A-Z]/g, "z$1").split(/z(?=[A-Z])/g);
9 hoặc
let hasTouchScreen = false;
if ("maxTouchPoints" in navigator) {
  hasTouchScreen = navigator.maxTouchPoints > 0;
} else if ("msMaxTouchPoints" in navigator) {
  hasTouchScreen = navigator.msMaxTouchPoints > 0;
} else {
  const mQ = matchMedia?.("(pointer:coarse)");
  if (mQ?.media === "(pointer:coarse)") {
    hasTouchScreen = !!mQ.matches;
  } else if ("orientation" in window) {
    hasTouchScreen = true; // deprecated, but good fallback
  } else {
    // Only as a last resort, fall back to user agent sniffing
    const UA = navigator.userAgent;
    hasTouchScreen =
      /\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
      /\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA);
  }
}

if (hasTouchScreen) {
  document.getElementById("exampleButton").style.padding = "1em";
}
0Opera 15+ (công cụ dựa trên Blink)
let hasTouchScreen = false;
if ("maxTouchPoints" in navigator) {
  hasTouchScreen = navigator.maxTouchPoints > 0;
} else if ("msMaxTouchPoints" in navigator) {
  hasTouchScreen = navigator.msMaxTouchPoints > 0;
} else {
  const mQ = matchMedia?.("(pointer:coarse)");
  if (mQ?.media === "(pointer:coarse)") {
    hasTouchScreen = !!mQ.matches;
  } else if ("orientation" in window) {
    hasTouchScreen = true; // deprecated, but good fallback
  } else {
    // Only as a last resort, fall back to user agent sniffing
    const UA = navigator.userAgent;
    hasTouchScreen =
      /\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
      /\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA);
  }
}

if (hasTouchScreen) {
  document.getElementById("exampleButton").style.padding = "1em";
}
5Opera 12- (công cụ dựa trên Presto)
let hasTouchScreen = false;
if ("maxTouchPoints" in navigator) {
  hasTouchScreen = navigator.maxTouchPoints > 0;
} else if ("msMaxTouchPoints" in navigator) {
  hasTouchScreen = navigator.msMaxTouchPoints > 0;
} else {
  const mQ = matchMedia?.("(pointer:coarse)");
  if (mQ?.media === "(pointer:coarse)") {
    hasTouchScreen = !!mQ.matches;
  } else if ("orientation" in window) {
    hasTouchScreen = true; // deprecated, but good fallback
  } else {
    // Only as a last resort, fall back to user agent sniffing
    const UA = navigator.userAgent;
    hasTouchScreen =
      /\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
      /\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA);
  }
}

if (hasTouchScreen) {
  document.getElementById("exampleButton").style.padding = "1em";
}
6Internet Explorer 10-
let hasTouchScreen = false;
if ("maxTouchPoints" in navigator) {
  hasTouchScreen = navigator.maxTouchPoints > 0;
} else if ("msMaxTouchPoints" in navigator) {
  hasTouchScreen = navigator.msMaxTouchPoints > 0;
} else {
  const mQ = matchMedia?.("(pointer:coarse)");
  if (mQ?.media === "(pointer:coarse)") {
    hasTouchScreen = !!mQ.matches;
  } else if ("orientation" in window) {
    hasTouchScreen = true; // deprecated, but good fallback
  } else {
    // Only as a last resort, fall back to user agent sniffing
    const UA = navigator.userAgent;
    hasTouchScreen =
      /\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
      /\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA);
  }
}

if (hasTouchScreen) {
  document.getElementById("exampleButton").style.padding = "1em";
}
7Internet Explorer 11
let hasTouchScreen = false;
if ("maxTouchPoints" in navigator) {
  hasTouchScreen = navigator.maxTouchPoints > 0;
} else if ("msMaxTouchPoints" in navigator) {
  hasTouchScreen = navigator.msMaxTouchPoints > 0;
} else {
  const mQ = matchMedia?.("(pointer:coarse)");
  if (mQ?.media === "(pointer:coarse)") {
    hasTouchScreen = !!mQ.matches;
  } else if ("orientation" in window) {
    hasTouchScreen = true; // deprecated, but good fallback
  } else {
    // Only as a last resort, fall back to user agent sniffing
    const UA = navigator.userAgent;
    hasTouchScreen =
      /\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
      /\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA);
  }
}

if (hasTouchScreen) {
  document.getElementById("exampleButton").style.padding = "1em";
}
8

[1] Safari cung cấp hai số phiên bản. một kỹ thuật trong mã thông báo

let hasTouchScreen = false;
if ("maxTouchPoints" in navigator) {
  hasTouchScreen = navigator.maxTouchPoints > 0;
} else if ("msMaxTouchPoints" in navigator) {
  hasTouchScreen = navigator.msMaxTouchPoints > 0;
} else {
  const mQ = matchMedia?.("(pointer:coarse)");
  if (mQ?.media === "(pointer:coarse)") {
    hasTouchScreen = !!mQ.matches;
  } else if ("orientation" in window) {
    hasTouchScreen = true; // deprecated, but good fallback
  } else {
    // Only as a last resort, fall back to user agent sniffing
    const UA = navigator.userAgent;
    hasTouchScreen =
      /\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
      /\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA);
  }
}

if (hasTouchScreen) {
  document.getElementById("exampleButton").style.padding = "1em";
}
2 và một tính năng thân thiện với người dùng trong mã thông báo
if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
00

Tất nhiên, hoàn toàn không có gì đảm bảo rằng một trình duyệt khác sẽ không chiếm đoạt một số thứ này (như Chrome đã chiếm đoạt chuỗi Safari trong quá khứ). Đó là lý do tại sao việc phát hiện trình duyệt bằng chuỗi tác nhân người dùng là không đáng tin cậy và chỉ nên được thực hiện khi kiểm tra số phiên bản (việc chiếm đoạt các phiên bản trước ít có khả năng xảy ra hơn)

phiên bản trình duyệt

Phiên bản trình duyệt thường, nhưng không phải luôn luôn, đặt vào phần giá trị của mã thông báo BrowserName/VersionNumber trong Chuỗi tác nhân người dùng. Tất nhiên, đây không phải là trường hợp của Internet Explorer (đặt số phiên bản ngay sau mã thông báo MSIE) và đối với Opera sau phiên bản 10, đã thêm mã thông báo Phiên bản/Số phiên bản

Một lần nữa, hãy đảm bảo lấy đúng mã thông báo cho trình duyệt bạn đang tìm kiếm, vì không có gì đảm bảo rằng những mã thông báo khác sẽ chứa số hợp lệ

Công cụ dựng hình

Như đã thấy trước đó, trong hầu hết các trường hợp, tìm kiếm công cụ kết xuất là cách tốt hơn để thực hiện. Điều này sẽ giúp không loại trừ các trình duyệt ít được biết đến hơn. Các trình duyệt chia sẻ một công cụ kết xuất chung sẽ hiển thị một trang theo cùng một cách. nó thường là một giả định công bằng rằng những gì sẽ làm việc trong một sẽ làm việc khác

Có năm công cụ kết xuất chính. Đinh ba, Tắc kè, Presto, Blink và WebKit. Vì việc đánh hơi tên công cụ kết xuất là phổ biến, nên nhiều tác nhân người dùng đã thêm các tên kết xuất khác để kích hoạt phát hiện. Do đó, điều quan trọng là phải chú ý để không kích hoạt dương tính giả khi phát hiện công cụ kết xuất

EnginePhải chứaCommentGecko
if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
01WebKit
if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
02Chú ý, trình duyệt WebKit thêm chuỗi 'like Gecko' có thể kích hoạt dương tính giả cho Gecko nếu phát hiện không cẩn thận. Presto
let hasTouchScreen = false;
if ("maxTouchPoints" in navigator) {
  hasTouchScreen = navigator.maxTouchPoints > 0;
} else if ("msMaxTouchPoints" in navigator) {
  hasTouchScreen = navigator.msMaxTouchPoints > 0;
} else {
  const mQ = matchMedia?.("(pointer:coarse)");
  if (mQ?.media === "(pointer:coarse)") {
    hasTouchScreen = !!mQ.matches;
  } else if ("orientation" in window) {
    hasTouchScreen = true; // deprecated, but good fallback
  } else {
    // Only as a last resort, fall back to user agent sniffing
    const UA = navigator.userAgent;
    hasTouchScreen =
      /\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
      /\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA);
  }
}

if (hasTouchScreen) {
  document.getElementById("exampleButton").style.padding = "1em";
}
6Note. Presto không còn được sử dụng trong các bản dựng trình duyệt Opera >= phiên bản 15 (xem 'Blink')Trident
if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
04Internet Explorer đặt mã thông báo này trong phần nhận xét của Tác nhân người dùng StringEdgeHTML
if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
05Edge không phải Chromium đặt phiên bản công cụ của nó sau Edge/ mã thông báo, không phải ứng dụng . Ghi chú. EdgeHTML không còn được sử dụng trong các bản dựng trình duyệt Edge >= phiên bản 79 (xem 'Blink'). Chớp mắt
let isLookBehindSupported = false;

try {
  new RegExp("(?<=)");
  isLookBehindSupported = true;
} catch (err) {
  // If the agent doesn't support look behinds, the attempted
  // creation of a RegExp object using that syntax throws and
  // isLookBehindSupported remains false.
}

const splitUpString = isLookBehindSupported
  ? (str) => String(str).split(new RegExp("(?<=[A-Z])"))
  : (str) => str.replace(/[A-Z]/g, "z$1").split(/z(?=[A-Z])/g);
9

Phiên bản động cơ kết xuất

Hầu hết các công cụ kết xuất đặt số phiên bản trong mã thông báo RenderingEngine/VersionNumber, với ngoại lệ đáng chú ý là Gecko. Gecko đặt số phiên bản Gecko trong phần nhận xét của Tác nhân người dùng sau chuỗi

if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
07. Từ Gecko 14 cho phiên bản di động và Gecko 17 cho phiên bản máy tính để bàn, nó cũng đặt giá trị này vào mã thông báo
if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
08 (phiên bản trước đặt ngày xây dựng ở đó, sau đó là một ngày cố định được gọi là GeckoTrail)

hệ điều hành

Hệ điều hành được cung cấp trong hầu hết các chuỗi Tác nhân người dùng (mặc dù không phải là nền tảng tập trung vào web như Firefox OS), nhưng định dạng thay đổi rất nhiều. Nó là một chuỗi cố định giữa hai dấu chấm phẩy, trong phần comment của User Agent. Các chuỗi này dành riêng cho từng trình duyệt. Chúng cho biết hệ điều hành, nhưng cũng thường là phiên bản và thông tin về phần cứng phụ thuộc (32 hoặc 64 bit hoặc Intel/PPC cho Mac)

Giống như trong mọi trường hợp, các chuỗi này có thể thay đổi trong tương lai, người ta chỉ nên sử dụng chúng cùng với việc phát hiện các trình duyệt đã phát hành. Một cuộc khảo sát công nghệ phải được thực hiện để điều chỉnh tập lệnh khi các phiên bản trình duyệt mới sắp ra mắt

Di động, Máy tính bảng hoặc Máy tính để bàn

Lý do phổ biến nhất để thực hiện đánh hơi tác nhân người dùng là để xác định loại thiết bị mà trình duyệt chạy trên đó. Mục tiêu là phân phát HTML khác nhau cho các loại thiết bị khác nhau

  • Đừng bao giờ cho rằng trình duyệt hoặc công cụ kết xuất chỉ chạy trên một loại thiết bị. Đặc biệt là không tạo các giá trị mặc định khác nhau cho các trình duyệt hoặc công cụ hiển thị khác nhau
  • Không bao giờ sử dụng mã thông báo hệ điều hành để xác định xem trình duyệt trên thiết bị di động, máy tính bảng hay máy tính để bàn. Hệ điều hành có thể chạy trên nhiều loại (ví dụ: Android chạy trên máy tính bảng cũng như điện thoại)

Bảng sau đây tóm tắt cách các nhà cung cấp trình duyệt phổ biến chỉ ra rằng trình duyệt của họ đang chạy trên thiết bị di động

BrowserRuleExampleMozilla (Gecko, Firefox)
if (!navigator.userAgent.includes('Chrome')) {
  // the user is NOT running Chrome
}
09 hoặc
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
10 bên trong bình luận. Mã thông báo dựa trên
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
11WebKit (Android, Safari)
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
12 bên ngoài nhận xét.
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
13Dựa trên liên kết nháy mắt (Chromium, Google Chrome, Opera 15+, Edge trên Android)
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
12 mã thông báo bên ngoài nhận xét. Mã thông báo dựa trên
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
15Dựa trên Presto (Opera 12-)
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
16 bên trong nhận xét. Mã thông báo
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
17Internet Explorer____418 trong nhận xét. Mã thông báo
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
19Edge trên Windows 10 Mobile
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
20 và
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
21 bên ngoài nhận xét.
if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
22

Tóm lại, chúng tôi khuyên bạn nên tìm chuỗi

if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
23 ở bất kỳ đâu trong Tác nhân người dùng để phát hiện thiết bị di động

Ghi chú. Nếu thiết bị đủ lớn để thiết bị không được đánh dấu bằng

if (navigator.userAgent.indexOf('Chrome') < 0) {
  // the user is NOT running Chrome
}
23, thì bạn nên phân phát trang web dành cho máy tính để bàn của mình (theo cách tốt nhất, trang web này dù sao cũng phải hỗ trợ đầu vào cảm ứng vì ngày càng có nhiều máy tính để bàn xuất hiện với màn hình cảm ứng)

Làm cách nào bạn có thể phát hiện tên trình duyệt của khách hàng trong JS?

Bạn có thể sử dụng trình điều hướng. tên ứng dụng và trình điều hướng. thuộc tính userAgent . Thuộc tính userAgent đáng tin cậy hơn appName vì, ví dụ: Firefox (và một số trình duyệt khác) có thể trả về chuỗi "Netscape" làm giá trị của navigator.

Tại sao JavaScript không hoạt động trong Internet Explorer?

Internet Explorer . Trên tab "Bảo mật", đảm bảo vùng Internet được chọn, sau đó nhấp vào tùy chọn "Mức độ tùy chỉnh. " nút . Trong hộp thoại Security Settings – Internet Zone, kích Enable for Active Scripting trong phần Scripting.