jquery или javascript вдоль элемента hide, если он виден при нажатии на тело, где - PullRequest
0 голосов
/ 10 сентября 2011

Я пытаюсь закрыть выпадающее меню, когда кто-то нажимает в другом месте на сайте. Только если он найден открытым. Однако приведенный ниже фрагмент, похоже, не работает и блокирует браузер. Так что я думаю, что я ошибаюсь. Есть ли лучший способ справиться с этим понятием?

$(document.body).click(function() {
    if($('#ztsWidgetMenu').is(':visible'))
    {   
        $('#addDashWidgetBox').click();
    }
});

EDIT

Я сделал функцию, которая теперь срабатывает при событии щелчка, чтобы элемент открывал его, а щелчок тела вызывал, пузырьки прекратились, но я столкнулся с другой проблемой сейчас. Для того, чтобы открыть меню, мне нужно щелкнуть мышью по крайней мере 2 раза, чтобы открыть меню. И если я нажму на ту же кнопку, чтобы закрыть ее, то я застряну с ней открытой, если я не нажму на тело в другом месте, где сейчас ..

function openCloseWidgetMenu()
{
        dashboardJSON.widgets.sort(sortJSONresultsByWidgetID);  
        if(widgetMenuShowHide == "hide")
        {
            widgetMenuShowHide = "shown";
            $.each(dashboardJSON.widgets, function(x)
            {
                if(dashboardJSON.widgets[x].show == "no"){$('#ztsWidgetMenu ul').append('<li class="widgetMenuItems" rel="'+dashboardJSON.widgets[x].wigetID+'" widgetcolor="'+dashboardJSON.widgets[x].widgetColor+'">'+dashboardJSON.widgets[x].widgetTitle+'</li>');}
            });
            $('#ztsWidgetMenu').css({"display":"block", "position":"absolute", "left":($('#addDashWidgetBox').position().left-35) + "px", "top":($('#addDashWidgetBox').offset().top+$('#addDashWidgetBox').height()+10) + "px"});
        }
        else
        {
            $('#ztsWidgetMenu ul li').remove();
            $('#ztsWidgetMenu').hide();
            widgetMenuShowHide = "hide";
        }
}
$('#addDashWidgetBox').live({
    click: function()
    {
        //e.preventDefault();
        openCloseWidgetMenu();
    },
    mouseover: function()
    {
        $('#addWidetMenuBar').css({"background-position":"-0px -697px"});
        $(this).css({"color":"#000"});
    },
    mouseout: function()
    {
        $('#addWidetMenuBar').css({"background-position":"-0px -662px"});
        $(this).css({"color":"#5a5a5a"});
    }
});

$(document.body).click(function() {
    if($('#ztsWidgetMenu').is(':visible'))
    {   
        openCloseWidgetMenu();
    }
});

Редактировать 2

Я исправил свою проблему по большей части, кроме как сейчас .. когда я нажимаю на элемент, я хочу отключить функцию, чтобы показать меню, в котором регистрируется щелчок тела, так что теперь она запускает ту же функцию дважды одним щелчком мыши.

Ответы [ 2 ]

2 голосов
/ 10 сентября 2011

Я предполагаю, что это вызвано Событием Bubbling ..

когда #addDashWidgetBox "нажимается" вашим кодом, это также вызывает нажатие body, что приводит вас в бесконечный цикл.

просто будьте более конкретны о том, что вы хотите, чтобы произошло ...

Вместо того, чтобы имитировать пользовательский ввод (через ваше руководство .click()), просто будьте более явным

$(document.body).click(function() {
    if($('#ztsWidgetMenu').is(':visible'))
    {   
        //Call functions being fired by the simulated click directly...
    }
});
0 голосов
/ 10 сентября 2011

Я бы попытался поместить следующее в событие onBlur ztsWidgetMenu

if($('#ztsWidgetMenu:visible')) {
    $('#ztsWidgetMenu').hide();
}

Или что-то в этом роде. Селектор jQuery выберет его, только если он виден.

...