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_);
) и замените его измененной версией, которая проверяет наличие щелчков команд и избегает их переопределения.