Командный клик не открывает новую вкладку, но средний щелчок
На моем сайте, который является одностраничным JS-сайтом с использованием Sammy.js и jQuery, когда я нажимаю среднюю ссылку на мышь, ссылка открывается на новой вкладке. Но когда я нажимаю на Mac, это не так. Это происходит как в Firefox, так и в Chrome, поэтому я предполагаю, что это должно соответствовать спецификации в некотором роде.
Это происходит на Macbook Air (так что кнопка трекпада + команда). Большинство сайтов работают нормально, но при этом щелчок команды идентичен среднему клику среднего щелчка.
Попробуйте сами: https://circleci.com . Командный щелчок между «about», «home» и «contact», и вы должны столкнуться с проблемой – они не открываются на новых вкладках.
- JQuery передает оба фокуса и нажимает на элемент
- Как отключить щелчок правой кнопкой мыши на веб-странице?
- JQuery: щелкните мышью, если внутри div или нет.
- Получить положение на холсте ПОСЛЕ поворота / перевода и восстановления
- Как получить объект в 3DG пространстве WebGL с координаты щелчка мыши
- Получить позицию мыши при запуске событий фокуса / размытия? - Javascript / jQuery
- Любой способ обнаружить ctrl + click в javascript для браузеров osx? Нет jQuery
- Положение мыши - совместимость с браузером - Javascript
- Как изменить курсор мыши на изображение?
- Как определить, является ли пользователь «незанятым» с javascript?
- Обнаружение попытки прокрутки пользователя при скрытии переполнения
- Предотвращение жестов операционной мыши
- Определите, на каком элементе указатель мыши находится поверх Javascript
Спекулируя здесь, но позже подтвердим с Mac. Было подтверждено, что он работает на Mac.
Win ctrl + click или команда Mac + щелчок получает «обычный» прослушиватель кликов, как щелчок с любым другим ключом-модификатором (alt + click, shift + click и т. Д.).
Это особенно сбивает с толку, так как клик Ctrl + click на Mac интерпретируется как щелчок правой кнопкой мыши по уровню ОС. С другой стороны, командный клик не интерпретируется как средний клик, а скорее предпочтение браузера.
Предполагая, что у вас нет функциональных возможностей на сайте, которые специально полагаются на измененные клики, было бы целесообразно исключить такие события из прослушивателей кликов, а вместо этого позволить им пузыриться, чтобы они были обработаны браузером. Учитывая опыт кого-то в подобной ситуации , вы должны иметь возможность добавить следующие обработчики кликов (вероятно, делегат на уровне библиотеки, как указано Brilliand):
if (e.metaKey || e.ctrlKey) return;
Когда в начале обработчика добавляется e
относящееся к текущему событию клика, это должно обойти все следующие e.preventDefault();
Обновить:
Это действительно работает! В этой довольно минималистической скрипке я могу распознать, когда щелкнули по клику или щелкнули по клику, чтобы избежать выполнения остальной части обработчика кликов, которая включает ajax- e.preventDefault();
содержимого и 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 + щелчок, пока средний клик не затронут. Проконсультируйтесь с документами вашей структуры JS / Site.
Вот соответствующий код от sammy.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; } });
Резюме. Если кто-то нажимает на ссылку, переопределите стандартное поведение ссылки с поведением sammy.js, которое должно изменить текущую страницу, чтобы отобразить содержимое целевой страницы без фактической загрузки страницы. Согласно ссылке dakdad, щелчок команды (в отличие от среднего щелчка) улавливается событием click и может быть переопределен.
Для решения этой проблемы вы можете удалить обработчик событий sammy.js (используя $('a').die('click.history-' + _sammy_event_namespace_);
) и замените его модифицированной версией, которая проверяет наличие кликов и избегает переопределения их.