refactor

* change the api to element-specific ways
* now we can deal with `[contenteditable]`