2017-08-21 9 views
0

短くポイントまで。これを書くための良い方法は何ですか?同じコードを何度も何度も繰り返しているわけではありません。これを記述するクリーナー/ OOPの方法は何ですか?

$('.login').click(function(e){ 
    e.preventDefault(); 
    $('.model._login').fadeIn(); 
    $('body').addClass('no-scroll') 
}); 

$('._view-observations').click(function(e){ 
    e.preventDefault(); 
    $('.model._key-observations-model').fadeIn(); 
    $('body').addClass('no-scroll') 
}); 

$('._forgottenPW').click(function(e){ 
    e.preventDefault(); 
    $('.model._forgottenPW').fadeIn(); 
    $('body').addClass('no-scroll') 
}); 

ありがとうございます!

+0

https://codereview.stackexchange.com/ – j08691

+1

ライトが –

+1

がフェードインする必要があり要素にボタンを関連付けアイテムの 'data'属性を入れて書くように記述する必要があります3つのボタンすべてに共通のクラスを適用します。そのクラスに対して一つのボタンハンドラを持ち、クリックされたボタンの 'data'属性を使って要素をフェードインします。 – Santi

答えて

2

あなたが名前を入れることができますフェードインしようとしているクラスのボタン自体にdata-elementという属性があります。次に、それらのすべてに共通のクラスbtn-fadeinを追加します。

これにより、data-element属性を参照して対応する要素を表示する単一のハンドラを再利用することができます。

$(".btn-fadein").click(function(e) { 
 
    var elemClass = $(this).data("element"); //Get data-element value 
 
    var $elem = $(".model." + elemClass); //Use it to select the correct element 
 
    $elem.fadeIn();       //Fade in the element  
 
     
 
    e.preventDefault(); 
 
    $('body').addClass('no-scroll'); 
 
});
.model { 
 
    display: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<button class="login btn-fadein" data-element="_login">Login</button> 
 
<button class="_view-observations btn-fadein" data-element="_key-observations-model">View Observations</button> 
 
<button class="_forgottenPW btn-fadein" data-element="_forgottenPW">Login</button> 
 

 
<div class="model _login">login</div> 
 
<div class="model _key-observations-model">key observations model</div> 
 
<div class="model _forgottenPW">forgotten pw</div>

+0

これは素晴らしいです!素晴らしい作品と私​​は本当にデータ属性を使用するためのヒントをありがとう。たくさんのクリーンなHTMLとjQueryを作成します。 – Satrop

1

ここでは、多次元配列を使用する方法の1つです。

var elements = [ 
    ['.login', '.model._login'], 
    ['._view-observations', '.model._key-observations-model'], 
    ['._forgottenPW', '.model._forgottenPW'] 
]; 

$.each(elements, function(i, j) { 
    $(j[0]).click(function(e) { 
    e.preventDefault(); 
    $(j[1]).fadeIn(); 
    $('body').addClass('no-scroll') 
    }); 
}); 
+0

ありがとう!これはうまくいったが、上記のより良い方法があった。 – Satrop

+0

@Satrop確かに、サンティの方法は間違いなくきれいです! –

1

冗長コードと抽象それをを識別する。

これらのそれぞれの唯一の違いは、フェードインを取得しますクラスの名前であるので、この関数は引数としてクラス名を取り、新しい関数を返す:

const generateClickHandler = classToFadeIn => e => { 
    e.preventDefault(); 
    $(classToFadeIn).fadeIn(); 
    $('body').addClass('no-scroll') 
} 

$('.login').click(generateClickHandler('.model._login')); 
$('._view-observations').click(generateClickHandler('.model._key-observations-model')); 
$('._forgottenPW').click(generateClickHandler('.model._forgottenPW')); 
+1

何らかの理由でIEをサポートする必要がある場合は、矢印の機能が動作しないことに気がつくかもしれません(私たちは皆が死んでしまったと思います)。 – Santi

+0

真実 - そしてカルト関数の美学*は、矢印の構文を持たない恥ずかしさ、笑。 – shabs

関連する問題