问题
I've got this code but it's a bit repeating itself, is there a way to make it shorter?
jQuery(document).ready(function() {
var allTabs = jQuery('#front, #blog, #portfolio, #pages, #colors, #fonts');
allTabs.hide();
jQuery('#front-show').click(function() {
event.preventDefault();
allTabs.hide();
jQuery('#front').show();
});
jQuery('#blog-show').click(function() {
event.preventDefault();
allTabs.hide();
jQuery('#blog').show();
});
jQuery('#portfolio-show').click(function() {
event.preventDefault();
allTabs.hide();
jQuery('#portfolio').show();
});
jQuery('#pages-show').click(function() {
event.preventDefault();
allTabs.hide();
jQuery('#pages').show();
});
jQuery('#colors-show').click(function() {
event.preventDefault();
allTabs.hide();
jQuery('#colors').show();
});
jQuery('#fonts-show').click(function() {
event.preventDefault();
allTabs.hide();
jQuery('#fonts').show();
});
});
回答1:
allTabs.click(function() {
event.preventDefault();
allTabs.hide();
var id = jQuery(this).attr('id');
var el = jQuery('#'+id.substring(0,id.indexOf('-')));
el.show();
});
回答2:
You can utilize jQuery's multiple selector:
$("#fonts-show,#pages-show,#portfolio-show,#blog-show,etc...").click(function() {
event.preventDefault();
allTabs.hide();
$("#"+$(this).attr("id").split("-")[0]).show();
});
EDIT: Did not notice the different id between the selectors. Edited the show statement to correct for this.
回答3:
Since it looks like all of the ids match the same pattern, and you want to bind to the click
event for each element in allTabs
(plus -show on the end), you could iterate over your allTabs variable and bind that way:
jQuery(document).ready(function() {
var allTabs = jQuery('#front, #blog, #portfolio, #pages, #colors, #fonts');
allTabs.hide();
allTabs.each(function() {
var id = jQuery(this).attr('id');
var $target = jQuery(this);
jQuery("#" + id + "-show").click(function(event) {
event.preventDefault();
allTabs.hide();
$target.show();
});
});
});
回答4:
Give them a common class that you can use to select them, then utilize the first part of the ID to build a selector for the .show()
.
jQuery('.someClass').click(function( event ) {
event.preventDefault();
allTabs.hide();
jQuery('#' + this.id.split('-')[0] ).show(); // 'front-show' becomes '#front'
});
Update:
Assuming the one being shown is one of the allTabs
, I'd do this instead.
jQuery('.someClass').click(function( event ) {
event.preventDefault();
allTabs.hide().filter('#' + this.id.split('-')[0] ).show();
});
Avoids repeated DOM selection.
Also, instead of this:
'#' + this.id.split('-')[0]
...you could do this:
'#' + this.id.replace('-show','')
回答5:
jQuery(document).ready(function() {
var allTabs = jQuery('#front, #blog, #portfolio, #pages, #colors, #fonts');
allTabs.hide();
var ids = ['#front', '#blog', '#portfolio', '#pages', '#colors', '#fonts'];
for(var x in ids)
{
jQuery(ids[x] + '-show').click(function() {
event.preventDefault();
allTabs.hide();
jQuery(ids[x]).show();
});
}
});
回答6:
$('#fonts-show,#pages-show,#portfolio-show,#blog-show,etc...').click(function() {
event.preventDefault();
allTabs.hide();
var showId = $(this).attr('id');
var targetId = id.substring(0,id.indexOf('-'));
$('#'+targetId).show();
});
来源:https://stackoverflow.com/questions/4596799/jquery-code-to-simplify