2013-07-16 4 views
0

У меня есть кнопка, которая переключает всплывающее меню. Я могу заставить меню исчезнуть, если вы нажмете за пределами меню, но теперь моя кнопка переключения не работает. Если я снова нажму кнопку, меню останется. Как я могу заставить меню исчезнуть, если вы переключаете кнопку или вы нажимаете на контейнер?jQuery кнопка toggle

jsFiddle: http://jsfiddle.net/PPcfN/

$('.quicklinks-rollover').click(function() { 
    $('.quicklinks').toggle(); 
}); 
$(document).mouseup(function (e) { 
    var container = $(".quicklinks"); 
    if (container.has(e.target).length === 0) { 
     container.hide(); 
    } 
}); 
+0

Надеюсь, вы можете использовать «display: none» Свойство CSS –

+1

FYI: .toggle() теперь устарел. – melancia

+0

О, я не знал. какова теперь альтернатива? – Chaddly

ответ

1

Функция MouseUp должна заботиться о нажатия на кнопку (Quicklinks-опрокидывание). Если констатировала все это здесь: http://jsfiddle.net/8VUnq/1/

$(document).mouseup(function (e) { 
    var popup = $('#quickLinksPopup'), 
     button = $('#quickLinksToggle'); 
    if (popup.is(':visible') 
     && !popup.is(e.target) 
     && !button.is(e.target) 
     && popup.has(e.target).length === 0 
     && button.has(e.target).length === 0) { 
     popup.toggle(); 
    } 
}); 

Имейте в виду, эти две вещи:

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

Вы можете определить состояние всплывающего окна с помощью: $ (popup) .is (': visible') или is (': hidden').

+1

Это потрясающе, спасибо Тибо. – Chaddly

+0

быстрый вопрос. если это нелегко, дайте мне знать, и я рассмотрю возможность создания новой темы. Могу ли я использовать $ ('. Quicklinks-rollover'). Hover (function() {}); чтобы он выглядел прозрачным, когда вы наводили курсор на кнопку? Или это потребует реструктуризации? – Chaddly

+0

Все, что вам нужно, это добавить параметр непрозрачности к классу в состоянии наведения. '.quicklinks-rollover: hover {opacity: .4; -ms-filter: "progid: DXImageTransform.Microsoft.Alpha (Opacity = 40)"; alpha (opacity = 40);} ' Это установит 40% непрозрачности в IE7 + и других браузерах. Но: hover не будет работать на IE6, поскольку он применяется к кнопке, а не к ссылке. – Tibo

0

Try:

var $quicklinks = $('.quicklinks'); 
var msOverLinks = false; 

$('.quicklinks-rollover').click(function() { 
    $quicklinks.toggle(); 
}); 

$quicklinks.mouseenter(function() { 
    msOverLinks = true; 
}).mouseleave(function() { 
    msOverLinks = false; 
}); 

$(document).mouseup(function (e) { 
    if(! msOverLinks) { 
     $quicklinks.toggle(); 
    } 
}); 
+0

, это заставляет тело переключать его, и кнопка больше не контролирует его. – Chaddly

+0

Ну, вы хотели, чтобы он был переключен, когда пользователь щелкает снаружи справа? Тело минус ссылки «снаружи». – Virus721

0

Вы можете сделать это нормальный скрыть и показать метод. Поскольку в основном переключения() функция привычка работает должным образом ...

положить кнопку HTML с атрибутом р = "закрыто" по умолчанию:

 <button class="quicklinks-rollover" p="closed" title="Quick Links">toggle</button> 

Изменить Ваш Jquery:

  $('.quicklinks-rollover').click(function() { 
      var a = $(this).attr("p"); 
      var container = $(".quicklinks"); 
      if(a=="closed"){ 
       container.show(); 
       $(this).attr("p","open"); 
      }else{ 
       container.hide(); 
       $(this).attr("p","closed"); 
      } 
     }); 
    $(document).mouseup(function (e) { 
     var container = $(".quicklinks"); 
     if (container.has(e.target).length === 0) { 
      container.hide(); 
     } 
    }); 
+0

Я не вижу разницы в функциональности с этим. – Chaddly

+0

Я отредактировал и отобразил правильный код jquery..Он работает отлично, я думаю ..... – crazyarun

0

Причина такого поведения: mouseup() привязывается, когда я выполняю команду click() на div. Вы можете проверить это поведение, добавив сообщение console.log в .mouseup.

Так что вместо этого попробуйте, как показано ниже.

$('.quicklinks-rollover').on('click', function (e) { 
    $('.quicklinks').toggle(); 
    e.stopImmediatePropagation(); 
}); 

$(document).click(function (e) { 
    var container = $(".quicklinks"); 
    console.log(container.has(e.target).length); 
    if (container.has(e.target).length === 0) { 
     container.hide(); 
    } 
}); 

Working Fiddle