¿Cómo enfocarse en una pestaña de Chrome que creó una notificación de escritorio?

82

Me gustaría implementar la misma funcionalidad que tiene Gmail hoy en día. Cuando llega un nuevo correo electrónico o llega un nuevo chat, aparece una ventana emergente de notificación y, si hace clic en ella, se enfoca la pestaña con Gmail.

Tengo este codigo:

var n = window.webkitNotifications.createNotification('ico.gif', 'Title', 'Text');
n.onclick = function(x) { this.cancel(); };
n.show();

Cuando hago clic en la notificación, simplemente desaparece. Ahora necesito agregar algo de código a la función onclick para abrir y enfocar la página que creó esta notificación. Sé que es posible porque GMail lo hace muy bien. Pero no logré buscar en las fuentes de Gmail (están minimizadas y ofuscadas).

¿Alguien sabe cómo hacer esto?

Frodik
fuente
this.cancel ha quedado obsoleto y eliminado en el canal actual de Canary.
Brandito

Respuestas:

107

Puede colocar window.focus () en Google Chrome. Se enfocará en esa ventana cuando se haga clic.

var n = window.webkitNotifications.createNotification('ico.gif', 'Title', 'Text');
n.onclick = function(x) { window.focus(); this.close(); };
n.show();

Abrí el inspector en Gmail, agregué el código anterior, lo moví a una pestaña diferente y lo ejecuté. La notificación apareció y, una vez que hice clic, me devolvió a Gmail.

Mohamed Mansour
fuente
3
Guauu ! ¿Así de simple? :-) Gran respuesta, gracias. Lo busqué en Google durante bastante tiempo, pero no pude encontrarlo. Ahora funciona perfectamente, gracias de nuevo.
Frodik
1
¡No hay problema! Diviértete hackeando :-)
Mohamed Mansour
No funciona ahora jsfiddle.net/l2aelba/RhHgR :(, puedo hackear como do alert () para enfocar esta ventana hacia atrás
l2aelba
2
¿Alguien sabe cómo funciona eso ahora? El código ya no se enfoca en TAB ... eso significa que en la última versión de Chrome, hacer clic en la notificación no enfoca la pestaña de la que proviene. ¿Todavía funciona en gmail?
hko
6
Esto ahora está en desuso , vea la respuesta de Oswaldo a continuación para una solución de navegador cruzado.
nickf
48

Uso de notificaciones .

if (typeof Notification !== 'undefined') {
  alert('Please us a modern version of Chrome, Firefox, Opera or Safari.');
  return;
}

Notification.requestPermission(function (permission) {
  if (permission !== 'granted') return;

  var notification = new Notification('Here is the title', {
    icon: 'http://path.to/my/icon.png',
    body: 'Some body text',
  });

  notification.onclick = function () {
    window.focus();
  };
});
Oswaldo Alvarez
fuente
window.focus();Hace el truco ! Debe marcarse como respuesta correcta.
Maxime Lafarie
3
window.focus()no funciona en chrome 60, la solución jazzcat con parent.focus()obras
pikax
Esto funciona, pero tan pronto como utilizo la opción "Crear acceso directo" y la convierto en una aplicación independiente, la redirección no funciona y abre una nueva pestaña.
Waza_Be
26

window.focus()no siempre funciona en las versiones recientes del navegador Webkit (Chrome, Safari, etc.). Pero lo parent.focus()hace.

Aquí hay un jsfiddle completo: https://jsfiddle.net/wv0w7uj7/3/

Código:

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: "You've been notified!",
    });

    notification.onclick = function () {
      parent.focus();
      window.focus(); //just in case, older browsers
      this.close();
    };
  }
}
Jazzcat
fuente
1
Es normal tener 'esto' haciendo referencia a otro contexto, así que en lugar de llamar this.close, es mejor llamar evt.target.closeal evento 'onclick': notification.onclick = function (evt) { evt.target.close(); }
Alejandro Silva
parent.focus (); ¡funciona para mi! trabajando en chrome 68.0.3440.106
Johan Morales
2

No es realmente una buena práctica usar la onclickpropiedad, use el método para addEventListenerjavascript vanilla o onpara jQuery.

var notify = new Notification('Test notification');

Vainilla:

notify.addEventListener('click', function(e) {
    window.focus();
    e.target.close();
}, false);

jQuery:

$(notify).on('click', function(e) {
    window.focus();
    e.target.close();
});
Tim
fuente
0

Debería ser en this.close()lugar de this.cancel(), así:

var n = window.webkitNotifications.createNotification('ico.gif','Title', 'Text');
n.onclick = function(x) { window.focus(); this.cancel(); };
n.show();
Nadav B
fuente