2011-01-04 3 views
1

У меня есть этот код, но он немного повторяется, есть ли способ сделать его короче?Код jQuery для упрощения

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(); 
    }); 
}); 
+0

Пожалуйста, укажите HTML код, чтобы мы могли видеть отношения между элементами (т.е. #front и # передний шоу) – js1568

ответ

1
allTabs.click(function() { 
    event.preventDefault(); 
    allTabs.hide(); 
    var id = jQuery(this).attr('id'); 
    var el = jQuery('#'+id.substring(0,id.indexOf('-'))); 
    el.show(); 
}); 
+0

Он хочет привязать событие click для вариантов -show, а не записей в allTabs. –

+0

Почему это было принято? Он не дублирует исходные функции вашего кода. Он привязывается к обычной форме id ('#blog, #photos и т. Д.) Вместо опции -show, а затем скрывает все вкладки и показывает самих себя. –

7

Вы можете использовать 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: не заметил другого идентификатора между селекторами. Отредактировал оператор show, чтобы исправить это.

+0

Что именно $ (это) .show(); делает? Каждая ссылка в моем случае по-разному называется div ... – anonymous

+2

Закрыть, но '$ (this) .show()' необходимо заменить, так как он будет применяться к неправильному идентификатору (например, нажав на '# fonts-show' должен вызывать '$ ('# fonts'). show()' not '$ ('# fonts-show'). show()') –

+0

Это не дублирует поведение исходного кода OP. – user113716

2

Дайте им общий класс, который вы можете использовать для их выбора, затем используйте первую часть идентификатора, чтобы построить селектор для .show().

jQuery('.someClass').click(function(event) { 
    event.preventDefault(); 
    allTabs.hide(); 
    jQuery('#' + this.id.split('-')[0]).show(); // 'front-show' becomes '#front' 
}); 

Update:

Предполагая, что один показывается один из allTabs, я бы сделал это вместо этого.

jQuery('.someClass').click(function(event) { 
    event.preventDefault(); 
    allTabs.hide().filter('#' + this.id.split('-')[0]).show(); 
}); 

Избегает повторного выбора DOM.

Кроме того, вместо этого:

'#' + this.id.split('-')[0] 

... Вы можете сделать это:

'#' + this.id.replace('-show','') 
+0

Или, используйте это генерирование id вместе с множественным селектором by @RockyMadden – Phrogz

+0

Им не нужен общий класс. Они уже собраны в allTabs – js1568

+0

@ js1568: те, кто получает 'show/hide', отличаются от тех, кто получает' click'. – user113716

0
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(); 
    }); 
} 

});

+1

Это не сработает, так как значение 'x' будет последним значением' x' для всех обработчиков обратного вызова. Вы должны использовать закрытие, чтобы сделать это правильно, см. Мой ответ. –

2

Так это выглядит, как все идентификаторы совпадают по той же схеме, и вы хотите привязать к click событию для каждого элемента в allTabs (плюс -show на конце), вы можете перебрать вашу allTabs переменной и связать, что путь:

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(); 
     }); 
    }); 
}); 
+0

Вы дублируете закрытие. Поскольку вы используете 'jQuery.each()', вы будете «закрывать» 'i' и' ele', когда вы назначаете обработчик. – user113716

+0

@patrick: Ах, хорошая точка. Обновлен мой ответ, чтобы удалить внутреннее закрытие. –

+0

Если вы не возражаете, чтобы я сделал пару других моментов, это не сработает, чтобы выполнить 'ele.attr ('id')', поскольку 'ele' будет элементом DOM. И вы пропускаете объект 'event' в списке формальных параметров обработчика, но все остальные тоже, за исключением одного парня. ; o) – user113716

0
$('#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(); 
}); 
Смежные вопросы