e.stopPropagation() is not working as expected?

The problem is that you're attaching the event handler to the body, even if it delegates to the .b element. This event handler is called only after the tr event handler is called, so it's too late to stop propagation.

As I suppose you want to deal with dynamically added elements and can't simply bind the event handler to the td, I can suggest you this :

$('body').on('click',"tr",function (e){
  alert('row');
});
$("body").on('click',".b",function (e){
  alert('button');
  e.stopPropagation();
});

Demonstration


...but I want to know why my current(!) code doesnt work.

From jQuery docs, on event.stopPropagation with event delegation:

Since the .live() method handles events once they have propagated to the top of the document, it is not possible to stop propagation of live events. Similarly, events handled by .delegate() will propagate to the elements to which they are delegated; event handlers bound on any elements below it in the DOM tree will already have been executed by the time the delegated event handler is called. These handlers, therefore, may prevent the delegated handler from triggering by calling event.stopPropagation() or returning false.

live and delegate are now on so this applies.