para - ver consola javascript
Comando-clic no abre una nueva pestaña, pero el botón central sí lo hace (3)
En mi sitio web, que es un sitio JS de una página que utiliza Sammy.js y jQuery, cuando hago clic con el mouse en un enlace, el enlace se abre en una nueva pestaña. Pero cuando comando-clic en una Mac, no lo hace. Esto sucede tanto en Firefox como en Chrome, por lo que asumo que debe ser de acuerdo con las especificaciones de alguna manera.
Esto sucede en un Macbook Air (por lo tanto, trackpad + botón de comando). Sin embargo, la mayoría de los sitios funcionan bien, ya que el comando-clic es idéntico al clic normal.
Pruébelo usted mismo: https://circleci.com . Haga clic con el botón de comando entre "acerca de", "inicio" y "contacto" para experimentar el problema; no se abren en nuevas pestañas.
Aquí está el código relevante de 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;
}
});
Resumen: si alguien hace clic en un enlace, anule el comportamiento del enlace estándar con el comportamiento de sammy.js, que es cambiar la página actual para mostrar el contenido de la página de destino sin carga real de la página. De acuerdo con el enlace de dakdad, el evento clic captura un comando-clic (a diferencia de un clic del medio), y puede ser anulado.
Para una solución, puede eliminar el controlador de eventos de sammy.js (usando $(''a'').die(''click.history-'' + _sammy_event_namespace_);
) y reemplazarlo con una versión modificada que verifique los clics de comando y evite la anulación ellos.
Hay algunas ideas interesantes aquí: https://groups.google.com/forum/#!msg/mozilla.dev.usability/H1qLTur4EFc/gXH007CAPk8J
Al parecer, el JS que está utilizando puede preventDefault()
el clic de cmd + mientras que el clic del medio no se ve afectado. Consulta los documentos de tu JS / Site framework.
Especula aquí, pero se confirmará más tarde desde una Mac. Esto ha sido confirmado para estar trabajando en una Mac.
Win ctrl + click o un comando de Mac + click es recogido por un detector de clics "normal", al igual que un clic con cualquier otra tecla modificadora (alt + clic, Mayús + clic, etc.).
Esto es particularmente confuso ya que un ctrl + clic en una Mac se interpreta como un clic derecho en el nivel del sistema operativo. El comando de clic, por otro lado, no se interpreta como un clic del medio, sino que es una preferencia del navegador.
Suponiendo que no tiene una funcionalidad en el sitio que se basa específicamente en los clics modificados, sería apropiado excluir tales eventos de los escuchas de clics y, en su lugar, permitir que los globos sean manejados de forma nativa por el navegador. Dada la experiencia de alguien en una situación similar , debería poder agregar lo siguiente para hacer clic en los manejadores (probablemente un delegado en el nivel de biblioteca, como lo señala Brilliand):
if (e.metaKey || e.ctrlKey) return;
Cuando se agrega al comienzo del controlador con e
referencia a un evento de clic actual, esto debería evitar cualquier e.preventDefault();
Actualizar:
¡Realmente funciona! En este violín bastante minimalista , puedo reconocer cuando se hace clic en el comando o en el botón de control, para evitar ejecutar el resto del controlador de clic, que incluye el contenido de ajax y obtener e.preventDefault();
. Esto permite que un comando-clic sea manejado "como se esperaba" en una Mac, es decir, abrir el enlace en una nueva pestaña.
Con este hallazgo en mente, estas líneas ahora deberían leerse
if (e.isDefaultPrevented() || e.metaKey || e.ctrlKey) {
return;
}