2011-06-19 21 views
6

Po kliknięciu łącza w Google Chrome zdarzenie fokusu nie uruchamia się. Wszystkie inne przeglądarki uruchamiają zdarzenie focus dla linków.Google Chrome Błąd linku JavaScript

<a href=# onfocus="console.log('focus')">Link</a> 

Nie chcę dołączać do wydarzenia w trybie onmousedown, ale w trybie onfocus.

Każdy ma pomysł na obejście tego problemu.

EDIT:

zdecydowanie rozważyć to błąd, ponieważ wszystkie inne elementy aktywowana wywołać nacisk na kliknięcia.

Nawet nieostające do ogniskowania elementy z ogniskiem spustowym o wartości tabindex dla kliknięcia w Google Chrome.

<div tabindex="-1" onfocus="console.log('focus')">div</div> 

Nie mogę dołączyć do obu click i focus bo wtedy onclick, inne przeglądarki nazwałbym funkcję dwukrotnie. Nie mogę wykryć tej funkcjonalności, ponieważ wymaga ona interakcji użytkownika i nie będę wykonywał wykrywania ciągu agenta użytkownika, ponieważ dobrze jest źle.

Stosując tę ​​html:

<a href=# onfocus="console.log('focus')" onmousedown="console.log('mousedown')">Link</a> 

Czy oni jakiś sposób unieważnić drugi onmousedown wezwanie, aby zapobiec funkcję o nazwie są dwa razy w niewyspecjalizowanych przeglądarek Google.

EDIT 2:

Po jakimś dalszym badaniom <input type=radio> również nie wywołać skupienie w Google Chrome. Dlaczego na świecie jest tak google chrome, podczas gdy Opera, IE i firefox są w porządku. Szaleństwem jest to, że przeglądarka mobilnego webkita wyzwala nawet skupienie na linkach, gdy wypróbowałem go na moim urządzeniu z Androidem.

+0

http://jsfiddle.net/82QXv/ –

+0

Rzeczywiście, nie działa. Poza tym, gdy ogniskuję łącze za pomocą klawisza tab, fokus zdarzenia jest uruchamiany wielokrotnie. To wygląda na uszkodzone. Chrome 12.0.742.100 –

+0

Aby sprawdzić za pomocą klawisza 'tab': http://jsfiddle.net/82QXv/1/ –

Odpowiedz

1

Jeden obejść można zrobić, aby uniknąć podwójnego focus wydarzenia wyskakiwanie na przeglądarek pracujących jednocześnie coraz zdarzenie focus pop na Chrome ma na zasadzie kliknij sprawdzenie zdarzenia, czy na stronie ma się focus, a jeśli nie, uruchom zdarzenie focus.

z jQuery można to zrobić tak:

$('a').click(function(e){ 
    if(!$('*:focus').length) $(this).trigger('focus');   
}); 

przykład: http://jsfiddle.net/niklasvh/qmcUt/

+1

Interesujące, wydaje się, że "document.activeElement" odnosi się do document.body po wywołaniu 'onmousedown' lub' onclick', ponieważ dla google chrome element nigdy nie otrzymał fokusu. http://jsfiddle.net/qmcUt/36/ Również przełączałem kliknięcie na 'mousedown', więc uruchamia się, gdy większość przeglądarek uruchamia' focus'. – William

3

To naprawdę działa dobrze, z tym że fokus nie jest uruchamiany po prostu klikając na link (spróbuj tabbować, a zobaczysz strzelanie wydarzenia). Nie sądzę, żeby to był błąd, dlaczego nie tylko ochronić i używać obu?

+1

+1. Webkit nie uruchamia zdarzenia, chyba że użytkownik użyje klawiatury. – Triptych

+0

@ Triptych - Zastanawiam się, dlaczego? W3C zdaje się mówić, że "urządzenie wskazujące" może skupić się na ogniskowaniu: http://www.w3.org/TR/html4/interact/scripts.html#adef-onfocus –

+0

Poprawiłem mój post, wyjaśniając dodatkowo problem, i dlaczego należy go zgłosić jako błąd. – William

0

można użyć małego Hack:

<a href="#" onfocus="console.log('focus')" onclick="this.focus()">Link</a> 
Powiązane problemy