views:

32

answers:

2

I simply want to hide a div, if a text box loses focus, unless, the user clicks in another certain div. If user clicks that particular div, then the focusout doesn't trigger the div.box being hidden.

Below is code with my pseudocode commenting. Any ideas?

textInput.focusout(function() {
    // So long you didn't click div.stop, then
        $('div.box').hide();
});
A: 
var flag = false;

$('div.stop').click(function() {flag = true;});
textInput.focusout(function() {
    // So long you didn't click div.stop, then
    if(!flag)
        $('div.box').hide();
});

If you wanted to avoid adding the flag variable, you could use jQuery's .data to store the flag value against e.g. the div.stop element, e.g:

$('div.stop').click(function() {$(this).data('clicked', true);});

// ...

    if(!$('div.stop').data('clicked'))
// ...

EDIT

If you want to allow for the situation where the text box has focus, and you then click on div.stop, and you don't want it to hide, then you could try something like:

$('div.stop').click(function() {$('div.box').stop();});
textInput.focusout(function() {
    // So long you didn't click div.stop, then
    $('div.box').delay(200).hide();
});
sje397
Hmmm... have you tested it? I think that the text box might lose focus before `click` fires on the button.
Strelok
@Strelok - edited. I think your interpretation is correct.
sje397
I did some modifications to enable it to be fired multiple times in a document, but the general solution you provided was correct. Thanks!
James
+2  A: 
var flag = false;
$('#inputID').blur(function(){
   $('div.box').toggle(flag);       
});

$('#someDIVid').click(function(){
    flag = true;
});

simple demo

added notes:

.toggle( showOrHide )

showOrHide A Boolean indicating whether to show or hide the elements. If this parameter is true, then the matched elements are shown; if false, the elements are hidden.

Reigel
There's no point in using toggle here - `if(!flag) ....hide()` is more efficient and easier to read.
sje397
@sje397 - I expected someone would say that :) But you were the one to answer first, so I have to think of other ways. What's in my mind is maybe the OP may want to show the box again after clicking another box (`div.stop` on OP) if `div.box` already hidden. :)
Reigel