Command-click не открывает новую вкладку, но средний щелчок

на моем веб-сайте, который является одностраничным сайтом JS с использованием Sammy.js и jQuery, когда я щелкаю средней кнопкой мыши ссылку, ссылка открывается на новой вкладке. Но когда я нажимаю команду на Mac, это не так. Это происходит как в Firefox, так и в Chrome, поэтому я предполагаю, что это должно быть в соответствии со спецификацией.

Это происходит на Macbook Air (так трекпад + кнопка команды). Большинство сайтов работают нормально, хотя щелчок по команде идентичен обычному среднему щелчку.

попробуйте сам:https://circleci.com. Команда-нажмите между "о программе", "домой" и "контакт", и вы должны испытать проблему - они не открываются в новых вкладках.

3 ответов


спекулируя здесь, но подтвердит позже с Mac. это было подтверждено, чтобы работать на Mac.

Win ctrl + click или команда Mac+click получает "обычный" прослушиватель щелчков, как и щелчок с любой другой клавишей модификатора (alt+click, shift+click и т. д.).

Это особенно запутанно, так как ctrl + click на Mac интерпретируется как щелчок правой кнопкой мыши на уровне ОС. Command-click, с другой стороны, является не интерпретируется как средний щелчок, а скорее является предпочтением браузера.

предполагая, что у вас нет функций на сайте, которые специально полагаются на измененные клики, было бы целесообразно исключить такие события из прослушивателей кликов и вместо этого разрешить им пузыриться, чтобы они были изначально обработаны браузером. Учитывая опыт кто-то в аналогичной ситуации, вы должны иметь возможность добавить следующее, чтобы щелкнуть обработчики (вероятно, a делегат на уровне библиотеки, как указано Brilliand):

if (e.metaKey || e.ctrlKey) return;

при добавлении в начале обработчика с e ссылаясь на текущее событие click, это должно обойти любые следующие e.preventDefault();

обновление:

это действительно работает! В эта довольно минималистичная скрипка, Я могу распознать, когда команда щелкнула или управление щелкнуло, чтобы избежать выполнения остальной части обработчика щелчка, который включает ajax-извлечение содержимого и e.preventDefault();. Это позволяет обрабатывать команду-щелчок "по назначению" на Mac, т. е. открывать ссылку на новой вкладке.

С этой находкой в виду,эти строки теперь следует читать

if (e.isDefaultPrevented() || e.metaKey || e.ctrlKey) {
    return;
}

здесь есть интересное понимание: https://groups.google.com/forum/#!msg/mozilla.dev.usability/H1qLTur4EFc/gXH007CAPk8J

видимо в JS можно preventDefault() cmd+click в то время как средний щелчок не влияет. Обратитесь к документам JS / site framework.


вот соответствующий код от Сэмми.js:

// bind to link clicks that have routes
$('a').live('click.history-' + this.app.eventNamespace(), function(e) {
    if (e.isDefaultPrevented()) {
        return;
    }
    var full_path = lp.fullPath(this);
    if (this.hostname == window.location.hostname && app.lookupRoute('get', full_path)) {
        e.preventDefault();
        proxy.setLocation(full_path);
        return false;
    }
});

сводка: если кто-то нажимает на ссылку, переопределите стандартное поведение ссылки с Сэмми.поведение js, которое заключается в изменении текущей страницы, чтобы показать содержимое целевой страницы без фактической загрузки страницы. Согласно ссылке dakdad, щелчок команды (в отличие от среднего щелчка) перехватывается событием click и может быть переопределен.

для обходного пути вы можете удалить sammy.обработчик событий js (используя $('a').die('click.history-' + _sammy_event_namespace_);) и замените его измененной версией, которая проверяет наличие щелчков команд и избегает их переопределения.