2012-04-09 7 views
0

現在のボタンに関連付けられている遠い要素をどのようにトリガーできますか?例えば現在のボタンに関連付けられている離れた要素をトリガーする方法はありますか?

私はボタンmenu-1で1を置くと、

HTML

<ul class="menu-1"> 
    <li><a href="#">button 1</a></li> 
    <li><a href="#">button 2</a></li> 
    <li><a href="#">button 2</a></li> 
</ul> 

<ul class="menu-2"> 
    <li><a href="#">button 1</a></li> 
    <li><a href="#">button 2</a></li> 
    <li><a href="#">button 2</a></li> 
</ul> 

だから、ボタンmenu-2で1も推移する必要があります。

そして、私はボタンmenu-2で1を置くときに、ボタンmenu-1で1があまりにも推移する必要があります。

私の作業jqueryの、

$(".menu-1 li").hover(function() { 

     var text = $(this).text(); 

     if ($('.menu-2 li a:contains("'+text+'")').length > 0) { 
      $('.menu-2 li a:contains("'+text+'")').trigger("mouseenter"); 
     } 
    }); 

jsfiddle、

http://jsfiddle.net/JDG7U/

+0

あなたは 'id'、' class'または 'データ-X '要素間の関係を識別するための属性のいずれかを使用することができます方法はありませんか?テキストコンテンツによるマッチングは、かなり遅くて醜いです。また、メニュー1に 'button 1'、メニュー2に' button 11'があればどうなりますか? –

+0

はい、それは一致する必要はありません。より良い提案や解決策はありますか?歓迎された。ありがとう。 – laukok

答えて

2

私が使用したアプローチは、.hoverクラスを使用して:hoverを交換することですそのクラスにCSS変更を割り当てます。次に、それぞれlidata-という属性を追加し、それをフィルタリングしました。 (クラスを使用すると、問題が発生しました。なぜなら、私はhoverクラスも取得せずに任意のクラス属性を読み取ることができなかったからです)。

少し複雑ですが、かなり簡単でシンプルなコードを残しました。要素が必要な場合は要素。

HTML:

<ul class="menu-1"> 
    <li data-num="1"><a href="#">button 1</a></li> 
    <li data-num="2"><a href="#">button 2</a></li> 
    <li data-num="3"><a href="#">button 3</a></li> 
</ul> 

<ul class="menu-2"> 
    <li data-num="2"><a href="#">button 2</a></li> 
    <li data-num="3"><a href="#">button 3</a></li> 
    <li data-num="1"><a href="#">button 1</a></li> 
</ul>​ 

JS:

$('ul li').hover(function() { 
    var num = $(this).data('num'); 
    $('li').filter(function() { 
     return $(this).data('num') === num; 
    }).toggleClass('hover'); 
});​ 

CSS::nth-childを使用して

ul li.hover a { 
    color: green; 
}​ 

http://jsfiddle.net/he7Uk/2/

+0

答えに感謝、mblase。そのシンプルさを愛していました!私は 'data-num =" x "'をli要素に追加することで、これが有効なhtmlかどうか疑問に思いますか? – laukok

+2

@lauthiamkokはい、有効なHTML5属性です.HTML4でもタグに新しい属性を追加できます(認識されない場合は無視されます)。 jQueryは '.data()'メソッドで使用するすべての 'data-'属性を自動的にインポートします。これにより、DOM要素自体に任意のデータを格納する便利な方法になります。 – Blazemonger

+0

'は有効なHTML5属性です.HTML4でもタグに新しい属性を追加できます(認識されない場合は無視されます)。本当にありがとう! – laukok

0

は両方とも同じ.class

+1

具体的なコード例で説明してください。私はあなたが思っているように簡単にはうまくいかないと思う。 – Blazemonger

1

は、私の知る限りでは、あなたが本当に好きな疑似クラスをトリガすることはできませんそれらを与えます:その方法でホバーしますが、JSをmouseenter/mouseleaveイベントでクラスを使用するかスタイルを設定するか、直接CSSを変更することができますLY、のようなもの:両方の方法を作業

$(".menu-1 li").on({ 
    mouseenter: function() { 
     var index = $(this).index(); 
     $('.menu-2 li a').eq(index).css('color', 'green'); 
    }, 
    mouseleave: function() { 
     var index = $(this).index(); 
     $('.menu-2 li a').eq(index).css('color', 'black'); 
    } 
});​ 

FIDDLE

やクラスで、:

$(".menu-1 li, .menu-2 li").on({ 
    mouseenter: function() { 
     var index = $(this).index(), 
      elems = $('.menu-1 li a:eq('+index+'), .menu-2 li a:eq('+index+')'); 
     $(elems).addClass('hover'); 
    }, 
    mouseleave: function() { 
     var index = $(this).index(), 
      elems = $('.menu-1 li a:eq('+index+'), .menu-2 li a:eq('+index+')'); 
     $(elems).removeClass('hover'); 
    } 
});​ 

FIDDLE

+0

良い答えですが、私は各リストの要素が常に同じ順序であるという前提を嫌います。 – Blazemonger

+0

@ mblase75 - はい、正しい順序でなければなりません。そうでなければ、あなたのデータ属性などのような何らかの識別子が必要です。最後は非常に効率的ではありません。 HTMLマークアップを変更せずにコンテンツを使用しないと考えることができる唯一の方法は、代わりにインデックスを使用することでした。 – adeneo

1

そして1つの以上の変異体:

$lis = $('.menu li'); 
$lis.hover(function() { 
    var index = $(this).index() + 1; 
    $lis.filter(':nth-child(' + index + ')').addClass('hovered'); 
}, function() { 
    $lis.removeClass('hovered'); 
});​ 

デモ:http://jsfiddle.net/JDG7U/5/

+0

この回答に感謝、dfsq! – laukok

関連する問題