If you’d want to do this purely in Mendix, you could add an 'IsChanged’ boolean attribute to your entity, and add a onchange nano/microflow to every input on your form that sets this attribute to true (perhaps this widget can help: https://appstore.home.mendix.com/link/app/108281/Mansystems/On-Any-Change), and with conditional visibility disable/enable your button. You could reset the attribute to false in a beforeCommit, so the button becomes disabled again when comitted to the db.
Haven't done it myself, but this is what I would try.
But perhaps it's easier to resort to some custom javascript..
The equivalent client-side function to isDirty is:
mendixObject.hasChanges()
There are a few ways to go about implementing this. One option would be a nanoflow timer widget that calls a nanoflow, that calls a JavaScript action with code that checks hasChanges() and changes CSS classes on your button accordingly.
Since JS actions are still beta in 7.23, you could also use a JS snippet on the page that uses setInterval() and checks the value of hasChanges() on that interval.
The most standard implementation would be: set an on change microfllow on each editable attribute. In the microflow, check to see if anything has changed. You could check the AuditTrail module for a Java action that does this for you. The Mendix API has a method to check this as well: getChangedMembers() of IMendixObject. Set a custom boolean to flag whether something was changed or not. Use conditional visibility on two differently styled save buttons on your page.
I'm not familiar with Nanoflows, so you could check to see if there are options there.