I am able to make a hidden div show/hide when an input field is in focus/blur using the following code:
$('#example').focus(function() {
$('div.example').css('display','block');
}).blur(function() {
$('div.example').fadeOut('medium');
});
The problem is I want div.example
to continue to be visible when the user is interacting within this div. E.g. click, or highlighting the text etc. within div.example
. However div.example
fades out whenever the input is not in focus and the mouse is interacting with elements within the div.
The html code for the input and div elements is as follows:
<p>
<label for="example">Text:</label>
<input id="example" name="example" type="text" maxlength="100" />
<div class="example">Some text...<br /><br />More text...</div>
</p>
How do I make it such that the div.example
only disappears when the user clicks outside the input and/or div.example
? I tried experimenting with focusin/focusout to check the focus on <p>
but that didn't work either.
Would it matter that div.example
is positioned directly below the input field #example using jQuery? The code that does that is as follows:
var fieldExample = $('#example');
$('div.example').css("position","absolute");
$('div.example').css("left", fieldExample.offset().left);
$('div.example').css("top", fieldExample.offset().top + fieldExample.outerHeight());
My apologies if this has been asked before, but the many show/hide div questions I read does not cover this. Thanks for your advice. :)
If you track the focusin event on the document since focusin bubbles then you can figure out if the new thing in focus is "outside" and if so do something about it. This will work for both clicks and tabbing.
$('#example').focus(function() {
var div = $('div.example').show();
$(document).bind('focusin.example click.example',function(e) {
if ($(e.target).closest('.example, #example').length) return;
$(document).unbind('.example');
div.fadeOut('medium');
});
});
$('div.example').hide();
Updated the code to use both the focusin and click event to decide if to hide the div.example. I am using namespaced events so that I can call unbind('.example') to unbind both of them.
Example: http://jsfiddle.net/9XmVT/11/
Side Note Change your css positioning code to only call the css method once:
$('div.example').css({
"position":"absolute",
"left": fieldExample.offset().left,
"top": fieldExample.offset().top + fieldExample.outerHeight()
});
Example with using the absolute positioned div: http://jsfiddle.net/9XmVT/14/
UPDATE
Ben Alman just updated his clickoutside event and converted it to handle alot of *outside events. http://benalman.com/projects/jquery-outside-events-plugin/
Would let you do something like this:
$('#example').focus(function() {
$('div.example').show().bind('focusoutside clickoutside',function(e) {
$(this).unbind('focusoutside clickoutside').fadeOut('medium');
});
});
$('div.example').hide();