Adventures with dojo/on

Blog Post created by odoe on Nov 13, 2014

The ArcGIS API for JavaScript is currently at version 3.11. Since version 3.0, we all should have mostly abandoned using dojo/_base/connect. If you are really in a pinch working with an older library or maybe something in dojox, at least work with dojo/aspect. By now, everyone should be using dojo/on to listen to events. Maybe you're even using dojo/topic, but that's a whole other blog post.


I'm not going to go into detail on how to use dojo/on, but I thought it would be neat to share a couple of ways you can extend dojo/on to do some cool stuff you might need for particular situations. Some time back, I had need to be able to toggle the eventlistener for a click event on my map. The first time I clicked the map, I want to do a selection and the second time I clicked the map I wanted to run a different method unrelated to the selection. There are a couple of ways I could have gone about this by using dojo/on#pausable or something. But I decided to just extend dojo/on to do what I needed.


], function(on) {
  'use strict';
  var _on = on;
  _on.switchable = function(target, type, listener1, listener2) {
    var funcs
      , index
      , currentListener
      , signal;

    funcs = [listener1, listener2];
    index = 0;
    currentListener = funcs[index];
    signal = _on(target, type, function() {
      return currentListener.apply(this, arguments);
    signal.toggle = function() {
      index = 1 - index;
      currentListener = funcs[index];
    return signal;
  return _on;


Then I was thinking about this recent thread and thought, Why can't I make a single use eventlistener?

I'm sure this could come up in certain situations, so I put together a sample you can review. This one as well for a different approach.

You can click on the Speak! button and get an alert message. Click on the Toggle button and click on Speak! again to get a different message. Click on the One time! button and an alert message will pop up in a second. The delay is optional, so you could change the delay to 100ms if you like. Try and click that same button again and nothing happens.


This is just a quick example of stuff you could do depending on your situation and I thought would be fun to share. You can see more tidbits like this on my blog.


Go forth and code my friends.