2010-11-10 2 views
3

вот мой код:несколько функций в document.ready функции

$(document).ready(function() { 

    $('.flip1').click(function() { 
     $('.panel1').slideToggle("slow"); 
    }); 
    $('.flip2').click(function() { 
     $('.panel2').slideToggle("slow"); 
    }); 
    $('.flip3').click(function() { 
     $('.panel3').slideToggle("slow"); 
    }); 
    $('.flip4').click(function() { 
     $('.panel4').slideToggle("slow"); 
    }); 
}); 

Я хочу, чтобы сделать петлю с .flip в качестве переменной (flipVar) и .panel как (panelVar)

+0

Позвольте мне добавить, что количество элементов неизвестно, а диапазон не обязательно связан с flip1-flip4. – asunrey

ответ

3

Даже если вы хотите запустить селектор в цикле, я бы не сделал этого так, потому что вы делаете несколько вариантов DOM. Вы можете сделать это с выбором один DOM:

$(document).ready(function() { 
    $('div[class^=flip]').each(function (idx) { 
     $(this).click(function() { 
      $('.panel' + (idx + 1)).slideToggle("slow"); 
     }); 
    }); 
}); 

Это будет работать при условии, что flip элементы появляются на странице в их числовом порядке.

Это использует the attribute starts with selector, чтобы получить все <div> элементов, имеющих название класса, начиная с "flip". Измените имя тега, если оно другое, или удалите его, если у них не все те же теги.

Он использует index, который может предоставить вам .each(), чтобы переключить правильный .panel.

+2

не только это лучший способ, но в зависимости от HTML это можно было бы упростить, выполнив что-то вроде '$ (this) .find ('div [class^= panel]'). slideToggle ('slow')', и вам даже не понадобится индекс :) ​​ – Jason

+0

@Jason: +1 Хорошая точка зрения. Очень вероятно, что какой-то способ обхода может быть использован внутри обработчика вместо выбора DOM. – user113716

4

Ну, если это была моя страница, я бы удостоверился, что все эти элементы разделяют класс, чтобы я не хотел, чтобы нуждался в. Тем не менее, вы можете сделать это:

переменная
for (var i = 1; i <= 4; ++i) $('.flip' + i).click((function(i) { 
    return function() { $('.panel' + i).slideToggle('slow'); }; 
})(i)); 

петля должна быть в ловушке закрытия, так что каждый «щелчок» обработчик ссылается на соответствующее значение. Опять же, я действительно не сделал бы этого так. Я бы добавил, что элементы «flip» совместно используют класс, а затем сохраняют этот индекс (неявная ссылка на соответствующую «панель») в отдельном элементе класса или в атрибуте «data-». Тогда обработчик мог бы найти панель, используя это значение.

редактировать — как хак, вы могли бы использовать тот факт, что имена классов соответствующих элементов являются оба вида «somethingNN», где «NN» является цифровой частью. Вы можете сдирать номер, а затем добавить его в «панель»:

for (var i = 1; i <= 4; ++i) $('.flip' + i).click(function() { 
    var panelClass = this.className.replace(/.*\bflip(\d+).*/, "panel$1"); 
    $(panelClass).slideToggle('slow'); 
}); 
+0

Мне нужно искать классы в javascript. Будет ли создание класса для неизвестного количества элементов? Меню и подменю создаются из базы данных и могут быть любого размера в зависимости от того, что вводит пользователь. – asunrey

+0

Нет, класс будет на элементах, так же как «flip1» уже находится в классе элементов. – Pointy

+0

Хорошая точка, предоставляющая все элементы одного класса (флип), безусловно, сэкономит много обработки и обхода, если у вас есть много элементов, которые нужно переключать на странице ... или, если вообще необходимо, попробуйте дать этим элементам идентификатор вместо класса - гораздо быстрее искать идентификатор, чем класс элемента для jQuery –

1
$(document).ready(function() { 

    for (var i=1; i<=4; i++) { 
     (function(i) { 
      $('.flip'+i).click(function() { 
      $('.panel'+i).slideToggle("slow"); 
      }); 
     })(i); 
    } 

}); 
+0

Так что я использовал это как быструю «повязку» для своей проблемы, пока не выясню классы javascript. Это сработало. У меня был счет, отслеживающий мои элементы и заменивший 4 на этот счет. Благодаря! – asunrey

0

попробовать это:

$(function(){ 
    for(var i=1;i<5;i++){ 
     $('.flip'+i).click(function() { 
      $('.panel'+i).slideToggle("slow"); 
     }); 
    } 
}); 

PS: - не использовать это не будет работать, как указывалось by @patrick

+0

Это не сработает, потому что значение ссылок 'i' внутри обработчика' click' всегда будет отражать последнее обновление. Вероятно, '5' в этом случае. – user113716

+0

О, спасибо за указание @patrick.Я не проверял это. Я пропустил «.click» полностью. :(глупый я! – TheVillageIdiot

+0

Вы были близки, хотя. Просто нужно было закрыть, чтобы сохранить значение 'i' для' $ ('. panel' + i) '. – user113716