views:

30

answers:

0

I'm creating a Javascript JQuery Timepicker control plugin (which I hope to open source soon) and I would like some advice on how to best register the events in the cleanest way.

The control will attach to an <input> box and provide a graphical way to enter times of day ( 14:25, 2:45 AM, etc...). It does this by adding a <div> after the input box.

What I want is to bind an openControl() function that fires when the input is clicked or tabbed to, and a closeControl() function that fires when the input box is tabbed away from or deselected but not if the control itself is clicked. That is, I don't want to close the control if you're clicking inside of the control's <input> or the <div>.

Here's what I have been doing to try to get there:

/* Close the control attached to the passed inputNode */
function closeContainer(inputNode, options) {
    $input = $(inputNode);
    if ( $input.next().is(':visible')) {
        $input.next().hide(options.hideAnim, options.hideOptions, options.hideDuration, options.onHide );
    }
}

 /* Open the control */
function openContainer(node, options) {
    $input = $(node);
    $input.next().show(options.showAnim, options.showOptions, options.showDuration, options.onShow );

    // bind a click handler for closing the contol
    $("body").bind('click', function (e) {
        $('.time-control').each( function () {
            $input = $(this).prev();
            // only close if click is outside of the control or the input box
            if (jQuery.contains(this, e.target) || ($input.get(0) === e.target) ) {
                closeContainer($input, options);
                setTime($input, $input.next(), options);
            } else {
                closeContainer($input, options);
            }
        });
    });
}

I want to add support for tabbing in/out but I feel like this approach is wrong. Focus/Blur wasn't working well because the blur event fires if you click on the control. Should I be using those events but filtering out if they are inside the control's div?

Anyone have a better way of doing this? Thanks!