2011-12-01 13 views
6

La maggior parte dei browser moderni supporta i comandi ctrl+click o command+click o simili per aprire i collegamenti in una nuova scheda o in una nuova finestra.Determinare onclick se il collegamento cliccato è pensato per aprire una nuova finestra o scheda

In un'applicazione, desidero disattivare il collegamento facendo clic. Ma solo, se la destinazione è la stessa finestra (se, ad esempio, si apre in una nuova scheda, non voglio che il link diventi disabilitato poiché è ragionevole fare di nuovo clic).

Ho eseguito alcuni tentativi e ho eseguito il debug sull'oggetto evento che viene creato al clic, ma non riesco a trovare alcuna informazione sul fatto che il target sia una nuova scheda o una nuova finestra.

soluzione nota: Certamente è possibile verificare se un determinato tasto era stato premuto mentre si clicca un link specifico, una cosa facile - ma dal momento che questi comandi variano da browser a browser e dal sistema operativo a sistema operativo, si dovrebbe definire una mappatura complicata e chi è esattamente ciò che l'utente ha configurato e così via.

Esiste un modo affidabile per determinare se la posizione deve essere aperta in una nuova scheda o finestra?

risposta

3

Ecco un esempio di lavoro: http://jsfiddle.net/pioul/eCuNU/4/

Questo script permette il clic sul collegamento solo se il collegamento sta per aprire in una nuova scheda/finestra, in base all'attributo target="_blank".

HTML:

<a href="http://google.fr" target="_blank">new window</a> 
<a href="http://google.fr" target="_self">same window 1</a> 
<a href="http://google.fr" target="">same window 2</a> 

jQuery:

$("a").bind("click", function(e){ 
    if($(this).attr("target") != "_blank"){ 
     e.preventDefault(); 
    } 
}); 

EDIT:

si può prendere in considerazione click Ctrl + in questo modo:

$("a").bind("click", function(e){ 
    if($(this).attr("target") != "_blank"){ 
     if(!e.ctrlKey){ 
      e.preventDefault(); 
     } 
    } 
}); 
+1

Bene, questo funziona solo con un attributo di destinazione fisso. Se l'utente "sovrascrive" questo tenendo premuto ctrl (o simile), l'attributo non cambierà e ovviamente la determinazione fallisce. – Remo

+1

Ho modificato la mia risposta per far corrispondere il caso di cui hai parlato, e credo che non ci sia altra soluzione che pensare a ogni modo in cui un utente può aprire un link in una nuova finestra e cercare di rilevarlo all'interno del tuo codice. – Pioul

0

Alcune volte è impostato dalle impostazioni del browser per aprire i collegamenti in una nuova scheda o nella stessa finestra.

È possibile controllare l'attributo di destinazione dell'oggetto di collegamento.

<a href="http://your_link_to_page" target="_blank" >This open in new window</a> 

Utilizzare javascript per manipolare i tag di ancoraggio al caricamento della pagina e verificare gli attributi di destinazione. Se il valore target è impostato su _blank, abilitalo o puoi eseguire questo controllo quando l'utente fa clic sul link.

È possibile utilizzare un meccanismo per trovare CTRL premuto quando si fa clic sul collegamento. Ci sono alcune risorse come this. Puoi costruire un sistema.

NOte: se si utilizza JQuery, utilizzare classi diverse per categorizzare i collegamenti da verificare. E disabilitarli allo stato di pronto o al momento di fare clic sui collegamenti.

+0

Sfortunatamente, questo non si applica se l'utente costringe una nuova scheda tenendo premuto 'ctrl', vero? – Remo

+0

È necessario rilevare prima quali tasti sono stati premuti quando si è verificato l'evento del mouse. Questo controllo deve essere eseguito in ambito globale (ad esempio, nell'ambito della pagina). imposta una variabile jS in base alla pressione del tasto. Quindi esegui il resto del controllo all'interno dell'evento click. –

0

Non è possibile impedire a un browser di aprire un collegamento in una nuova scheda o finestra. Potrebbero esserci (inaffidabili) impostazioni di configurazione che lo forzano o pensano ai gesti del mouse: con il tasto destro del mouse e spostando verso il basso si aprirà una nuova scheda in Opera, e immagino che questo non sia rilevabile.

Inoltre, forzare un browser ad aprire una scheda in una nuova finestra (target="_blank" o anche window.open) è considerato di cattivo gusto. Dovresti lasciare che l'utente scelga cosa vuole fare. Se vuoi davvero farlo, potresti anche considerare window.onunload che dovrebbe funzionare la maggior parte delle volte.

+0

Beh, non si tratta di prevenire o forzare nulla - si tratta ** di rilevare ** se il link si aprirà in una nuova finestra o no - questo è tutto. – Remo

Problemi correlati