Избегать шаблона event.preventDefault() в обработчиках событий магистрали

У меня много действий Backbone.js, которые начинаются со ссылки, например

<a href="#makeCookies">Make Cookies</a>

и хэширование Backbone.View, например

'click [href=#makeCookies]': 'makeCookies'

и функция обработчика событий, например

makeCookies: function (event) {
    event.preventDefault();
    //code to make cookies
    //I have no intention of ever using #makeCookies in the URL,
    //it just there so I can wire up the event handler properly
}

Есть ли чистый способ избежать этого шаблона event.preventDefault(). Я думал об использовании тегов <button> вместо тегов <a>, но это казалось неуместным.

Ответ 1

Зачем вам вообще нужен атрибут href, если вы планируете его отменить? Как насчет просто использования имени класса?

Код HTML:

<a class="makeCookies">Make Cookies</a>

Просмотр кода:

'click .makeCookies': 'makeCookies'
...
makeCookies: function (event) {
    // No need for event.preventDefault() anymore!
}

Ответ 2

Вы можете добавить обработчик предотвращения-умолчанию для элемента документа. Например:

$(document).click(function (e) {
    if (e.target.tagName === "A") {
        e.preventDefault();
    }  
})

Это, конечно, отключит всю навигацию, инициированную тэгами, но если ваше приложение обеспечивает специальную обработку для этого, это не должно быть проблемой.

Если вы хотите передать некоторые теги "a", вы можете добавить дополнительные условия в обработчик prevent-default, например, проверить, что значение атрибута href начинается с "#".