2011-11-30 17 views
13

Forse una domanda stupida, ma come impedire a un elemento di selezione in un modulo di mostrare il relativo menu a discesa quando viene fatto clic su? Ho provato quanto segue:Impedire l'apertura del menu di selezione

$('select').click (function (e) { 
    console.log (e); 
    return false; 
}); 

e

$('select').click (function (e) { 
    e.preventDefault(); 
    console.log (e); 
}); 

Ma nessuno ha funzionato.

Cosa sto sbagliando?

EDIT: La ragione per cui ho bisogno di sapere è per un elemento di selezione potenziato jquery che deve degradarsi con grazia. L'idea è la selezione, quando si fa clic, si apre una finestra di dialogo dell'interfaccia utente jQuery con un elenco creato correttamente da cui l'utente effettua la selezione (facendo clic su una voce dell'elenco si determina l'aggiornamento del valore della selezione). Se JS è disabilitato, la selezione dovrebbe funzionare normalmente.

Il problema è che, oltre all'apertura della finestra di dialogo, viene visualizzato anche il menu a discesa, che non è quello che voglio. Non posso semplicemente disabilitare il controllo, poiché il suo valore deve essere inviato insieme al resto del modulo.

+1

Che dire disattivando il selezionare in sé? –

+0

Forse dovresti spiegare perché stai provando a farlo. A questo non ha molto senso e la risposta più ovvia sarebbe: Se non vuoi che un elemento select si apra, allora non usare un elemento select. – RoToRa

+0

È per una selezione che dovrebbe degradare con grazia. Spiegazione dettagliata che arriva in una domanda di modifica. – GordonM

risposta

1

Usa disabilitato

$(this).attr("disabled","disabled"); 
+1

Aprirà comunque l'elenco di selezione prima di disabilitarlo. L'opzione migliore sarebbe disabilitare la selezione prima del clic (qualche azione dell'utente) o l'evento 'mouseenter'. –

+0

@jSang: hai ragione.OP puoi farlo sul carico o su qualsiasi evento particolare prima di cliccarlo. – Gowri

+0

L'aggiunta dell'attributo disabilitato modifica lo stile della casella di selezione in grigio, il che non sembra l'intenzione del poster. –

2

nascondere le opzioni di selezione al caricamento della pagina (se Javascript abilitato). Non verranno visualizzati quando si fa clic sulla casella di selezione, ma il testo della prima opzione ("Seleziona un'opzione", o qualsiasi altra cosa) verrà ancora visualizzato nel campo di selezione.

$(document).ready(function() { 
    $('#idOfSelect option').css('display', 'none'); 
}); 

Aggiornato Soluzione:

$(document).ready(function() { 
    $('#idOfSelect').focusin(function() { 
     $(this).css('display', 'none'); 
     $('body').click(function(event) { 
      $(this).unbind(event); 
      $('#idOfSelect').css('display', 'block'); 
     }); 
    }); 
}); 
+0

Sfortunatamente, questo approccio non funziona. Fa sparire qualsiasi cosa nella select, incluso l'elemento attualmente selezionato. – GordonM

+0

Hmm ... Questa soluzione ha funzionato in Chrome, ma ho scoperto che (almeno) Firefox nasconde l'elemento selezionato, come hai detto. Aggiungerò una soluzione aggiornata. –

4

Dalla mia esperienza, se ho bisogno di disattivare qualcosa, il modo più semplice per avere un altro elemento invisibile su di esso (uso assoluto posizionamento) . Quando si desidera consentire nuovamente il comportamento predefinito, è sufficiente nascondere l'elemento assoluto.

1

Ho appena risolto questo problema esatto, manipolando l'attributo 'dimensione' di select. Non molto elegante, ma funzionante. Spero che ti sia di aiuto.

<!-- Example select dropdown --> 
<select id="select" onclick="tackleDropdown()"> 
</select> 

<!-- The JS function --> 
<script> 
    function tackleDropdown(){ 
     document.getElementById('select').setAttribute('size', 0); 

     // your code for displaying the jQuery UI dialog (is it colorbox???) 

     // re-enabling the drop down 
     document.getElementById('select').setAttribute('size', document.getElementById('select').options.length); 
    } 
</script> 
45

questo dovrebbe funzionare: -

$('#select').on('mousedown', function(e) { 
    e.preventDefault(); 
    this.blur(); 
    window.focus(); 
}); 
+0

Abbiamo un vincitore. Ho visto un'altra soluzione che ha omesso this.blur() e window.focus(). Non ha funzionato ogni volta; la tua soluzione, grazie. –

+0

top work @ deniz-ozger non crederesti quanto tempo ho bruciato cercando di risolvere questo – Matt

+0

@DaveNottage solo 'preventDefault()' sembra funzionare per me ... puoi condividere altri modi in cui non funzionerebbe ? –

0

È possibile, il trucco è quello di annullare l'evento MouseDown, non il click.La catena di eventi è realizzato in modo tale che cliccare e mouseup non può verificarsi se mousedown è stato annullato:

function cancelDropDown(ev) { 
    ev.preventDefault(); 
} 

document.getElementById("selectElement").addEventListener("mousedown", cancelDropDown, false); 
2

Il problema è che si sta utilizzando l'evento sbagliato.

<select onmousedown="(function(e){ e.preventDefault(); })(event, this)"> 
    <option>Some Option</option> 
</select> 

JsFiddle

Problemi correlati