2012-12-23 29 views
1

我写了下面的插件 - 它运行完美。它完全符合我希望它在所有情况下都能做到的 - 但它有点慢。我想我可能会推迟到一个更聪明的社区,看看有没有人看到我可能大幅提高其表现的方式。寻求帮助优化一个小的jQuery插件

基本上说,它需要一个结构化的ul,并使定型下拉/抽屉功能。我还发布了它期望的HTML代码片段。

警告 - 我包含了大量的HTML,因为我想演示它使用了多少项 - 这可能会告诉您为什么它很慢。

我相当肯定,放缓仅仅是因为我告诉它处理的项目数量很可笑。但是因为我希望它在任何点击时折叠所有其他菜单,所以我必须将它们全部附加 - 对吗?

我会重复 - 你在这里看到的行为是完全正确的。我还包括一个jsFiddle,所以你可以看到它的行动。

jsFiddle Link (Working)

jQuery的接线(文件负载)

$(document).ready(function() { 
    $(".dropdown > a").addClass("root"); 

    var $sidebar_dropdown = $('li[data-role="sidebar-dropdown"]'); 
    var $submenu_dropdown = $('li[data-role="sidebar-sub-dropdown"]'); 
    var $remote_menus = $('a.remote'); 

    $sidebar_dropdown.drawer({ 
     openClass: 'sidebar-dropdown-open' 
    }); 
    $submenu_dropdown.drawer({ 
     openClass: 'sidebar-sub-dropdown-open' 
    }); 

}); 

实际插件(Java脚本)

(function ($) { 
    $.fn.drawer = function (options) { 
     // Create some defaults, extending them with any options that were provided 
     var settings = $.extend({ 
      openClass: 'open', 
      openClassName: function() { return '.' + this.openClass; } 
     }, options); 

     var open = function (e) { 
      // mark this menu as open 
      $(e).addClass(settings.openClass); 

      // retrieve the appropriate menu item 
      var $menu = $(e).children(".dropdown-menu, .sidebar-dropdown-menu"); 

      // slide down the one clicked on. 
      $menu.slideDown(100); 
      $menu.addClass('active'); 
     }; 

     var close = function (e) { 
      $(e).removeClass(settings.openClass); 
      // retrieve the appropriate menu item 
      var $menu = $(e).children(".dropdown-menu, .sidebar-dropdown-menu"); 
      // slide down the one clicked on. 
      $menu.slideUp('fast'); 
      $menu.removeClass('active'); 
     }; 

     return this.each(function() { 
      $(this).on('click', function (e) { 
       // transform the selector into a 'className' 
       var $className = $('.' + settings.openClass); 
       var $node = $(this); // the current node 
       var $target = $(e.target); // the actual DOM target 
       // examine all existing dropdown menus that are 
       // currently open, and close them - excluding the 
       // current one. 
       $className.not($(this)).each(function() { 
        close($(this)); 
       }); 

       if ($target.hasClass("root") && $node.hasClass(settings.openClass)) { 
        close($(this)); 
       } 
       else { 
        // open the selected dropdown menu 
        open($(this)); 
       } 

       // prevent default event propogation 
       e.preventDefault(); 
       e.stopPropagation(); 
      }).on("mouseleave", function() { 
       $(this).children(".dropdown-menu").hide().delay(300); 
      }); 

     }) 
    }; 

})(jQuery); 

HTML
<div class="page-sidebar"> 
<ul> 
    <li class="dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li><a class="remote" href="#">Test Menu Item</a></li> 
      <li><a class="remote" href="#">Test Menu Item</a></li> 
      <li><a class="remote" href="#">Test Menu Item</a></li> 
     </ul> 
    </li> 
    <li class="dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
     </ul> 
    </li> 
    <li class=" dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
     </ul> 
    </li> 
    <li class=" dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
     </ul> 
    </li> 
    <li class=" dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
     </ul> 
    </li> 
    <li class=" dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
     </ul> 
    </li> 
    <li class=" dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
     </ul> 
    </li> 

    <li class=" dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
     </ul> 
    </li> 
    <li class=" dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
     </ul> 
    </li> 
    <li class=" dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
     </ul> 
    </li> 
    <li class=" dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
     </ul> 
    </li> 
    <li class=" dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
     </ul> 
    </li> 
    <li class=" dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
     </ul> 
    </li> 
    <li class=" dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
      <li><a href="#" class="remote">Test Menu Item</a></li> 
     </ul> 
    </li> 
    <li class=" dropdown" data-role="sidebar-dropdown"> 
     <a href="#" class="remote">Test Menu Item</a> 
     <ul class="sub-menu light sidebar-dropdown-menu"> 
      <li class="dropdown" data-role="sidebar-sub-dropdown"> 
       <a href="#" class="remote">Test Menu Item</a> 
       <ul class="sub-menu light sidebar-dropdown-menu"> 
        <li><a href="#" class="remote"> 
          Test Menu Item, 
          <br /> 
          <small>Test Menu Item Small</small> 
         </a> 
        </li> 
        <li><a href="#" class="remote"> 
          Test Menu Item, 
          <br /> 
          <small>Test Menu Item Small</small> 
         </a> 
        </li> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
       </ul> 
      </li> 
      <li class="dropdown" data-role="sidebar-sub-dropdown"> 
       <a href="#" class="remote">Test Menu Item</a> 
       <ul class="sub-menu light sidebar-dropdown-menu"> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
       </ul> 
      </li> 
      <li class="dropdown" data-role="sidebar-sub-dropdown"> 
       <a href="#" class="remote">Test Menu Item</a> 
       <ul class="sub-menu light sidebar-dropdown-menu"> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
       </ul> 
      </li> 
      <li class="dropdown" data-role="sidebar-sub-dropdown"> 
       <a href="#" class="remote">Test Menu Item</a> 
       <ul class="sub-menu light sidebar-dropdown-menu"> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
       </ul> 
      </li> 
      <li class="dropdown" data-role="sidebar-sub-dropdown"> 
       <a href="#" class="remote">Test Menu Item</a> 
       <ul class="sub-menu light sidebar-dropdown-menu"> 
        <li><a href="#" class="remote">Test Menu Item</a></li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
</ul> 
</div>​ 

CSS

.page-sidebar { 
    display: block; 
    width: 213px; 
    float: left; 
    min-height: 100% !important; 
    height: auto; 
    background-color: #EBEBEB; 
    padding-top: 10px; 
    padding-bottom: 10px; 
    margin-top: 10px; 
    margin-left: 7px; 
} 
.page-sidebar ul.sub-menu.light { 
    background-color: #F9F9F9 !important; 
} 
.page-sidebar ul.sub-menu { 
    padding-top: 5px; 
    padding-bottom: 5px; 
} 
.page-sidebar .sidebar-dropdown-menu { 
    display: none; 
} 
.page-sidebar ul { 
    margin-left: 0; 
    list-style: none; 
    background-color: #EBEBEB; 
} 
.page-sidebar > ul > li > a { 
    font-size: 1.1em; 
} 
.page-sidebar > ul > li.dropdown { 
    position: relative; 
} 
.page-sidebar li { 
    display: list-item; 
    line-height: 20px; 
    position: relative; 
} 
.dropdown, .dropdown > a { 
    font-weight: 600 !important; 
} 
ul li, ol li { 
    display: list-item; 
    font-size: 14px; 
    line-height: 20px; 
} 
.dropdown, .dropdown > a { 
    font-weight: 600 !important; 
} 
.page-sidebar a { 
    font-family: 'Almendra', 'Segoe UI', 'Open Sans', Verdana, Arial, Helvetica, sans-serif; 
    font-weight: 400; 
    font-size: 11pt; 
    letter-spacing: 0.01em; 
    line-height: 14pt; 
    color: black; 
    display: block; 
    width: 100%; 
    padding: 5px 20px 5px 10px; 
    white-space: nowrap; 
    font-size: 14px; 
    cursor: pointer; 
} 
a, .link { 
    font-family: 'Almendra', 'Segoe UI', 'Open Sans', Verdana, Arial, Helvetica, sans-serif; 
    font-weight: 400; 
    font-size: 11pt; 
    color: #2E92CF; 
    text-decoration: none; 
} 
.page-sidebar > ul > li.dropdown::after { 
    content: ""; 
    display: block; 
    position: absolute; 
    top: 6px; 
    left: 100%; 
    margin-left: -20px; 
    width: 16px; 
    height: 16px; 
    background: no-repeat; 
    background-position: 0 -1586px; 
    z-index: 200; 
} 

+0

小提琴似乎相当快。生产速度慢吗? –

+0

是的,是的。也许我的机器很麻烦。这是我第一个jQuery插件,所以我想我只是做了很多错误,并会问更聪明的社区(你们)。也许我确实做对了... – Ciel

+0

我的意思是,从我所能看到的看起来很好。很显然,每个人都有自己的设计风格,所以也许它的结构可能会有所不同。但就速度而言,我没有看到任何令人震惊的事情。通常会减慢动画速度的是同时运行很多间隔或超时,或者一次只操作一个dom,而不是一次处理所有dom。这似乎并没有表现出这些特点。 –

回答

0

我试着去了解情况。 我正在浏览你的插件,它看起来不错。 究竟是什么慢? 手风琴的效果很慢?