2011-12-19 24 views
0

JqueryとtoggleClassを使用して、いくつかの基本的なボタンロールオーバー機能を作成しようとしています。私は自分のHTMLからDIVを複製し、それを複数回複製することによって要素のリストを構築しています(データベースからデータのリストを取り込む)。これを行うには、forループを使用しています。ここに現行のコードがあります。Forループ内のJQueryイベントリスナー

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

onmouseover属性を設定するのでjQueryのイベントリスナーを代わりに使用する方法はありますし、ONMOUSEOUT直接要素の?運で

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

は、私はこれを試してみました。表示するだけで、リストの最後の要素にロールオーバーエフェクトが実行されます。これは実際にjQueryを使用した最初の試みです。コード内でjQueryを使用する方法についての他の提案も参考になります。

EDIT:forループで言及されたarraylistから複数の子供を切り替えることもしたいと思います。どのように私はこれを設定するのですか?私はエラーを取得せずに配列をjqueryコマンドに渡すことができません。

+0

http://jsfiddle.net *上でこれを投稿できますか?*あなたは操作しているHTMLを使用していますか?私はあなたの作業例を見て、あなたが望むならそれを簡単なjQueryに変える方法を示します。 – JesseBuesking

+0

私はJesseBと一緒にいます - jQueryが '.on()'イベントバインディングユーティリティで何をしたいのか分かりますが、実際の答えを得るには十分な情報がありません。私はたくさんの仮定と推測を使用して、「実際のシナリオを知るためにはもっと良い」と言った。 '.on()'(jQuery 1.7+用)は、あなたが探しているものです。 –

答えて

1

後に次のコードあなたのforループを使用すると、すべてのクローンに適用する一度にすべてのマウスオーバーとマウスアウトハンドラを割り当てさせる必要があります。

$('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"); 
}) 

(あなたが1.7よりも古いのjQueryを使用している場合に.on()の代わりに.bind()を使用してください)。

上記の説明では、 "phoneDisplayContainer"で始まるIDを持つすべてのdivを検索し、イベントハンドラを割り当てています。ハンドラ内で、4番目の子孫divを見つけてクラスを切り替えます。

あなたはあなたのHTMLやCSSを表示しませんが、好きなだけあなたのCSSでこれを行うことができます。ホバーイベントをトラップするdivに共通のクラス( "parentDiv")を割り当て、その子div(隠すべきもの)に共通のクラス( "childDiv")を割り当てることができると仮定すると、これを行うことができます:それ以外の場合は

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

(もちろん、あなたの構造に合わせて、より意味のあるクラス名を付けることができます。)

、あなたはその後、後、あなたのループの適切なdiv要素にそれらのクラスを割り当てることができる場合は、再度、あなたがこれを行うことができますjQueryで:

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

基本的には最初に述べたのと同じですが、セレクタのクラスを使用しています。あなたがクラスベースのソリューションをあなたに押し付けているような気がするなら、それは私のためです。それは、このようなことをもっと簡単にする傾向があります。

+0

CSSソリューションの方がはるかに理にかなっています。はるかに複雑な解決策で問題を攻撃しようとするのはちょっとばかげているようだ。ありがとう。私のオリジナルの質問のために、あなたのコードはとても近いです。複数の子要素で隠れたクラスをどのように切り替えるのですか? – ryandlf

+0

これについて考えると、コンテナdiv内の子供に隠れたクラスの場所があるため、CSSのアプローチは機能しません。コンテナdivの上にカーソルを置くと、子クラスではなく、独自のクラスにのみ影響します。 – ryandlf

+0

CSSのアプローチは、コンテナーの上にマウスを置いたときに、含まれているdivの子を非表示にして表示するのに問題ありません。この簡単なデモを見てみましょう:http://jsfiddle.net/pYeJc/(JSがないことに気付くでしょう)。 CSS 'containerSelector:hover childSelector {}'は、現在ホバリングしているcontainerSelecdtorと一致する要素の子孫であるchildSelectorに一致する要素に設定を適用します。 (注:IEを使用している場合は、少なくともバージョン7以上が必要です。他のブラウザでも問題ありません)。 – nnnnnn