仅添加一次元素

时间:2015-12-31 11:49:24

标签: jquery drop-down-menu responsive-design append

我有一个带有导航栏的响应式电子商务模板,当窗口在某个断点下方调整大小时,会垂直堆叠。

带有子项的菜单项附加了"扩展器"。单击时,将展开相应的子菜单。

功能:

    function breakPointHendle(){
      elm.find('li').each(function() {
        if($(window).width() <= defaults.breakPoint) {
          if ($(this).find('ul').length > 0) {
            $(this).addClass("parent");
            $(this).append('<i class="expander fa fa-angle-down"></i>');
          }
        } else {
          $(this).removeClass("parent");
          $(this).removeClass("active");
          $(this).find('.expander').remove(); 
          $(this).find('ul').removeAttr("style"); 
          $(hamburger).removeClass("active"); 
        }
      }); 

      $("i.expander").click(function() {
        if (!$(this).parent('li').hasClass("active")) {
          $(this).parent('li').children('ul').slideDown(defaults.slideDownTime);
          $(this).parent('li').addClass("active");
        } else {
          $(this).parent('li').children('ul').slideUp(defaults.slideUpTime);
          $(this).parent('li').removeClass("active");
        }
      });  
    };

    breakPointHendle();
    $(window).resize(breakPointHendle);

breakPointHendle() 在窗口调整大小上调用的事实导致了当窗口从小(在断点下方)调整大小时的不便较小(甚至更多低于断点),<i class="expander fa fa-angle-down"> 重复附加。所以我们得到了很多扩展器,而不仅仅是一个。

如何修改函数以避免这种情况?

谢谢!

2 个答案:

答案 0 :(得分:1)

基本上不建议在窗口调整大小事件的回调中进行dom操作。它会耗尽性能。但是,如果你想做同样的事情,那么我建议你使用下面的代码。

function breakPointHendle(){
      elm.find('li').each(function() {
        $(this).removeClass("parent"); //---moved the line here
        $(this).find('.expander').remove(); //---moved the line here 
        if($(window).width() <= defaults.breakPoint) {
          if ($(this).find('ul').length > 0) {
            $(this).addClass("parent");
            $(this).append('<i class="expander fa fa-angle-down"></i>');
          }
        } else {
          $(this).removeClass("active");
          $(this).find('ul').removeAttr("style"); 
          $(hamburger).removeClass("active"); 
        }
      });
     ....rest of the function definition.

答案 1 :(得分:0)

我会添加一个变量来跟踪它的状态,比如expandderstate,然后将其设置为0,1(false / true),如果它是否展开,并检查状态是否等于扩展状态在允许扩展代码运行之前。