subpub.html
<html>
<head>
<meta charset="UTF-8">
<title>pubsub</title>
</head>
<body>
<script>
var pubsub = {};
(function(myObject) {
// Storage for topics that can be broadcast
// or listened to
var topics = {};
// An topic identifier
var subUid = -1;
// Publish or broadcast events of interest
// with a specific topic name and arguments
// such as the data to pass along
myObject.publish = function(topic, args) {
if (!topics[topic]) {
return false;
}
var subscribers = topics[topic],
len = subscribers ? subscribers.length : 0;
while (len--) {
subscribers[len].func(topic, args);
}
return this;
};
// Subscribe to events of interest
// with a specific topic name and a
// callback function, to be executed
// when the topic/event is observed
myObject.subscribe = function(topic, func) {
if (!topics[topic]) {
topics[topic] = [];
}
var token = (++subUid).toString();
topics[topic].push({
token: token,
func: func
});
return token;
};
// Unsubscribe from a specific
// topic, based on a tokenized reference
// to the subscription
myObject.unsubscribe = function(token) {
for (var m in topics) {
if (topics[m]) {
for (var i = 0, j = topics[m].length; i < j; i++) {
if (topics[m][i].token === token) {
topics[m].splice(i, 1);
return token;
}
}
}
}
return this;
};
}(pubsub));
</script>
<div id="container">
</div>
<script>
// usage:
var container = document.getElementById("container");
function log(msg) {
var p = document.createElement("p");
p.innerHTML = msg;
container.append(p);
}
pubsub.subscribe('login', function() {
log('reporting login event');
});
pubsub.subscribe('login', function() {
log('Sending welcome message');
});
log('Login handlers registered!');
setTimeout(function() {
pubsub.publish('login');
}, 1000);
log("Trigger login event in 1s");
</script>
</body>
</html>