Ví dụ thông báo trên màn hình Chrome [đã đóng]


409

Làm thế nào để một người sử dụng thông báo trên màn hình Chrome ? Tôi muốn sử dụng nó trong mã của riêng tôi.

Cập nhật : Đây là một bài đăng blog giải thích các thông báo webkit với một ví dụ.


2
Tôi đã để lại câu trả lời dưới đây được cập nhật kể từ tháng 11 năm 2012, sau khi thông báo HTML không được chấp nhận. Nó có một ví dụ thực tế giống như bạn đang tìm kiếm.
Dan Dascalescu


1
Cập nhật : kể từ năm 2015, các trang web cũng có thể gửi thông báo đẩy thực sự, được gửi ngay cả khi người dùng không lướt trang web. Kiểm tra câu trả lời này
collimarco

3
Tất cả những cử tri đánh dấu nó là đã đóng phải là những người yêu thích IE / Safari. Nó là cụ thể cho thông báo trình duyệt và đặc biệt cho chrome. Nếu nó quá lạc đề thì tại sao có quá nhiều người thích nó và đánh dấu nó là ngôi sao ngay từ đầu?
prash

2
Tại sao lạc đề?
SmartManoj

Câu trả lời:


716

Trong các trình duyệt hiện đại, có hai loại thông báo:

  • Thông báo trên màn hình - đơn giản để kích hoạt, hoạt động miễn là trang được mở và có thể tự động biến mất sau vài giây
  • Thông báo cho nhân viên phục vụ - phức tạp hơn một chút, nhưng chúng có thể hoạt động ở chế độ nền (ngay cả sau khi trang bị đóng), vẫn tồn tại và các nút hành động hỗ trợ

Cuộc gọi API có cùng tham số (ngoại trừ các hành động - không khả dụng trên các thông báo trên máy tính để bàn), được ghi lại rõ ràng trên MDN và cho nhân viên dịch vụ, trên trang web Cơ bản về Web của Google .


Dưới đây là một ví dụ hoạt động về thông báo trên màn hình cho Chrome, Firefox, Opera và Safari. Lưu ý rằng vì lý do bảo mật, bắt đầu với Chrome 62, quyền cho API thông báo có thể không còn được yêu cầu từ iframe có nguồn gốc chéo , vì vậy chúng tôi không thể giới thiệu điều này bằng đoạn mã của StackOverflow. Bạn sẽ cần lưu ví dụ này trong tệp HTML trên trang web / ứng dụng của bạn và đảm bảo sử dụng localhost://hoặc HTTPS.

// request permission on page load
document.addEventListener('DOMContentLoaded', function() {
 if (!Notification) {
  alert('Desktop notifications not available in your browser. Try Chromium.');
  return;
 }

 if (Notification.permission !== 'granted')
  Notification.requestPermission();
});


function notifyMe() {
 if (Notification.permission !== 'granted')
  Notification.requestPermission();
 else {
  var notification = new Notification('Notification title', {
   icon: 'http://cdn.sstatic.net/stackexchange/img/logos/so/so-icon.png',
   body: 'Hey there! You\'ve been notified!',
  });
  notification.onclick = function() {
   window.open('http://stackoverflow.com/a/13328397/1269037');
  };
 }
}
 <button onclick="notifyMe()">Notify me!</button>

Chúng tôi đang sử dụng API thông báo W3C . Đừng nhầm lẫn điều này với API thông báo tiện ích mở rộng của Chrome , khác với API . Thông báo tiện ích mở rộng của Chrome rõ ràng chỉ hoạt động trong các tiện ích mở rộng của Chrome và không yêu cầu bất kỳ sự cho phép đặc biệt nào từ người dùng.

Thông báo W3C hoạt động trong nhiều trình duyệt (xem hỗ trợ về caniuse ) và yêu cầu sự cho phép của người dùng. Như một cách thực hành tốt nhất, đừng yêu cầu sự cho phép này ngay lập tức. Trước tiên hãy giải thích cho người dùng lý do tại sao họ muốn có thông báo và xem các mẫu thông báo đẩy khác .

Lưu ý rằng Chrome không tôn trọng biểu tượng thông báo trên Linux, do lỗi này .

Từ cuối cùng

Hỗ trợ thông báo đã liên tục thay đổi, với các API khác nhau bị phản đối trong những năm qua. Nếu bạn tò mò, hãy kiểm tra các chỉnh sửa trước đây của câu trả lời này để xem những gì đã từng hoạt động trong Chrome và để tìm hiểu câu chuyện về các thông báo HTML phong phú.

Bây giờ tiêu chuẩn mới nhất là tại https://notifying.spec.whatwg.org/ .

Về lý do tại sao có hai cuộc gọi khác nhau cho cùng một hiệu ứng, tùy thuộc vào việc bạn có làm nhân viên dịch vụ hay không - hãy xem vé này tôi đã nộp trong khi tôi làm việc tại Google .

Xem thêm notify.js để biết thư viện trợ giúp.


4
@mghaoui - phổ biến! = đúng (nhất thiết). Tôi đã đánh dấu câu này là câu trả lời đúng.
Sridhar Ratnakumar

2
window.webkitNotutions.checkPermission () sẽ đưa ra một ngoại lệ trong các trình duyệt không phải Chrome
JT Taylor

2
Đóng không phải là một phương pháp. Tôi nghĩ rằng bạn muốn thông báo.cattery ()> decadecity.net/blog/2012/10/12/webkit-notification-api >> Ngoài ra, nó dường như tự đóng.
KingOfHypocites

3
Cảm ơn bạn đã hỗ trợ, sử dụng điều này với Pizer đã giúp tôi xây dựng hệ thống thông báo.
Awijeet

3
không hoạt động trong Chrome Phiên bản 47.0.2526.80 dev-m khi hoạt động trên Mozilla Fire cáo trên Windows 8
Sarz

87

Kiểm tra thiết kếđặc tả API (vẫn là bản nháp) hoặc kiểm tra nguồn từ (trang không còn khả dụng) để biết ví dụ đơn giản: Đây chủ yếu là một cuộc gọi đến window.webkitNotifications.createNotification.

Nếu bạn muốn có một ví dụ mạnh mẽ hơn (bạn đang cố gắng tạo tiện ích mở rộng Google Chrome của riêng mình và muốn biết cách xử lý các quyền, bộ nhớ cục bộ và như vậy), hãy xem Tiện ích mở rộng Trình thông báo của Gmail : tải xuống tệp crx thay vì cài đặt nó, giải nén nó và đọc mã nguồn của nó.


Không có bất cứ điều gì hoạt động cho tất cả các trình duyệt?
Royi Namir

@Royi, Có một tiện ích mở rộng Firefox , cũng như triển khai Firefox gốc sắp ra mắt sớm hay muộn . Trong trường hợp Internet Explorer, một giải pháp khả thi sẽ là yêu cầu người dùng trang web của bạn tải xuống Chrome Frame , vì đây sẽ là một giải pháp khả thi để thông báo hoạt động. Có một số Giải pháp khác của Microsoft .
Bryan Field

7
Câu trả lời này hoàn toàn lỗi thời bởi bây giờ, 4 năm sau. @RoyiNamir: có API Thông báo. Kiểm tra câu trả lời của tôi .
Dan Dascalescu

1
Liên kết ví dụ đã chết.
Vinny

33

Có vẻ như window.webkitNotificationsđã bị phản đối và loại bỏ. Tuy nhiên, có một API mới và dường như nó cũng hoạt động trong phiên bản Firefox mới nhất.

function notifyMe() {
  // Let's check if the browser supports notifications
  if (!("Notification" in window)) {
    alert("This browser does not support desktop notification");
  }

  // Let's check if the user is okay to get some notification
  else if (Notification.permission === "granted") {
    // If it's okay let's create a notification
    var notification = new Notification("Hi there!");
  }

  // Otherwise, we need to ask the user for permission
  // Note, Chrome does not implement the permission static property
  // So we have to check for NOT 'denied' instead of 'default'
  else if (Notification.permission !== 'denied') {
    Notification.requestPermission(function (permission) {

      // Whatever the user answers, we make sure we store the information
      if(!('permission' in Notification)) {
        Notification.permission = permission;
      }

      // If the user is okay, let's create a notification
      if (permission === "granted") {
        var notification = new Notification("Hi there!");
      }
    });
  } else {
    alert(`Permission is ${Notification.permission}`);
  }
}

codepen


@Miron Hãy xem siêu liên kết trong đoạn đầu tiên. Tôi đã liên kết nguồn, và sau đó sao chép mã vào câu trả lời của tôi theo nghi thức SO. Nếu MDN không phải là wiki tôi có thể đã rõ ràng hơn về tác giả là ai, nhưng tôi không giả vờ bất cứ điều gì.
mở

Tôi không thấy nơi ông nói ông đã viết nó?
Brandito

codepen không hoạt động
Stepan Yakovenko

1
@StepanYakovenko Thử lại liên kết codepen. Tôi đã thêm một phần bổ sung elsevào cuối để cho bạn biết vấn đề là gì. Bạn có thể thông báo khuyết tật trên toàn cầu thích tôi: \
mpen

14

Tôi thích: http://www.html5rocks.com/en/tutorials/notifying/quick/#toc-examples nhưng nó sử dụng các biến cũ, vì vậy bản demo không hoạt động nữa. webkitNotificationstại là Notification.


Ví dụ Twitter không còn hoạt động.
Dan Dascalescu

Bạn nên nói với html5rocks.com/en/profiles Một trong số họ phải làm việc cho Twitter =)
Rudie

Heh. Hakim là người tốt nhất để thông báo , vì tôi tình cờ đã đóng góp cho khung trình bày của anh ấy.
Dan Dascalescu

4

Tôi đã thực hiện gói thông báo đơn giản này. Nó hoạt động trên Chrome, Safari và Firefox.

Có lẽ trên Opera, IE và Edge cũng vậy nhưng tôi chưa thử nghiệm nó.

Chỉ cần lấy tệp notify.js từ đây https://github.com/gravmatt/js-notify và đưa nó vào trang của bạn.

Nhận nó trên Bower

$ bower install js-notify

Đây là cách nó hoạt động:

notify('title', {
    body: 'Notification Text',
    icon: 'path/to/image.png',
    onclick: function(e) {}, // e -> Notification object
    onclose: function(e) {},
    ondenied: function(e) {}
  });

Bạn phải đặt tiêu đề nhưng đối tượng json làm đối số thứ hai là tùy chọn.


@gravmatt bạn có gặp phải sự cố với Firefox không, nếu có nhiều hơn thì một cửa sổ trình duyệt mở ra, thông báo không xuất hiện?
eran otzap

@eranotzap nó nên hoạt động với nhiều tab. Tôi chạy một dự án mà điều này không có vấn đề. nhưng tôi không chắc chắn với nhiều cửa sổ.
gravmatt

Tôi có cùng một vấn đề với nhiều tab
eran otzap

Nó có hoạt động từ nhiều tab trong Firefox không?
eran otzap

1
@eranotzap Tôi đã thử nó ngay bây giờ trên windows và mac. Tôi không thể thấy thông báo ở bất kỳ góc nào của màn hình nhưng tôi nghe thấy âm thanh của thông báo và trên mac tôi nhận được thông báo trong thanh bên (có nhiều tab mở). Firefox là nhà thám hiểm internet mới.
gravmatt



3
<!DOCTYPE html>

<html>

<head>
<title>Hello!</title>
<script>
function notify(){

if (Notification.permission !== "granted") {
Notification.requestPermission();
}
 else{
var notification = new Notification('hello', {
  body: "Hey there!",
});
notification.onclick = function () {
  window.open("http://google.com");
};
}
}
</script>
</head>

<body>
<button onclick="notify()">Notify</button>
</body>


1
Xin vui lòng không đăng câu trả lời chỉ mã. Thêm một chút bình luận và / hoặc giải thích, để khi mọi người đọc bài đăng này trong tương lai họ sẽ hiểu nó.
Adriaan

Đối với đoạn mã đặc biệt này, có vẻ như khá đơn giản. Những người dùng khác cũng có thể đăng câu hỏi tiếp theo trên bình luận, phải không?
frostshoxx

1
JSfiddle với mã ở trên không hoạt động, "Quyền cho API thông báo có thể không còn được yêu cầu từ iframe có nguồn gốc chéo.". Tuy nhiên, khi bạn mở Bảng điều khiển dành cho nhà phát triển và nhập Notification.requestPermission();thì var notification = new Notification('hello', { body: "Hey there!", });thông báo sẽ hiển thị.
Kai Noack

Tôi xin lỗi, nhưng chính xác câu trả lời này thêm gì cho tôi?
Dan Dascalescu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.