2009-10-06 13 views
15

Sto utilizzando il controllo DatePicker dell'interfaccia utente di jQuery in una barra degli strumenti position: fixed nella parte inferiore della mia pagina. Occasionalmente, su computer casuali, il DatePicker appare sotto la barra degli strumenti, il che significa che è fuori dalla pagina e impossibile da visualizzare o interagire con.ottenere il datapicker di jQuery UI per aprire sempre in una determinata direzione?

C'è un modo per forzare il posizionamento del controllo datapicker in modo che sia sempre sopra e alla destra del suo <input>?

+0

Nessun errore in Firebug. – ceejayoz

+0

Puoi ritagliare meglio la casualità dell'errore? Alcune versioni di Firebug si confondono con gli elementi di compensazione dell'altezza della pagina e, in teoria, potrebbero essere responsabili del risultato. Oppure stiamo parlando di Internet Explorer? – Frankie

+0

Accade in IE, Safari e Firefox. – ceejayoz

risposta

6

Si potrebbe cambiare le linee:

offset.left -= (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? Math.abs(offset.left + dpWidth - viewWidth) : 0; 
offset.top -= (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? Math.abs(offset.top + dpHeight + inputHeight*2 - viewHeight) : 0; 

... da leggere:

offset.left = $(inst.input).position().left + dpWidth; 
offset.top = $(inst.input).position().top - dpHeight; 

Questo perde flessibilità, però. Se il tuo input si trova nella parte superiore della pagina, avrai il problema opposto di prima.

+0

Grazie. Il datepicker non è mai nella parte superiore della pagina, e questo è un sistema molto limitato, quindi posso dire con ragionevole certezza che rimarrà tale. Ci proveremo, ma se qualcuno ha una soluzione che non richiede la modifica del codice dell'interfaccia utente jQuery di base sarebbe fantastico. – ceejayoz

+0

Nessun prob. Spero che * ci sia * una soluzione migliore là fuori per voi ... – Kev

+6

C'è un modo per farlo senza modificare i file sorgente di base, vedere la risposta qui sotto. IMO ci dovrebbe essere un'opzione per disabilitare la funzione di posizionamento automatico. – Purrell

0

Dalla documentazione, sembra che potresti essere in grado di utilizzare lo 'dialog' method del plug-in DatePicker per ottenere il risultato desiderato. Tuttavia, l'utilizzo di questo probabilmente significa che dovrai implementare parte della colla che altrimenti otterresti con datepicker, come un gestore di callback per estrarre la data, ecc.

Ho provato per prendere in giro del codice per vederlo in azione e per far sì che il datepicker non venga visualizzato, non sono riuscito a farlo funzionare. Ad ogni modo, volevo indicarti nel caso avessi miglior fortuna di me.

10

Il problema è quell'elemento in posizione: fisso mostra la posizione superiore 0px (verificare con: avviso $ ('# datepicker2'). Position()).

Soluzione:

$('#datepicker').datepicker({beforeShow: function(input) { 
    var x = 100; //add offset 
    var y = 20; 
    field = $(input); 
    left = field.position().left + x; 
    bottom = y; 
    setTimeout(function(){ 
     $('#ui-datepicker-div').css({'top':'', 'bottom':bottom + 'px', 'left': left + 'px'});  
    },1);      
}} 

prova HTML:

<form style="position:fixed; bottom:0; width:100%" name="form1" method="post" action=""> 
    <label> 
    <input style="left:300px; position:absolute; bottom:0" type="text" name="textfield" id="datepicker"> 
    </label> 
</form> 
+1

So che questo è un post più vecchio ma è l'unica cosa che ha funzionato per me di tutte le soluzioni pubblicate. jmav, grazie. – Travis

19

L'unico modo per essere certi (per la versione jQueryUI di datepicker) è quella di disabilitare la funzionalità del DatePicker che cerca di rendere all'interno il viewport. Ecco un modo per farlo senza modificare i file di codice sorgente:

$.extend(window.DP_jQuery.datepicker,{_checkOffset:function(inst,offset,isFixed){return offset}}); 

sulle versioni successive di JQuery UI prova:

$.extend($.datepicker,{_checkOffset:function(inst,offset,isFixed){return offset}}); 

Che armi nucleari solo la funzione _checkOffset all'interno datepicker che lo rende di scoiattoli. Quindi puoi usare il css .ui-datepicker per assicurarti che rimanga fisso se è quello che stai cercando. Maggiori informazioni allo how-to-control-positioning-of-jqueryui-datepicker.

+0

Ci proveremo, grazie! – ceejayoz

+0

Grazie mille per questo. Che dolore! –

+0

@Purell sei una star! Sono stati alla ricerca di questo per secoli, provando molti approcci diversi e questa è l'unica soluzione più solida finora. Heap di grazie – Philzen

1

Ho avuto un problema simile. Ho una pagina con raccoglitori di date potenzialmente utilizzati in varie posizioni sulla pagina, ma anche su un'intestazione fissa in cui l'utente può scorrere la pagina sia orizzontalmente che verticalmente con l'intestazione fissa che rimane al suo posto. L'intestazione ha anche un datepicker. Quindi non posso fare un cambiamento globale di datepicker.

Questo è quello che ho fatto. È certamente un kluge ma funziona così ho pensato che potesse aiutare qualcun altro.Speriamo che in futuro il jpery datepicker aggiungerà un'opzione di posizione.

beforeShow: function(input, inst) { 
    $("#ui-datepicker-div").css({ "visibility": "hidden", "display": "none"); 

    window.setTimeout(function() { 
     var leftPosition = parseInt($(window).width()/2); 
     $("#ui-datepicker-div").css({ "position": "fixed", "top": 0, "left": leftPosition }); 
     $("#ui-datepicker-div").css({ "visibility": "visible", "display": "inherit"); 
    }, 500); 
} 
Problemi correlati