2016-01-13 6 views
0

Чтобы сделать мою функцию более динамичной, я хочу изменить элементы, на которые она нацелена, на основе того, какой родительский div пользователь нажимает.Динамическое изменение целевых элементов при нажатии

Итак, это предназначено для первого раздела портфеля, но будет три, и я пытаюсь использовать одну и ту же функцию для каждого.

Вот что я начал с-

HTML

<div class="portfolio-one"> 

    <h1 class="portfolio-one__overlay">heading</h1> 

    <div class="portfolio-one__content"> 
    <button class="icon-times "></button> 
    <h1 class="portfolio__heading">heading</h1> 
    <p class="portfolio__description">Lorem</p> 
</div> 
</div> 

JQuery

function showContent(){ 
    $('.portfolio-one').on('click', function(event) { 
     $('.portfolio-one__content').animate({ 
      left: "5", 
      height: "100%" 
     }, 700, "linear"); 
     $('.portfolio-one__content').show(); 
     $('.portfolio-one__content button').show(); 
     $('.portfolio-one__overlay').hide(); 
    }); 
}; 

И то, что я хотел бы закончить с-

var target = ??; 
var content = ??; 
var button = ??; 
var overlay = ??; 

function showContent(){ 
    $('target').on('click', function() { 
     $('content').animate({ 
      left: "5", 
      height: "100%" 
     }, 700, "linear"); 
     $('content').show(); 
     $('button').show(); 
     $('overlay').hide(); 
    }); 
}; 

Я собирался использовать другую функцию чтобы заполнить переменные, но это похоже на повторное создание функции три раза. Любая помощь ценится!

+2

Не могли бы вы объяснить, чего вы пытаетесь достичь. Похоже, вы слишком усложняете относительно простую проблему. Кроме того, может помочь ваш HTML-код. –

+0

Ну, например, вы бы не делали '$ ('target')', вы хотите '$ (target)'. Вы сделали 'target' переменной, поэтому вам нужно ссылаться на нее как на одну, а не на строку. Ваши бит '??' будет зависеть от вас, в зависимости от того, что вы хотите сделать (мы не можем сказать) – Draco18s

+0

@RoryMcCrossan Я пытаюсь заполнить переменные для анимации, отображения и скрытия, основываясь на том, какой портфолио щелкнул. Итак, если щелкнуть первый портфель, функция нацеливается на его классы. Если щелкнуть второй, он делает то же самое и так далее. – mieradi

ответ

2

Чтобы сделать это буквально в моде вы хотите сделать это, используйте .attr('class'), чтобы получить имя вашего класса в виде строки, и использование конкатенации на нем:

function showContent(){ 
$('.portfolio-one').on('click', function(event) { 
    var className = $(this).attr('class'); 
    $('.' + className + '__content').animate({ 
    left: "5", 
    height: "100%"}, 700, "linear"); 
     $('.' + className + '__content').show(); 
     $('.' + className + '__content button').show(); 
     $('.' + className + '__overlay').hide(); 
    }); 
}; 

Bravo для достижения более чистого кода, но есть даже более чистые пути! Рассмотрите возможность организации вашего HTML таким образом, чтобы содержимое, кнопка и наложение являлись элементами-потомками (, например,) элемента, который классифицирован .portfolio-xyz. Потому что тогда вы можете использовать селекторы потомков, чтобы сделать ваши ставки:

function showContent(){ 
$('.portfolio-any').on('click', function(event) { 
    $(this).find('.portfolio-content').animate({ 
    left: "5", 
    height: "100%"}, 700, "linear"); 
     $(this).find('.portfolio-content').show(); 
     $(this).find('.portfolio-button').show(); 
     $(this).find('.portfolio-overlay').hide(); 
    }); 
}; 

Чтобы сделать выше, вы бы дать всем портфели общий класс, как .portfolio-any, и то же самое с содержанием, кнопок и накладками.

+0

Это замечательно. И очень похожий метод, чем я пытался. Поразмыслить над тем, как сделать его еще более чистым? Это все, к чему я стремлюсь! – mieradi

+0

Я вывел свои высказывания из строя; изм. Последний пример, который я дал, - это типичный способ сделать что-то. Удачи! –

+0

Awesome.Очень признателен! – mieradi