20 Stimmen

jQuery Datepicker: Schließen des Pickerls beim Anklicken eines Datums verhindern

Hallo Stackoverflow-Kollegen,

Ich benutze die jQuery Datepicker-Plugin zusammen mit Martin Milesich Timepicker Plugin. Alles funktioniert gut, außer der Tatsache, dass ein Datum in der Datumsauswahl klicken, schließt das Widget, so dass keine Zeit, um die Zeit zu wählen.

Frage: Ich frage mich, ob es eine Möglichkeit gibt, das Schließen des Widgets zu verhindern, wenn man auf ein Datum klickt, und stattdessen die Benutzer zu zwingen, auf die Schaltfläche "Fertig" zu klicken (die angezeigt wird, wenn die Option "showButtonPanel: true" aktiviert wird), oder außerhalb des Widgets zu klicken. Ich möchte nicht, dass meine Benutzer das Widget zweimal öffnen müssen! Siehe das Verhalten online bei der Timepicker-Demo

Für jede Hilfe bei der Lösung dieses Problems oder sogar für Hinweise in die richtige Richtung sind wir dankbar!

Mehr Infos: Ich verwende die von Martins Download-Link gelieferten Dateien: http://milesich.com/tpdemo/timepicker-0.2.0.zip

  • jquery-ui-1.7.2.custom.min.js
  • timepicker.js (neueste Version 0.2.0)

Dies sind die Optionen, die ich verwende:

$(document).ready(function(){
    $(".datepicker").datepicker({
        duration: '',  
        showTime: true,  
        constrainInput: false,  
        stepMinutes: 5,  
        stepHours: 1, 
        time24h: true,
        dateFormat: "yy-mm-dd",
        buttonImage: '/static/images/datepicker.png',
        buttonImageOnly: true,
        firstDay: 1,
        monthNames: ['Januari','Februari','Mars','April','Maj','Juni','Juli','Augusti','September','Oktober','November','December'],
        showOn: 'both',
        showButtonPanel: true
     });
})

0 Stimmen

Eine kurze Anmerkung, um zu sagen, dass dieses Problem in der aktuellen Version des TimePicker-Plugins nicht mehr auftritt.

0 Stimmen

@JamesMcGrath: Danke, gut zu wissen!

2 Stimmen

@lucifer: Tut mir leid, nein. Sie benutzen StackOverflow falsch. Wenn Sie eine Frage haben, schreiben Sie eine neue Frage mit so vielen Informationen, wie Sie können. Sie werden wahrscheinlich innerhalb von ein paar Stunden eine Antwort erhalten.

28voto

Emil Stenström Punkte 11959

Als Hinweis, und da mich Leute per E-Mail danach gefragt haben. Hier ist ein Code-Chunk, der zu timepicker.js hinzugefügt werden muss:

/**
 * Don't hide the date picker when clicking a date
 */
$.datepicker._selectDateOverload = $.datepicker._selectDate;
$.datepicker._selectDate = function(id, dateStr) {
    var target = $(id);
    var inst = this._getInst(target[0]);
    inst.inline = true;
    $.datepicker._selectDateOverload(id, dateStr);
    inst.inline = false;
    this._updateDatepicker(inst);
}

Viel Glück bei der Umsetzung auf Ihrer Website!

0 Stimmen

+1 eine alte Frage, aber sie funktioniert immer noch! Danke für diesen Hinweis.

0 Stimmen

@zaf: Danke für die Rückmeldung und die Abstimmung :)

0 Stimmen

Das funktioniert, aber es scrollt an den oberen Rand des Bildschirms, wenn das Datum ausgewählt wird... zumindest in Chrome.

28voto

Min Hur Punkte 416

Anstatt die Quelle zu ändern, ist es besser, die bestehenden Ereignisse zu verwenden.

onSelect: function() {
    $(this).data('datepicker').inline = true;                               
},
onClose: function() {
    $(this).data('datepicker').inline = false;
}

1 Stimmen

Dies ist eine viel bessere Lösung. Hinweis: Dadurch wird die Schaltfläche "Fertig" entfernt, wenn Sie showButtonPanel: true ermöglicht. Ich habe nicht herausgefunden, wie ich dieses Verhalten abstellen kann.

0 Stimmen

Ich danke Ihnen vielmals. Das ist die perfekte Lösung.

0 Stimmen

@PhilMoorhouse Ein bisschen spät, aber vielleicht hilft es trotzdem jemandem: in jquery-ui finden Sie eine _generateHTML Funktion, die die Schaltfläche "Fertig" nicht hinzufügt, wenn die Instanz inline: true gesetzt. Sie können nach dem einzigen Vorkommen von ui-datepicker-close und dieses Verhalten loszuwerden.

8voto

redsquare Punkte 76970

Sie müssen den Datepicker selbst hacken. Dies ist der Code, der verwendet wird. Wenn er nicht inline ist, wird er ausgeblendet, wenn Sie ein Datum auswählen.

Sie könnten in Ihre eigene onSelect-Methode übergeben und schnell die datePicker-Instanz ändern, um inline zu sein und dann ändern Sie es zurück, ohne die datepicker Interna zu ändern, aber es ist eine sehr hacky Lösung.

if (inst.inline)
        this._updateDatepicker(inst);
else {
      this._hideDatepicker(null, this._get(inst, 'duration'));
      this._lastInput = inst.input[0];
      if (typeof(inst.input[0]) != 'object')
      inst.input[0].focus(); // restore focus
      this._lastInput = null;
}

0 Stimmen

Vielen Dank redsquare, Ihre Antwort führte mich in die richtige Richtung. Es scheint, dass onSelect nur ausgelöst wird, wenn ein Datum ausgewählt wird, so einfach Aufruf show() auf die Instanz auf Select gibt mir das Verhalten, das ich will. ... onSelect: function(dateText, inst){ inst.show(); }

0 Stimmen

Nein, meine Schuld. Die oben wirft einen Fehler, etwas, das zu stoppen scheint der Picker von verstecken. Ich kann immer noch nicht bekommen Ihren Vorschlag zu arbeiten. Wenn ich es auf "inline" stelle, verschwindet die Schaltfläche "Fertig", und es gibt keine andere Möglichkeit, das Fenster zu schließen, als außerhalb des Fensters zu klicken. Ich habe versucht, eine Zeitüberschreitung festzulegen und den Inline-Modus zurückzusetzen - ohne Erfolg.

0 Stimmen

Ok, ich habe eine zweite Möglichkeit gefunden, das zu tun, was ich will. Es ist tatsächlich möglich, die _selectDate-Methode, aus der der von Ihnen oben angegebene Code stammt, mit einer benutzerdefinierten Methode zu überschreiben. Diese Methode enthält genau den gleichen Code wie in der Originaldatei, aber ohne die Zeile "_hideDatepicker". Das ist einfach und ziemlich hakelig, aber es funktioniert.

4voto

TomPAP Punkte 239

Hier ist eine Lösung:

onSelect: function ( dateText, inst ) {
    ..... // Your code like $(this).val( dateText );`

    //Set inline to true to force "no close"
    inst.inline = true;
},
onClose: function(date,inst){
    //Set inline to false => datapicker is closed
    // onClose is called only if you click outside the datapicker, onSelect will not
    // trig onClose due to inline = true
   inst.inline = false;
}

`

3voto

Mina Luke Punkte 1776

Warum bieten alle Kommentare eine Abhilfe an? Es ist ein klares Wort:

Inline-Kalender mit altField verwenden :)

    <input type="text" id="alternate" size="30" />
    <div id="datepicker"></div>

    <script>
       $("#datepicker").datepicker({
          altField: "#alternate"
       });
    </script>

prüfen Sie diese Fiedel: http://jsfiddle.net/menocomp/y2s662b0/1/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X