Why is jquery event delegation not working?

It means that #contain itself is not a static element, you should select closest static parent of the element. Otherwise jQuery doesn't select the element and delegation fails.

Event handlers are bound only to the currently selected elements; they must exist on the page at the time your code makes the call to .on().

However, in case that element is static, you are selecting the element too soon, you should wait for DOM to be ready.

$(document).ready(function(){
   var $contain = $('#contain'); //going to use a lot
   $contain.on('click','li.two', function(){
       console.log('working');
       //plus do other stuff
   });
})