2011-12-19 5 views
0

Я пытаюсь создать некоторые базовые функции опрокидывания кнопок с помощью JQuery и toggleClass. Я создаю список элементов, клонируя DIV из своего HTML и повторяя его несколько раз (заполняя список данных из базы данных). Для этого я использую цикл for. Вот действующий код.JQuery Слушатели событий в Loop

  var displayNode = document.getElementById('phoneDisplayContainer');   
     for(var i=0; i<length; i++) { 
      //Clone the original container display. 
      var clonedDisplay = displayNode.cloneNode(true); 
      clonedDisplay.setAttribute('id', 'phoneDisplayContainer' + i); 
      //Remove hidden class from cloned Element. NOT CROSS BROWSER! 
      clonedDisplay.classList.remove('hidden'); 

      var children = clonedDisplay.getElementsByTagName('div'); 
      //Fill new nodes children containers with data. 
      children[1].innerHTML = contact.phone[i].type; 
      children[2].innerHTML = contact.phone[i].number; 
      children[3].setAttribute('onclick', 'PhoneUtility.edit(' + i + ');'); 
      children[3].setAttribute('id', 'phoneEditDisplay' + i); 
      children[4].setAttribute('onclick', 'PhoneUtility.remove(' + i + ');'); 

      //Hidden elements 
      var hidden = new Array(children[3], children[4]); 

      //Set rollover events. 
      clonedDisplay.setAttribute('onmouseover', '$("#' + children[3].id + '").toggleClass("hidden");'); 
      clonedDisplay.setAttribute('onmouseout', '$("#' + children[3].id + '").toggleClass("hidden");'); 

      //Append the new node to the display container 
      phoneContainer.appendChild(clonedDisplay); 
     } 
    } 

Есть ли способ использовать обработчик событий Jquery вместо того, чтобы установить OnMouseOver и onmouseout непосредственно на элементе?

Я попытался это:

$(clonedDisplay).mouseover(function() { 
    $(children[3]).toggleClass('hidden'); 
}); 

не повезло. Он просто отображает эффект опрокидывания последнего элемента в списке. Это на самом деле моя первая попытка использования jQuery, поэтому любые другие предложения о том, как я мог бы использовать jQuery внутри кода, тоже были бы полезны.

EDIT: Я также хотел бы переключить несколько детей из arraylist, упомянутых в цикле for. Как бы я это сделал? Я не могу передать массив команде jquery без ошибок.

+0

Не могли бы вы опубликовать это на http://jsfiddle.net * с помощью * html, с которым вы манипулируете? Я могу взглянуть на ваш рабочий пример и показать вам, как превратить его в какой-то короткий jQuery, если хотите. – JesseBuesking

+0

Я с JesseB - большинство из нас, кто знает jQuery, знают, что вы можете делать то, что хотите делать с утилитой привязки '.on()', но информации для получения реального ответа недостаточно. Я написал один, который использовал кучу предположений и догадок, а затем сказал: «Мех, лучше знать реальный сценарий». Достаточно сказать: '.on()' (для jQuery 1.7+) - это то, что вы ищете. –

ответ

1

Следующий код после ваш цикл должен позволить вам назначить все и наведении курсора мыши MouseOut обработчики на одном дыхании, чтобы применить ко всем клонам:

$('div[id^="phoneDisplayContainer"]').mouseover(function() { 
    $(this).find("div").eq(3).toggleClass("hidden"); 
}).mouseout(function() { 
    $(this).find("div").eq(3).toggleClass("hidden"); 
}); 

// or, given that both handlers do the same thing: 
$('div[id^="phoneDisplayContainer"]').on("mouseover mouseout", function() { 
    $(this).find("div").eq(3).toggleClass("hidden"); 
}) 

(Если вы используете JQuery старше 1.7 используйте .bind() вместо .on().)

Приведенное выше, чтобы найти все div с идентификатором, начинающимся с «phoneDisplayContainer», и назначить обработчики событий. Внутри обработчика найдите четвертый дочерний div и переключите класс.

Вы не показываете свой HTML или CSS, но можете сделать это в своем CSS, если хотите. Предполагая, что вы можете назначить общий класс («parentDiv») для разделов, для которых вы хотите захватить событие наведения, и общий класс («childDiv») для своего дочернего div (тот, который должен быть скрыт), вы можете сделать это :

.parentDiv .childDiv { visibility: hidden; } 
.parentDiv:hover .childDiv { visibility: visible; } 

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

в противном случае, опять-таки, если вы можете назначить эти классы соответствующих див затем после вашего цикла вы можете сделать это с jQuery:

$(".parentDiv").on("mouseover mouseout", function() { 
    $(this).find(".childDiv").toggleClass('hidden'); 
}); 

В основном то же, что и я сказал, но используя классы для селекторов. Если вы чувствуете, что я нажимаю на вас решение на основе классов, это потому, что я: он имеет тенденцию делать это намного проще.

+0

Решение CSS имеет гораздо больший смысл. Я чувствую себя немного глупо, пытаясь атаковать проблему с гораздо более сложным решением. Благодарю. Однако, ради моего первоначального вопроса, ваш код настолько близок.Как бы я переключил скрытый класс на несколько дочерних элементов? – ryandlf

+0

Думая об этом, подход css не работает, потому что у меня есть скрытые классы для детей в контейнере div. Наведение курсора над контейнером div может повлиять только на его собственный класс, а не на его детей. – ryandlf

+0

Подход CSS отлично подходит для скрытия и отображения дочерних элементов содержащего div при наведении курсора на контейнер. Взгляните на эту простую демонстрацию: http://jsfiddle.net/pYeJc/ (вы заметите, что нет JS). CSS 'containerSelector: hover childSelector {}' применяет параметры к любому элементу, соответствующему элементу childSelector, который является потомком элемента, соответствующего контейнеруSelecdtor, который вы сейчас висите. (Примечание: если вы используете IE, вам нужна хотя бы версия 7. Другие браузеры должны быть в порядке.) – nnnnnn

Смежные вопросы