2016-07-12 4 views
-1

は私が 凝縮同じ機能

$('.project-1 img').hover(function() { 
     $('#id1').slideToggle(); 
    }); 
    $('.project-2 img').hover(function() { 
     $('#id2').slideToggle(); 
    }); 
    ... 
    $('.project-7 img').hover(function() { 
     $('#id7').slideToggle(); 
    }); 

が、私はこのコードの以下のビットを試してみました...(1〜7番)関数のこのjQueryのセットを凝縮支援するためのJavaScriptのビットを書き込もうとしますが、それだけしています私はクリーンなものにコードを凝縮するにはどうすればよいのターゲット slideToggle#id7 ...

for (i = 1; i <= 7; i++) { 
     var projectNum = '.project-' + i + ' img'; 
     var idNum = '#id' + i; 
     $(projectNum).hover(function() { 
     $(idNum).slideToggle(); 
     }); 
    }; 

?ありがとう!

+0

は、コードレビューへの投稿を検討? – Neal

+0

ああ...古いループ・アンド・ザ・クロージャの問題。 –

+0

これは、コードレビューでは問題ありません。a)コードが機能しています。b)コードが仮説​​でもなく不完全でもない場合。 – Quill

答えて

0

上記のコメントは正しく問題を診断しました。ループが働くだろうが

for (i = 1; i <= 7; i++) { 
    (function (i) { 
    $('.project-' + i + ' img').hover(function() { 
     $('#id' + i).slideToggle(); 
    }); 
    })(i); 
}; 
+0

魅力的な作品です! –

4

(あなたは閉鎖問題を修正する場合)より良い解決策ではなく、すべてのimg要素と回避のために働くだろう単一のイベントハンドラをアタッチするためにDRY原則を使用することです:ここで修正がありますすべてのループやクロージャの必要性これを試してみてください:

<div class="project"> 
    <img src="foo.jpg" data-target="#id1" /> 
</div> 
<div class="project"> 
    <img src="bar.jpg" data-target="#id2" /> 
</div> 
<!-- and so on... --> 

<div id="id1">Lorem</div> 
<div id="id2">Ipsum</div> 
<!-- and so on... --> 
$('.project img').hover(function() { 
    var target = $(this).data('target'); 
    $(target).slideToggle(); 
}); 
+0

ニース。準最適な試みにパッチを当てるよりも、究極の問題に取り組むほうがはるかに優れています。 –

+0

ニート!私はこれが可能性を知っていませんでした。 –

関連する問題