A separação de preocupações é fundamental aqui e, portanto, a associação de eventos é o método geralmente aceito. Isso é basicamente o que muitas das respostas existentes disseram.
No entanto , não jogue fora a idéia de marcação declarativa muito rapidamente. Ele tem seu lugar, e com estruturas como Angularjs, é a peça central.
É preciso entender que o todo <div id="myDiv" onClick="divFunction()">Some Content</div>
foi tão envergonhado porque foi abusado por alguns desenvolvedores. Então, chegou a um ponto de proporções sacrílegas, muito parecido tables
. Alguns desenvolvedores realmente evitar tables
de dados tabulares. É o exemplo perfeito de pessoas agindo sem entender.
Embora eu goste da ideia de manter meu comportamento separado dos meus pontos de vista. Não vejo nenhum problema com a marcação declarando o que faz (não como faz, isso é comportamento). Pode estar na forma de um atributo onClick real ou de um atributo personalizado, como os componentes javascript de autoinicialização.
Dessa forma, olhando apenas a marcação, você pode ver o que faz, em vez de tentar reverter os ligadores de eventos javascript de pesquisa.
Portanto, como uma terceira alternativa ao acima, usar atributos de dados para anunciar declarativamente o comportamento na marcação. O comportamento é mantido fora da vista, mas de relance você pode ver o que está acontecendo.
Exemplo de inicialização:
<button type="button" class="btn btn-lg btn-danger" data-toggle="popover" title="Popover title" data-content="And here's some amazing content. It's very engaging. Right?">Click to toggle popover</button>
Fonte: http://getbootstrap.com/javascript/#popovers
Nota A principal desvantagem do segundo exemplo é a poluição do espaço para nome global. Isso pode ser contornado usando a terceira alternativa acima, ou estruturas como Angular e seus atributos ng-click com escopo automático.