2016-06-27 5 views
0

Я пытаюсь настроить функцию jquery, которая проверяет ширину окна, чтобы панель навигации работала правильно. Я хочу, чтобы это произошло: если ширина экрана больше чем 949px, инициируйте функцию, которая наводит курсор на ссылку привязки .dropdown, открывает подменю выпадающего меню; если ширина экрана меньше или равна, что 949px, удалите эту функцию, чтобы нажимать ссылку привязки .dropdown, чтобы открыть выпадающее подменю (раскрывающиеся ссылки открываются по умолчанию при нажатии на них - я думаю это компонент начальной загрузки).Функция изменения размера окна jquery запускается только один раз, а не при каждом изменении размера.

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

var width = $(window).width(); 
$(window).resize(function(){ 
    if($(this).width()>949){ 
    $(".dropdown").hover(function(){ 
     $(this).addClass("open"); 
    }, 
    function(){ 
     $(this).removeClass("open"); 
    }); 
    } 
}); 

Как можно улучшить эту функцию так, чтобы .dropdown функциональные возможности парения добавляют при ширине выше 949px и удалены на 949px и ниже?

+0

Просто хочу, чтобы убедиться: вар а - Ь; Правильно ли это синтаксис или просто опечатка? – elfwyn

+0

Я вижу, что вы добавляете событие hover в поля .dropdown, когда размер больше 949, но разве вы не хотите удалить этого слушателя, когда размер меньше? Я не очень привык к jQuery, но я уверен, что у него есть функции для удаления прослушивателя событий: взгляните на on() и off() – elfwyn

+0

Эй, вы правы, это была опечатка, которая была отредактирована , Я не совсем уверен, как пересмотреть мой скрипт с вашим предложением ... Я думаю, что обе функции (добавление зависания или удаление зависания) зависят от событий «on» изменений. –

ответ

4

Вместо добавления и удаления привязок, просто установить событие связывания и проверить размер, прежде чем делать что-нибудь:

$(".dropdown").hover(function() { 
    if ($(window).width() > 949) { 
     $(this).addClass("open"); 
    } 
}, function() { 
    if ($(window).width() > 949) { 
     $(this).removeClass("open"); 
    } 
}); 

Если добавить и удалить обработчик события, вы должны предотвратить это делать два раза (например, они изменить размер до 980, а затем изменить размер до 1050).

var hover_added = false; 

$(window).resize(function() { 
    var width = $(this).width(); 
    if (width > 949 && !hover_added) { 
     $(".dropdown").on({ 
      mouseenter: function() { 
       $(this).addClass("open"); 
      }, 
      mouseleave: function() { 
       $(this).removeClass("open"); 
      } 
     }); 
     hover_added = true; 
    } else if (width <= 949 && hover_added) { 
     $(".dropdown").off("mouseenter mouseleave"); 
     hover_added = false; 
    } 
}); 
+0

Привет и благодарю вас за ответ Бармар. Этот код близок, но в любое время я изменяю ширину экрана от 950px до 950px и выше, функция зависания перестает работать. –

+0

Я забыл очистить 'hover_added' при удалении обработчика. – Barmar

+0

Ты мужчина. Большое спасибо за вашу помощь. –

0

probaply не совершенны, так как JQuery не моя сильная сторона, но она делает работу:

var width = $(window).width(); 
$(window).resize(function(){ 
    if($(this).width()>949){ 
    $(".dropdown").on({ 
     mouseenter: function() { 
      $(this).addClass("open"); 
     }, 
     mouseleave: function() { 
      $(this).removeClass("open"); 
     } 
    }); 
    } 
    else{ 
    $(".dropdown").off("mouseenter"); 
    $(".dropdown").off("mouseleave"); 
    } 
}); 

Имейте в виду, что эта реализация будет удалять любые другие существующие MouseEnter и MouseLeave обработчики событий на .dropdown элементов, а также ,

+0

Спасибо за ответы elfwyn. Кажется, это работает лучше, я посмотрю, смогу ли я на это поработать. –

+0

Возьмите код Barmars, так как он предотвращает накладные расходы и более утончен, чем мое решение. – elfwyn

0

Мое предложение (для того, чтобы избежать связывать несколько раз то же самое событие):

var width = $(window).width(); 
 

 
$(window).on('resize', function(e) { 
 
    doResize(e); 
 
}); 
 

 
function doResize(e) { 
 
    if ($(this).width()>949) { 
 
    var isOpenOnHover = $('.dropdown-toggle').data('isOpenOnHover'); 
 
    if (isOpenOnHover) { 
 
     return; 
 
    } 
 
    $('.dropdown-toggle').data('isOpenOnHover', true); 
 
    $('.dropdown-toggle').hover(function() { 
 
     $('.dropdown-toggle').trigger('click.bs.dropdown'); 
 
    }); 
 
    } else { 
 
    $('.dropdown-toggle').data('isOpenOnHover', false); 
 
    $('.dropdown-toggle').off('mouseenter mouseleave'); 
 
    } 
 
} 
 

 
$(function() { 
 
    $('.dropdown-toggle').data('isOpenOnHover', false); 
 
    doResize(); 
 
});
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"> 
 
<script src="https://code.jquery.com/jquery-1.12.1.min.js"></script> 
 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> 
 

 

 

 
<div class="bs-example"> 
 
    <div class="dropdown"> 
 
     <a href="#" data-toggle="dropdown" class="dropdown-toggle">Dropdown <b class="caret"></b></a> 
 
     <ul class="dropdown-menu"> 
 
      <li><a href="#">Action</a></li> 
 
      <li><a href="#">Another action</a></li> 
 
     </ul> 
 
    </div> 
 
</div>

+1

Эй, благодарю вас за ваш ответ, но я выбираю вышеупомянутый ответ, так как у меня уже есть работа. –