faire en sorte que le datepicker de jQuery UI s'ouvre toujours dans une certaine direction?

j'utilise le contrôle de jQuery UI dans un position: fixed barre d'outils au bas de ma page. De temps en temps, sur les ordinateurs aléatoires, le curseur de données apparaît sous la barre d'outils, ce qui signifie qu'il est hors de la page et impossible de voir ou d'interagir avec.

Est-il un moyen pour forcer le positionnement du contrôle datepicker pour toujours être au-dessus et à la droite de son <input>?

15
demandé sur Robert Harvey 2009-10-06 19:53:11

6 réponses

vous pouvez changer les lignes:

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;

...à lire:

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

cela perd cependant de la flexibilité. Si votre entrée se trouve au haut de la page, vous aurez le problème inverse d'avant.

6
répondu Kev 2009-10-27 18:36:47

la seule façon d'être certain (pour la version jQueryUI de datepicker) est de désactiver la fonctionnalité du datepicker qui essaie de rendre à l'intérieur du viewport. Voici un moyen de le faire sans modifier les fichiers de code source:

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

sur les versions ultérieures de jQuery UI try:

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

qui ne fait qu'atomiser la fonction _checkOffset à l'intérieur du curseur de données qui la rend étrange. Ensuite, vous pouvez utiliser le .ui-datepicker css pour s'assurer qu'elle reste fixe si c'est ce que vous êtes après. Plus d'infos sur comment le contrôle de positionnement de jqueryui-datepicker.

19
répondu Purrell 2017-05-23 12:07:01

Problème, c'est que l'élément en position: fixed, montrer la position 0px (vérifier avec: alerte$('#datepicker2').position.))(

Solution:

$('#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);                    
}}

Test 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>
10
répondu jmav 2009-10-30 01:20:44

http://www.mindfiresolutions.com/Make-jQuery-datepicker-to-popup-in-different-positions-995.php

cochez cette. J'ai utilisé ceci et j'ai été capable de positionner le contrôle du curseur de données dans tous les navigateurs.

3
répondu Aseem 2011-08-01 20:08:06

j'ai eu un problème similaire. J'ai une page avec des cueilleurs de date potentiellement utilisés à divers placés sur la page mais aussi sur un en-tête fixe où l'utilisateur peut faire défiler la page à la fois horizontalement et verticalement avec l'en-tête fixe restant en place. L'en-tête a aussi un cliqueur de données. Donc je ne peux pas faire un changement global de datepicker.

C'est ce que j'ai fait. C'est certes un kluge, mais ça marche, alors j'ai pensé que ça pourrait aider quelqu'un d'autre. Avec un peu de chance, le jquery datepicker va ajouter une option position.

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);
}
1
répondu SemanticZen 2012-07-11 17:36:12

à Partir de la documentation, il semble que vous pourriez être en mesure d'utiliser le 'dialogue' méthode du plugin de cliqueur de données pour atteindre le résultat désiré. Cependant, l'utilisation de ce moyen très probable signifie que vous devrez mettre en œuvre une partie de la colle que vous obtiendriez autrement hors-de-la-boîte avec le curseur de données, tel qu'un gestionnaire de rappel pour extraire la date, etc.

j'ai essayé de faire une maquette d'un code pour le voir en action et à moins d'avoir le curseur de données à afficher, Je n'ai pas pu tout à fait obtenir ce travail, cependant. Bref, je voulais te le dire au cas où tu aurais plus de chance que moi.

0
répondu Joe Holloway 2009-10-28 22:45:39