简体   繁体   English

重构jQuery重复模式

[英]Refactoring jQuery repeating pattern

I have painted my self into a corner in order to quickly prototype. 为了快速制作原型,我已经将自己描绘在一个角落。 What's the best way to refactor the following jQuery code? 重构以下jQuery代码的最佳方法是什么? Its functionality is to toggle between some sidebar navigation items. 它的功能是在一些侧边栏导航项目之间切换。 I need it to be more dynamic in order to be scalable. 我需要使其更具动态性以便可扩展。

Would you add the IDs inside the if statements, in an array and iterate through them? 您是否会在数组中的if语句中添加ID并对其进行遍历? Use variables? 使用变量? Create a function and call it on the html side onClick? 创建一个函数并在html端onClick上调用它? No matter what I think of, it stills leads to a bunch of repeating code. 不管我怎么想,它仍然会导致一堆重复的代码。

Thank you! 谢谢!

 // TOGGLING LEFT NAVIGATION $('#settingsClick').click(function() { if( $('#addContainer, #noteContainer, #logoContainer, #themeContainer').is(':visible') ) { $('#addContainer').slideUp(350); $('#noteContainer').slideUp(350); $('#logoContainer').slideUp(350); $('#settingsContainer').slideDown(350); $('#themeContainer').slideUp(350); } else { $('#settingsContainer').slideToggle(350); } }); $('#addClick').click(function() { if( $('#settingsContainer, #noteContainer, #logoContainer, #themeContainer').is(':visible') ) { $('#settingsContainer').slideUp(350); $('#noteContainer').slideUp(350); $('#logoContainer').slideUp(350); $('#addContainer').slideDown(350); $('#themeContainer').slideUp(350); } else { $('#addContainer').slideToggle(350); } }); $('#noteClick').click(function() { if( $('#settingsContainer, #addContainer, #logoContainer, #themeContainer').is(':visible') ) { $('#settingsContainer').slideUp(350); $('#addContainer').slideUp(350); $('#logoContainer').slideUp(350); $('#noteContainer').slideDown(350); $('#themeContainer').slideUp(350); } else { $('#noteContainer').slideToggle(350); } }); $('#logoClick').click(function() { if( $('#settingsContainer, #addContainer, #noteContainer, #themeContainer').is(':visible') ) { $('#settingsContainer').slideUp(350); $('#addContainer').slideUp(350); $('#noteContainer').slideUp(350); $('#logoContainer').slideDown(350); $('#themeContainer').slideUp(350); } else { $('#logoContainer').slideToggle(350); } }); $('#themeClick').click(function() { if( $('#settingsContainer, #addContainer, #noteContainer, #logoContainer').is(':visible') ) { $('#settingsContainer').slideUp(350); $('#addContainer').slideUp(350); $('#noteContainer').slideUp(350); $('#logoContainer').slideUp(350); $('#themeContainer').slideDown(350); } else { $('#themeContainer').slideToggle(350); } }); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <a id="settingsClick">Click Me</a><br> <div id="settingsContainer">Content...</div> <br><br> <a id="addClick">Click Me</a><br> <div id="addContainer">Content...</div> <br><br> <p> Etc... Etc....</p> 

You should group using the common CSS class, ie header and content . 您应该使用通用的CSS类(即headercontent分组。 Using the established relationship you can target the others content holder and content associated with the current clicked header element. 使用已建立的关系,您可以定位其他内容所有者和与当前单击的标题元素关联的内容。

 $('.container .header').on('click', function() { //Get the current element var $this = $(this); //find the content var $content = $this.closest('.container').find('.content'); //$this.next() //get all contents var content = $('.container .content'); //Slide up others content.not($content).slideUp(350); //Slide down $content.slideToggle(350); }); 
 .content { display: none } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="container"> <div class="header" id="settingsClick">Click Me</div> <div class="content" id="settingsContainer">Content...</div> </div> <div class="container"> <div class="header" id="addClick">Click Me</div> <div class="content" id="addContainer">Content...</div> </div> <div class="container"> <div class="header" id="noteClick">Click Me</div> <div class="content" id="noteContainer">Content...</div> </div> 

the best bet would be to do it like so 最好的选择就是这样做

 $(document).on('click', ".trigger", function() { var sibling_content = $(this).siblings(".content"); if (!sibling_content.hasClass('active')) { $(".content").slideUp('slow').removeClass('active'); sibling_content.slideDown('slow').addClass('active'); } else { sibling_content.slideUp('slow').removeClass('active'); } }) 
 .trigger { background-color: red; color: white; font-size: 16px; } .content { background-color: blue; color: white; font-size: 16px; padding: 20px 0; display: none; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="container"> <div class="trigger">trigger</div> <div class="content">content</div> </div> <div class="container"> <div class="trigger">trigger</div> <div class="content">content</div> </div> <div class="container"> <div class="trigger">trigger</div> <div class="content">content</div> </div> <div class="container"> <div class="trigger">trigger</div> <div class="content">content</div> </div> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM