2013-03-27 8 views
5

Ich benutze Trent Richardsons jQuery UI Timepicker. Ich weiß, dass das Plugin geändert wurde, um $ .datepicker._selectDate zu überschreiben, so dass die Auswahl geöffnet bleibt, wenn ein Datum ausgewählt wird. Das ist großartig.ich bin nicht in der Lage, Ereignis zu datetimepicker Plugin zu binden

Ich wurde jedoch gebeten, den Picker schließen zu lassen, wenn Sie auf ein Datum doppelklicken. Alles andere bleibt gleich, einschließlich einer Schaltfläche zum Schließen der Auswahl, wenn sie fertig ist, usw., nur dass der Doppelklick ebenfalls funktionieren soll.

Ich habe versucht, das Doppelklick-Ereignis an Kalenderdaten auf verschiedene Arten zu binden (meistens Variationen von $('.ui-datepicker-calendar a').bind('dblclick', function() {/*do something*/});) - in der Tat habe ich versucht, andere Ereignisse auch zu binden - und nichts scheint zu funktionieren. Ich habe versucht Vorschläge für How to close DateTimePicker with a double click ohne Freude geschrieben.

dies überhaupt möglich ist? Muss ich die onSelect Funktion modifizieren zwischen einem Klick und einem Doppelklick auf? (und wie, wenn event.type nicht definiert ist?) zu unterscheiden Bin ich Bindung an das falsche Element? (Ich habe versucht, bindet auf $('.ui-datepicker-calendar a'), $('#ui-datepicker-div'), $('#ui-datepicker-div .ui-datepicker-calendar a') und zahlreiche andere Variationen.)

Aus Gründen der Vollständigkeit, hier ist mein Code:

$('#date-range-from, #date-range-to').datetimepicker({ 
    changeYear: true, 
    changeMonth: true, 
    controlType: 'select', 
    dateFormat: 'M dd, yy ', 
    minDate: 'Jan 01, 2010 ', 
    maxDate: 'Dec 31, xxxx '.replace('xxxx', new Date().getFullYear() + 1), 
    showAnim: '', 
    showMinute: false, 
    showOtherMonths: true, 
    showTime: false 
}).on('change', function() { 
    var t = $(this), 
     date = t.val().slice(0, 12), 
     fromto = t.attr('id').replace('date-range-', ''), 
     time = t.val().slice(-5); 
    dashboardOpts.dateRange[fromto].date = date; 
    dashboardOpts.dateRange[fromto].time = time; 
}).mousedown(function() { 
    $('#ui-datepicker-div').toggle(); 
    $(this).blur(); 
}); 
$('#ui-datepicker-div .ui-datepicker-calendar a').bind('dblclick', function() { 
    console.log('I just want to see if this event can be bound!'); 
}); 

Vielen Dank im Voraus für jede Hilfe!

Edit: Zur Klarstellung von „Variationen ... .bind('dblclick', ...)“ Ich meinte, dass ich versuchte .live('dblclick', ...) und $(element).on('dblclick', ...) und $(document).on('dblclick', element, ...) (obwohl ich es als veraltet weiß).

Ich habe auch versucht, .stopPropagation() und .stopImmediatePropagation(), obwohl ich glaube nicht, dass dies ein Vermehrungsproblem ist.

Ich glaube, es gibt etwas im datetimepicker-Plugin-Code, der Ereignisse im Kalender entführt. Leider konnte ich es noch nicht finden. Jeder Einblick wird sehr geschätzt!

Antwort

6

In Datetimepicker Quelle können Sie Autor verwenden, um einen Hack sehen Schließen zu deaktivieren, wenn ein Datum ausgewählt ist. Er nennt es selbst einen schlechten Hack.

Wie auch immer, hier ist eine Problemumgehung um datapicker zu schließen, wenn Sie auf ein Datum doppelklicken. Ich benutze onSelect Funktion Rückruf:

SEE DEMO

$('#mydatepicker').datetimepicker({ 
    onSelect: function (e, t) { 
     if (!t.clicks) t.clicks = 0; 

     if (++t.clicks === 2) { 
      t.inline = false; 
      t.clicks = 0; 
     } 
     setTimeout(function() { 
      t.clicks = 0 
     }, 500); 
    } 
}); 

in gewisser Weise also, ich simulieren dblclick Verhalten ein Timeout verwendet. Ich setze es auf 500ms, aber spiele einfach damit, wenn dein dblclick mehr oder weniger empfindlich sein soll.

UPDATE

@JaredKnipp Es dass Fokus erscheint Eingang gesetzt wird, wenn Monat geschaltet (unvalid ???), ich habe nicht genug Zeit, sie im Detail zu überprüfen, es tut mir leid. Als einfache Abhilfe, könnten Sie folgenden Ausschnitt versuchen, fügen Sie es endDateTextBox onClose Rückruf:

  var focusHandlers = $._data(endDateTextBox[0], "events").focus; 
     $._data(endDateTextBox[0], "events").focus = {}; 
     endDateTextBox.one('focusin.datetimepicker mouseenter.datetimepicker', function() { 
      setTimeout(function() { 
       $._data(endDateTextBox[0], "events").focus = focusHandlers; 
       endDateTextBox.blur(); 
      }, 0); 
      $(this).off('focusin.datetimepicker mouseenter.datetimepicker'); 
     }); 

Beachten Sie, dass, wenn Sie jq Version vor 1.8 verwenden, können Sie $.data() nicht $._data() Hoffe, es hilft verwenden ...

+0

Vielen Dank dafür! Es funktioniert brillant! –

+0

Die Lösung funktioniert gut für mich, solange ich Monate des Jahres nicht ändern. Wenn ich Monate ändern, erscheint der Datepicker Dialog wie es schließt und dann wieder auftaucht es gibt keine Arbeit für diese? Ich bin eine Date-Range-Lösung implementieren. http://pastebin.com/T8a2pUPv –

+0

@ JaredKnipp aktualisierte Antwort mit möglichen Workaround, überprüfen Sie, ob es Ihren Bedürfnissen entspricht –

0

Funktioniert Folgendes?

$('#ui-datepicker-div .ui-datepicker-calendar a').dblclick(function() { 
    console.log('I just want to see if this event can be bound!'); 
}); 

dblclick docs.

+0

leider, nein, das funktioniert nicht. Das ist nur eine Abkürzung für '.bind ('dblclick, function ...)' auf jeden Fall. Ich wünschte, ich würde eine Fehlermeldung oder so etwas bekommen, aber es tut einfach nichts. –

0

bearbeiten

try auch live in jquery 1,7 oder on in jquery 1,9:

$('#ui-datepicker-div .ui-datepicker-calendar a').live('dblclick', function() { 
    alert('I just want to see if this event can be bound!'); 
}); 

Versuch a tag zu lösen, bevor es zu binden. vielleicht ist es mit einer anderen Funktion binden:

$('#ui-datepicker-div .ui-datepicker-calendar a').unbind('dblclick'); 
$('#ui-datepicker-div .ui-datepicker-calendar a').bind('dblclick', function() { 
    alert('I just want to see if this event can be bound!'); 
}); 
+0

Leider hat das auch nicht funktioniert. –

+0

versuchen Sie es auch Live-Funktion vielleicht funktioniert es. – Alireza41

+0

danke für deine Vorschläge. Ich hatte bereits .live() und .on() - sowohl auf dem Element als auch auf dem Dokument - versucht, bevor ich meine Frage postete. Dies ist, was ich mit Variationen von .bind() gemeint habe. Das Problem scheint zu sein, dass etwas im Plugin selbst diese Ereignisse überschreibt, aber ich kann es nicht herausfinden. :( –

Verwandte Themen