This looks pretty good with the exception of how you are using data elements.
There are a couple things worth noting:
1). There is no need to set up event listeners in code. Launch does all that for you depending on the type of event that triggers your rule.
2). Data Elements are like functions that get called whenever they are referenced. If the data element is Core > Custom code, that code is expected to return something. In yours, you establish a listener that has a return, but it won't be fed back as the return value of the data element. Also, there is a timing issue, since the data element is not evaluated until after the rule is triggered, which then sets up a listener that might get triggered upon the next click.
Anyway, while there are some legitimate reasons to set up event listeners in custom JS in Launch, those cases are pretty rare.