Honestly, it depends on the context.
Sometimes, it makes sense to disable specific UI elements. This happens regularly with ecommerce websites. Once you submit an order, most ecommerce websites worth their salt disable the "Order Now" button (visually still there, but grayed out, user's cursor changes, loading animation appears in the button, etc) to help prevent users from inadvertently ordering multiple times.
For further reading, check out "Users Continue To Double-Click Online" from Baymard Institute.
Sometimes though, queuing actions up in the background and never disabling the UI is a better approach. This has become an interesting approach with mobile apps. Within Instagram, for example, if you like a photo, the app automatically visually changes the heart/like button to a selected state. It may have communicated with the server or it may not have. But it assumes that eventually that state will be true. So it keeps a local queue of actions and eventually syncs it up with the server. This makes the app feel quicker than it actually is. It also drives engagement further because you don't feel like you're waiting around for actions to complete.
For more information, read Luke Wroblewski's article on "Mobile Design Details: Performing Actions Optimistically"
working...
message (or a progress animation) and just hide it when the ajax request is completed. I don't see a point showing adone
message - the disappearance of theworking...
message already signify that.