• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[HOW-TO/TUTORIAL] Beispiel für HTML5 Webnotification - derzeit nur in Chrome+Firefox

mikdoe

Moderator
Bisschen was zum spielen.
Das war das Maximum an Funktionen, was ich für die beiden einzigen Desktopbrowser finden konnte, die HTML5 Webnoti beherrschen (Chrome und Firefox).
HTML:
<!DOCTYPE html>

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Language" content="de">
<meta name="google" content="notranslate">
<title>Test HTML 5 Notification</title>
<style type="text/css">
body {
	font-family:Arial;
	font-size:12px;
}
</style>
<script>
function webnotification(title,options,click,clo,btn) {
	"use strict";
	var sendNotification;
	var defaultaction = function(title,options,click,clo) {
		var noti = new Notification(title,options);
		noti.addEventListener('click',click,false);
		noti.addEventListener('close',clo,false);
	};
	if (window.webkitNotifications) {	// Chrome, muss zu oberst abgefragt werden, weil er auch die Methode Notification kennt
		if (window.webkitNotifications.checkPermission() == 0) {	// 0=PERMISSION_ALLOWED; 1=PERMISSION_NOT_ALLOWED; 2=PERMISSION_DENIED
			sendNotification = defaultaction;
		}
		else {
			// ACHTUNG: Chrome lässt requestPermission nur zu, wenn es durch einen Eventhandler aufgerufen wird, der durch eine Benutzeraktion angestossen wurde!
			btn.onclick = function() {
				window.webkitNotifications.requestPermission();
				btn.style.display = 'none';
			}
			if (btn.style.display = 'none') { btn.style.display = ''; }
		}
	}
	else if ("Notification" in window) {	// Firefox
		if (Notification.permission === "granted") {
			sendNotification = defaultaction;
		}
		else if (Notification.permission !== 'denied') {
			Notification.requestPermission(function(permission) {
				if (!('permission' in Notification)) {
					Notification.permission = permission;
				}
			});
		}
	}
	if (sendNotification) {
		sendNotification(title,options,click,clo);
		return true;
	}
	else { return false; }
}
</script>
</head>

<body>

<script>
function sende() {
	var title = 'Testnoti';
	var dat = new Date();
	var options = {
		body:	'Testnoti Body',
		icon:	'http://www.slipway.de/images/ico_bell.png',
		id:		dat.getMilliseconds()
	};
	var klick_aufruf = function() {
		alert('angeklickt ID '+options['id']);
	};
	var klick_close = function() {
		alert('geschlossen ID '+options['id']);
	};
	var button_zulassen = document.createElement('input');
	button_zulassen.value = 'Notificationberechtigung anstossen';
	button_zulassen.type = 'button';
	button_zulassen.style.display = 'none';
	document.getElementById('schalter').appendChild(button_zulassen);

	var ret = webnotification(title,options,klick_aufruf,klick_close,button_zulassen);
	document.getElementById('testergebnis').innerHTML = 'Senden war '+(ret ? 'erfolgreich' : 'nicht erfolgreich');
}

</script>

<h1>Test HTML 5 Webnotification</h1>

<div><input onclick="sende();" type="button" value="Test"></div>
<div id="testergebnis"></div>

<div id="schalter"> <br></div>

<div>
 <br> <br> <br>
Links:<br>
<a href="https://developer.mozilla.org/en-US/docs/Web/API/notification#Browser_compatibility" target="_new">Browser Kompatibilität</a><br>
<a href="http://www.html5rocks.com/en/tutorials/notifications/quick/?redirect_from_locale=de" target="_new">Using the Notifications API Ernest Delgado</a><br>
</div>

</body>
</html>
 
Zuletzt bearbeitet:
Coole Spielerei. Leider für den Produktiveinsatz noch nicht geeignet, da es noch von zu wenig Browsern unterstützt wird...
 
Was mich nur mal wieder verrückt macht ist dieser verd.... Firefox. Wieso kann der sich nicht einfach an die Spec halten? Der blendet die Noti nur 4 Sekunden ein und schließt dann und feuert auch noch onclose, das scheint sogar hardcoded zu sein. Laut Spec muss es angezeigt werden, bis der User es schließt (Eventhandler onclose) oder bestätigt (Eventhandler onclick). Aber nein, der Firefox muss es anders machen. Scheint bei der Änderung der Notification Api in die HTML 5 Webnotification irgendwo um Version 10 herum passiert zu sein, was ich recherchieren konnte. In about:config konnte ich keinen Eintrag finden, der entweder begrifflich oder wertmäßig passend wäre.
Weiß da jemand mehr drüber?
Chrome macht es übrigens richtig, exakt nach Spec, Noti bleibt auf, bis der User sie entweder schließt oder anklickt.
 
Ich hätte jetzt gewettet, dass das so sein muss. Eigentlich finde ich das vom FF auch gar nicht so schlecht, denn die Noti muss ja nicht offen bleiben. Aber du hast schon Recht, der einzige Browser der wirklich Spec. Konform ist, ist der Chrome. Alle anderen machen ab und zu ihr eigenes Ding.
 
Alle anderen machen ab und zu ihr eigenes Ding.
Ab und zu? Ein echter Schenkelklopfer. :)

Das blöde an der automatischen Schließung ist halt, dass man es nicht sieht, wenn man gerade tippt. Und nach 4 Sekunden ist es weg. Ich baue also jetzt eine Umgehungslösung mithilfe von localStorage, dass ich es selbst alle paar Sekunden anzeige. Ätzend.
 
Ab und zu? Ein echter Schenkelklopfer. :)
Ja, ich wollte nicht so hart sein. :)

Ist halt doof, aber anscheinend ist das wirklich im FF so implementiert. Eventuell ist das aber keine Absicht und wird in den nächsten Versionen noch verbessert. Mal sehen was die Zukunft bringt...
 
Ich hab' das so im Kopf, dass man den Inhalt der Nachricht doch verändern kann, wenn man die ID weiß. Wird die Nachricht denn auch geschlossen, wenn du immer nach 3s den Inhalt einfach erneuerst?
 
Die ID vergibst du doch selbst in dem options-Objekt.

EDIT: Ok - hab' gerade noch ein bisschen rumgespielt. Es ist das "tag"-Attribut in den Optionen. Wenn man aber die Nachricht erneuert, wird auch onclose gefeuert, aber den Eventlistener kann man ja vorher entfernen. Man muss dann nur im onclose (also wenn der Nutzer schließt) den Interval, der die Nachricht immer wieder erscheinen lässt, wieder entfernen. Funktioniert eigentlich ganz gut - die Nachricht flackert nur ein bisschen...

PS: Warum verwendest du eigentlich immer Schema 4 beim Zugriff auf Objektattribute bei Objekten, die du selbst erzeugt hast, aber den normalen Zugriff bei Objekten, die du wo anders herbekommst?
 
Zuletzt bearbeitet:
Die ID vergibst du doch selbst in dem options-Objekt.
Das ist aber ein von mir erfundenes Feld für die Zuordnung. Das hat nichts mit der Webnoti zu tun. Das Feld könnte auch Schlumpfland heißen.

EDIT: Ok - hab' gerade noch ein bisschen rumgespielt. Es ist das "tag"-Attribut in den Optionen. Wenn man aber die Nachricht erneuert, wird auch onclose gefeuert, aber den Eventlistener kann man ja vorher entfernen. Man muss dann nur im onclose (also wenn der Nutzer schließt) den Interval, der die Nachricht immer wieder erscheinen lässt, wieder entfernen. Funktioniert eigentlich ganz gut - die Nachricht flackert nur ein bisschen...
Zeig mal bitte, was dir da vorschwebt.

PS: Warum verwendest du eigentlich immer Schema 4 beim Zugriff auf Objektattribute bei Objekten, die du selbst erzeugt hast, aber den normalen Zugriff bei Objekten, die du wo anders herbekommst?
Weiß nicht. Angewohnheit wahrscheinlich. Ist das nicht gut?
 
Das ist aber ein von mir erfundenes Feld für die Zuordnung. Das hat nichts mit der Webnoti zu tun. Das Feld könnte auch Schlumpfland heißen.
Ersetze das "id"-Feld einfach durch ein "tag"-Feld.
Zeig mal bitte, was dir da vorschwebt.
In etwa so:
Code:
var options = {
		body:	'Testnoti Body',
		icon:	'http://www.slipway.de/images/ico_bell.png',
		tag:		dat.getMilliseconds()
	};
und
Code:
var defaultaction = function(title,options,click,clo) {
		var noti = new Notification(title,options);
		noti.addEventListener('click',click,false);
		noti.addEventListener('close',clo,false);
		return noti;
	};
	
	/* ... */
	if (sendNotification){
		var clear = function(){
			window.clearInterval(interval);
			if (clo){
				clo.apply(this, arguments);
			}
		};
		var noti = sendNotification(title,options,click,clear);
		var interval = window.setInterval(function(){
			noti.removeEventlistener("close", clear, false);
			noti = sendNotification(title,options,click,clear);
		}, 3000);
		return true;
	}
- ungetestet.
Weiß nicht. Angewohnheit wahrscheinlich. Ist das nicht gut?
Nö - ist nur mehr Schreibarbeit und ungewohnt.
 
Julian, ich hab da auch noch einen Call offen seit einigen Wochen. An der Webnoti Front tut sich derzeit nichts beim FF. Mich würde interessieren, was du da gebaut hast. Denn ich bin bis heute noch immer dran, Besonderheiten und vor allem Unterschiede zwischen Chrome und FF zu finden, die man irgendwie "umbauen" muss, damit es bei beiden einigermaßen gleich aussieht und steuerbar ist.
 
Ich zeig's dir dann mal, wenn's fertig ist :D
Wobei ich mittlerweile gar nicht weiß, ob das dann im Firefox überhaupt Sinn macht, wenn WebNotifies schon nach 4 Sekunden von selbst geschlossen werden, auch wenn der User vielleicht in dem Moment das gar nicht gesehen hat...
Ich hoffe jetzt nur darauf, dass der IE8/9 endlich ausstirbt. In Version 11 (bzw. 10) ist der IE nämlich zum Glück nicht mehr so der „Ausreißer” wie früher, wenn es darum geht, Webtechniken zu unterstützen...
 
Ich zeig's dir dann mal, wenn's fertig ist :D
Gut.

Wobei ich mittlerweile gar nicht weiß, ob das dann im Firefox überhaupt Sinn macht, wenn WebNotifies schon nach 4 Sekunden von selbst geschlossen werden
Hab ich so gelöst:
HTML:
var timer = window.setTimeout(	// damit sich der Chrome genauso verhält wie der Firefox, alle paar Sekunden neu anzeigen
	function() {
		noti.close();
	},4500
);
Ein weiteres Problem, auf das ich gestossen war ist das Verhalten, wenn der Benutzer die Seite verlässt, das hab ich so gelöst:
HTML:
window.addEventListener('beforeunload',	// damit sich der Chrome genauso verhält wie der Firefox, Noti nach Seitenwechsel schließen
	function() { schliessen(); }
	,false
);


Ich hoffe jetzt nur darauf, dass der IE8/9 endlich ausstirbt. In Version 11 (bzw. 10) ist der IE nämlich zum Glück nicht mehr so der „Ausreißer” wie früher
Aber Webnoti unterstützt der IE auch in Version 11 nicht. Warum erwähnst du ihn in diesem Zusammenhang? Ich gleiche das bei mir derzeit durch ein Java Applet aus, bin damit aber nicht glücklich.
 
Hab ich so gelöst:
HTML:
var timer = window.setTimeout(	// damit sich der Chrome genauso verhält wie der Firefox, alle paar Sekunden neu anzeigen
	function() {
		noti.close();
	},4500
);
Ja, wiederholt anzuzeigen wäre dann auch meine Idee gewesen. An dieser Stelle noch ein Verbesserungsvorschlag:
Code:
//...
if(typeof window.mozInnerScreenX !== "undefined"){ //Firefox
  var isFirefox = true;
}
//...

if(isFirefox){
  var timer = window.setTimeout(
    function(){
      noti.close();
    }, 4500
  );
}
Dann wird nur im Firefox wiederholt angezeigt und Chrome verhält sich „normal”.

Aber Webnoti unterstützt der IE auch in Version 11 nicht. Warum erwähnst du ihn in diesem Zusammenhang?
Ich hatte deine Aussage
Denn ich bin bis heute noch immer dran, Besonderheiten und vor allem Unterschiede zwischen Chrome und FF zu finden, die man irgendwie "umbauen" muss, damit es bei beiden einigermaßen gleich aussieht und steuerbar ist.
generell und nicht auf WebNotifications bezogen verstanden.

Was mich nur mal wieder verrückt macht ist dieser verd.... Firefox. Wieso kann der sich nicht einfach an die Spec halten?
Ja, mittlerweile kann ich verstehen, dass viele zu Chrome gewechselt sind. Wäre Chrome anpassungsfähiger, hätte eine Benutzeroberfläche wie FF (ebenfalls anpassbar) und wäre „weniger Google”, wäre er schon lange mein einziger Browser.

PS: hab erst jetzt gemerkt, dass du das mit dem Verhalten im FF schon in #4 erwähnt hast. War schon zu lange her - auf das Problem bin ich wie gesagt erst vor kurzem gestoßen und mich nicht mehr daran erinnert, dass es hier schon darum ging.

Can I use... Support tables for HTML5, CSS3, etc
Safari ist ja ebenfalls schon dabei, und Opera bald auch: Opera Developer 25 supports web notifications - Opera Desktop - Opera Software
Was ich seltsam finde ist, dass WebNotifications zwar vom Stock-Android-Browser ≥ v.4.43 unterstützt werden, aber nicht in Chrome Mobile, der mittlerweile den Stock-Browser ersetzt.
 
Zuletzt bearbeitet:
Zurück
Oben