So I made a very simple bare-bones dropdown menu in jQuery. When you hover over the menu button, the sub-menu properly displays, but if you try to move your mouse into the submenu it rapidly dissapears.
Any ideas how to keep that submenu open but at the same time have it close if the user moves their mouse away from the opening icon and NOT into the menu?
var moreCatsHovered = false;
$(".moreCatsRight").mouseenter(function () {// show pohelp
$(".moreCatsRightMenu").fadeIn(100);
});
$(".moreCatsRightMenu").mouseenter(function () {// show pohelp
moreCatsHovered = true;
});
$(".moreCatsRightMenu").mouseleave(function(){ // hide pohelp on mouse out from pohelp
$(".moreCatsRightMenu").fadeOut(100);
moreCatsHovered = false;
});
$(".moreCatsRight").mouseleave(function(){ // hide pohelp on mouse out from pohelp
if (moreCatsHovered == false)
{
$(".moreCatsRightMenu").fadeOut(100);
}
});
Here is my fiddle: http://jsfiddle.net/c3qz0eva/
* EDIT: I cannot change the HTML structure unfortunately *
Try this
$('.moreCatsRight').on('mouseenter',function(){
$('.moreCatsRightMenu').fadeIn(300);
}).on('mouseout',function(event){
var relatedTarget = $(event.relatedTarget);
if(typeof relatedTarget != "undefined"){
if(relatedTarget.hasClass('moreCatsRightMenu')){
return false;
}
}
$('.moreCatsRightMenu').fadeOut(300);
});
$('.moreCatsRightMenu').on('mouseout',function(event){
var relatedTarget = $(event.relatedTarget);
if(typeof relatedTarget != "undefined"){
if(relatedTarget.hasClass('moreCatsRight')){
return false;
}
}
$(this).fadeOut(300);
});
$(".moreCatsRight").mouseleave(function(){ // hide pohelp on mouse out from pohelp
if (moreCatsHovered == true)
{
$(".moreCatsRightMenu").fadeOut(100);
}
});
Your logic is wrong. notice the change I made on the if statement. I think this is what you're trying to do unless I'm misunderstanding the question.
Related
I have the following
function subNavToggle() {
var subNav = document.getElementById("subnav-section");
if (subNav.className === "navigation-subnav") {
subNav.className += " responsive";
} else {
subNav.className = "navigation-subnav";
}
}
I am trying to get the expanded menu to close when clicking outside of menu.
I have this, which will close the menu, but it also closes the hamburger menu - preventing the user to be able to open again.
$(document).click(function(event) {
var $target = $(event.target);
if(!$target.closest('.sub_nav_links').length &&
$('.sub_nav_links').is(":visible")) {
$('.sub_nav_links').hide();
}
});
Also thought I could get away with the following, but it actually does the opposite. Opening outside menu item.
window.onclick = subNav;
$('html').on('click, touchend', function (e) {
// Close hamburger menu when tapping outside
if ($(e.target).closest('#subnav-section').length == 0) {
var opened = $('.navigation-subnav').hasClass('responsive');
if (opened === true) {
$('.navigation-subnav').collapse('hide');
}
}
});
// to hide
$(document).click(function(){
$("#submenu").hide();
});
// you could possibly prevent to hide menu while using navigation
$("#menu").click(function(e){
e.stopPropagation();
});
I currently have an Overlay on my page which fades in when I click certain Navigation elements such as search/dropdown.
My problem is that if I click the dropdown, then click the Search menu item it fades out the overlay and breaks by showing the overlay and no search bar.
If the overlay is already open, you don't need to fade
it in, just fade it out when you click something else.
I've added a Variable to check if it's already open, but obviously this gets troublesome with 'FadeToggle'. I've tried a lot of combinations with this but can't seem to get it to the above.
var overlay = false;
$('#myDropdown').on('show.bs.dropdown', function () {
if(overlay == false) {
$(".overlay").fadeIn(150);
overlay = true;
}
})
$('#myDropdown').on('hide.bs.dropdown', function () {
if(overlay == true) {
$(".overlay").fadeOut(150);
overlay = false;
}
})
$( "#searchToggle, #mobileSearchToggle" ).click(function() {
$('.search-bar').toggleClass( "open" );
$('body').toggleClass("noScroll");
$('.dropdown-menu').removeClass('show');
if(overlay == false) {
$(".overlay").fadeToggle(150);
}
});
I have a small panel which i close if mouse down button is pressed anywhere else than that panel, basically it clears the data to display and just with the help of angularjs ng-show i hide it if there is no data...application is in angularjs and jquery
please find the code below
var closeSearchResultsIfClickedOutside = function (e) {
if ($(e.target).parents('.searchResults').length === 0) {
var scope = angular.element($("#searchContainer")).scope();
scope.$apply(function () {
/*Cancels any existing search*/
if ($scope.defer != undefined) {
$scope.defer.resolve();
}
$scope.showSearchResults = false;
reinitialize();
});
$("html").off("mousedown", closeSearchResultsIfClickedOutside);
reinitializePanelsWidth();
}
};
but i dont want to close this panel if mouse down is on scrollbar of browser window or any scrollbar..please tell me how to do that
to fix the above problem i am not capturing both event, mouse down and click, if the target element on both event matches then only i am closing the panel.
/*
If mouse down and click on the same control, then only close the panel,
Click event closing is added to avoid closing panel on scrollbar click.
*/
var closeSearchResultsIfClickedOutside = function (e) {
if (e.type === 'mousedown') { /* only if mouse down is outside of search panel then only close the panel. */
if($(e.target).parents('.searchResults').length === 0)
{
isMouseDownOnSearchPanel = true;
}
else {
isMouseDownOnSearchPanel = false;
}
}
else if (e.type === 'click' && isMouseDownOnSearchPanel) { /*click event is implemented to avoid closing when mouse down is on scrollbar. you dont get click get event for scrollbar*/
var scope = angular.element($("#searchContainer")).scope();
$("html").off("mousedown", closeSearchResultsIfClickedOutside);
$("html").off("click", closeSearchResultsIfClickedOutside);
isMouseDownOnSearchPanel = false;
reinitializePanelsWidth();
}
};
I have a page with a textarea #content and an input textbox #name. Once the user has clicked on #content, I want to prevent him from loosing focus of that textarea, unless he is clicking on #name.
I've tried the following:
// Prevent loss of focus for textarea
$("#content").on("blur", function(event) {
$('#name').mouseover(function() {
return true;
});
event.preventDefault();
this.focus();
return false;
});
It works just fine to prevent loss of focus of an element. But my idea of checking if he's hovering #name and returning just doesn't work.
Stole the code from here to get the element that triggered the blur.
var clicky;
$(document).mousedown(function(e) {
// The latest element clicked
clicky = $(e.target);
});
$("#content").on("blur", function(event) {
if (clicky.attr('id') == 'name') {
return true;
}
event.preventDefault();
this.focus();
return false;
});
fiddle
Something like this, maybe?
$(document).ready(function(){
var id;
$('#content').on('blur',function(){
$(":input").focus(function(){
id = this.id;
if(id != 'username' && id != 'content'){ // sorry, changed your id from name to username.
$('#content').focus();
}
});
});
});
Working fiddle: http://jsfiddle.net/ugx3S/
I have a button that toggles a menu popup. I have can make the menu disappear if you click outside of the menu but now my button toggle does not work. If I click the button again the menu stays up. How can I make the menu disappear if you toggle the button or if you click off the container?
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();
}
});
The mouseup function has to take care of the click on the button (quicklinks-rollover).
If fixed the whole thing here:
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();
}
});
Keep in mind those two things:
Use IDs to refer to the items quicker and prevent multiple popup conflicts
Using a mouse event on the whole page is not recommended as the event will get triggered very frequently, try using an alternative method such as adding a close button in the popup, or to be more effective, think about adding the mouseup listener on the show of the popup and removing it on the hide.
You can determine the state of the popup with: $(popup).is(':visible') or is(':hidden').
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();
}
});
You can do this Normal hide and show method. Because mostly toggle() function wont works in proper manner...
put your HTML button with attribute p="closed" by default:
<button class="quicklinks-rollover" p="closed" title="Quick Links">toggle</button>
Change Your 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();
}
});
The reason for this behavior, the mouseup() is binded when I perform the click() on the div. You can check this behavior by adding console.log message in .mouseup event.
So instead try like below.
$('.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