2010-02-05 15 views
11

L'obiettivo finale: pagine carine per utenti di mouse, pagine accessibili per gli utenti di tastiera. L'effetto che voglio è quello di fare clic su un'ancora per non produrre alcun contorno durante e non lasciare nessun contorno dopo. Inoltre, voglio che i tasti della tastiera tocchino la messa a fuoco e quindi circondino gli oggetti con un contorno. Il seguente codice funziona in FF (e presumo gli altri browser moderni, ma dovrò testarli domani in ufficio), ma non IE6-8. Il problema sta nel fatto che onMouseDown non sembra offuscare come previsto:Come rimuovere lo stato attivo sumousedown in IE?

var links = document.getElementsByTagName('a'); 
for (var i=0; i < links.length; i++) { 
    links[i].onmousedown = function() { 
     this.blur(); 
     return false; 
    } 
    links[i].onclick = function() { 
     this.blur(); 
    } 
} 

Un compromesso sarebbe se qualcuno ha una soluzione in grado di gestire il caso in IE, dove l'utente posiziona il mouse verso il basso, posiziona il mouse all'esterno ancorare, poi rialzare e non lasciare alcun contorno dietro sarebbe un passo nella giusta direzione. Grazie.

EDIT: venerdì 5 marzo 2010 Le mie più profonde scuse per aver impiegato così tanto tempo per tornare a questo, ma avevo bisogno di una soluzione che funzionasse nel maggior numero di browser possibile. Bene, non è necessario alcun timeout solo per alcuni schemi, classi e gestione dei focus. La seguente soluzione funziona con IE6 +, FF2 +, Safari 3+ e Chrome. Non ho provato in Opera, ma mi piacerebbe se qualcuno potesse confermare/negare che funzioni. Quello che segue è più codice suedo che puro js. Lascio come esercizio per il lettore a implementare nel vostro quadro preferito:

var anchorEventIsMouse = true; 
$('a').mousedown(function() { 
    anchorEventIsMouse = true; 
    this.hideFocus = true; /* IE6-7 */ 
    this.style.outlineStyle = 'none'; /* FF2+, IE8 */ 
    this.addClass('NoOutline'); /* see click func */ 
    this.setFocus(); /* Safari 3+ */ 
    }); 
$('a').keydown(function() { 
    anchorEventIsMouse = false; 
    }); 
$('a').blur(function() { 
    this.style.outlineStyle = ''; 
    this.hideFocus = false; 
    this.removeClass('NoOutline'); 
    }); 
$('a').click(function(e) { 
    /* Adding class NoOutline means we only allow keyboard 
    * clicks (enter/space) when there is an outline 
    */ 
    if (!anchorEventIsMouse && this.hasClass('NoOutline')) { 
    e.stopEventPropagation(); 
    } 
    }); 
+3

Non ho mai visto "mouse" usato come un verbo prima ... :) – Guffa

+0

+1 per mousing. –

+0

IE8 È un browser moderno, lo sai. –

risposta

4

NON UTILIZZARE blur()!

Non è necessario spostare la messa a fuoco dall'orbita per modificarne l'aspetto.

In IE è possibile impostare la proprietà JS hideFocus per impedire che venga disegnato il profilo. Altri browser consentono l'override tramite la proprietà CSS outline.

Basta impostare quelli nel gestore mousedown. Probabilmente si può usufruire di ribollimento evento e farlo da un singolo gestore sul corpo:

event.srcElement && event.srcElement.hideFocus=true; // IE 
event.target && event.target.style.outline='none'; // non-IE 

e se si desidera supportare il passaggio tra la tastiera e il mouse, in mousedown allegare blur gestore che ripristina quelli di default (si' ll bisogno di e la chiusura sul target dell'evento).

+0

Vedo il tuo punto che usando 'sfocatura 'significa che l'orbita di messa a fuoco viene resettata e su IE questo è un problema, ma FF sembra ricordare dov'era e inizia da lì. Ad ogni modo, temo che il passaggio da tastiera a mouse non funzioni al 100%. Nel momento in cui inizierai a impostare le proprietà 'hideFocus' e' outline' che corri il rischio (ad es. Mousedown, mouseout, mouseup su IE) di mettere un elemento in uno stato che non mostrerà alcun contorno durante la tabulazione. Dovrò esaminare ulteriormente la tua soluzione per essere sicuro. –

+0

Ho notato che potrebbe esserci un caso in cui l'elemento viene rimosso, ma non sfocato, quindi potrebbe non essere sempre pulito. La soluzione per questo sarebbe usare 'mousedown' per impostare il gestore di' focus' che rimuove i profili, e nel gestore di 'focus' aggiungere il gestore' blur' che rimuove l'hack. – Kornel

1

Non l'ho provato, b ut solito un ritardo sorta questo genere di cose fuori:

var links = document.getElementsByTagName('a'); 
for (var i=0; i < links.length; i++) { 
    links[i].onmousedown = function() { 
     window.setTimeout(function() { this.blur(); }, 0); 
     return false; 
    } 
    links[i].onclick = function() { 
     this.blur(); 
    } 
} 

La ragione di questo è, la maggior parte degli eventi fuoco sull'elemento prima che effettivamente guadagna messa a fuoco. Il timer ritarda la sfocatura fino a quando il filo è inattivo, pertanto la messa a fuoco sarà stata acquisita e può essere sfocata.

Alcuni browser supportano la proprietà CSS outline, che rimuoverà il profilo attivo se impostato su none, IE non, ma si potrebbe essere in grado di trovare una soluzione non-js per quei browser.

EDIT Onestamente, a volte non so dove va il mio cervello. È scomparso temporaneamente ma è tornato di nuovo. Non ha funzionato per te perché in un timer, this non punta correttamente all'elemento di destinazione.È possibile risolvere il problema in questo modo:

links[i].onmousedown = function() { 
    var self = this; 
    window.setTimeout(function() { self.blur(); }, 0); 
    return false; 
} 

A volte può tremolare il contorno sulla prima di rimuoverla, però, così mi consiglia di utilizzare la proprietà hideFocus per nascondere temporaneamente il contorno durante eventi del mouse:

links[i].onmousedown = function() { 
    var self = this; 
    this.hideFocus = true; 
    window.setTimeout(function() { self.blur(); self.hideFocus = false; }, 0); 
    return false; 
} 
+0

Grazie Andy. Volevo così tanto che funzionasse, purtroppo non funziona ancora in IE. –

+0

@Brett Pontarelli: Mi dispiace Brett, ho avuto una svolta divertente e ti ho detto di usare 'this' all'interno di un callback del timer. Vedi la mia modifica per maggiori informazioni. –

+0

Non sfocare(). È malvagio e inutile! – Kornel

-1
$("a").click(function() { 
    $(this).blur(); 
}); 
$("a").mousedown(function() { 
    $(this).blur(); 
}); 

Prova questa;)

+0

L'ho provato solo per vedere se jquery avrebbe funzionato con qualsiasi magia. Non funziona. Richiede inoltre di caricare jquery in una pagina che richiede solo 10 righe in javascript. –

+0

L'attivazione della tastiera attiva l'evento 'click'. – Kornel

0

Non ho idea se ciò possa essere d'aiuto ma, come nient'altro funziona, prova ad impostare lo stile in base agli eventi piuttosto che cercare di attivare un evento. Se è un mouseover (quindi un clic) mantieni la sottolineatura, se è un focus senza mouseover (uso della tastiera), quindi lascia il comportamento di sottolineatura lì.

Questo è un altro campo lungo, ma potrebbe valere la pena di provarlo.

0

Questo sembra funzionare. Nascondere il rettangolo di attivazione sul caricamento della pagina e attivarlo solo se utilizzano il tasto TAB. Se si fa clic su un link si spegne sul rettangolo di attivazione di nuovo:

document.onkeydown = checktab; 
function checktab(e) { 
    var tabKey=9; 
    var code=(e) ? e.which : window.event.keyCode; 
    if(code==tabKey){ 
     showOutline(true); 
    } 
} 

function showOutline(show){ 
    var links = document.getElementsByTagName('a'); 
    for (var i=0; i < links.length; i++) { 
     links[i].style.outline=(show) ? '' : 'none'; 
     links[i].onmousedown = function() {showOutline(false);}; 
     links[i].hideFocus=!show; 
    } 
} 

showOutline(false); 
Problemi correlati