2017-05-25 9 views
2

私はWebマッピングを勉強してから1ヶ月です。私は現在、jQueryとGeoServerを実践しています。if else文を実行する簡単な方法はありますか?

私はそれを簡素化する方法はありますか? switchはここで使用できますか?

bridge.on('change:visible', function(){ 
    if(bridge.getVisible() == true) { 
     $('#bridge').show();       
    } else { 
     $('#bridge').hide(); 
    } 
}); 

road.on('change:visible', function(){ 
    if(road.getVisible() == true) { 
     $('#road').show();      
    } else { 
     $('#road').hide(); 
    } 
}); 

rail.on('change:visible', function(){ 
    if(rail.getVisible() == true) { 
     $('#rail').show();      
    } else { 
     $('#rail').hide(); 
    } 
});  
+0

* "ここでスイッチを使うことはできますか?" *あなたはいつでも 'if/else'の代わりに' switch'を使うことができます。この場合、if/else全体を '$(" bridge ")。toggle(bridge.getVisible())'で置き換えることができます。 .getVisible() 'がブール値以外の何かを返す可能性がある場合)。 – nnnnnn

+1

' rail'と ' #rail'が同じオブジェクトであれば、あなたは 'this'を使うことができます。それ以外の場合は、データ属性を使用して、クラスを同じように動作させることができますが、ターゲットは異なります。しかし、「レール」、「道路」、「橋」とは何かが不明です。 HTMLを表示できますか? (このコードにのみ関連しています) –

+0

'on(" change:visible ")'は有効な構文ですか?それは何をすべきか? –

答えて

1

問題は単純化が必要なif-else文では実際にはありません。それはrepetitionです。 、関数内で繰り返しコードをラップパラメータに違いを考慮し、三回それを呼び出す:

function toggleWithVisibility(source, target) { 
    source.on('change:visible', function(){ 
     if (source.getVisible() == true) { 
      target.show();       
     } else { 
      target.hide(); 
     } 
    }); 
} 
toggleWithVisibility(bridge, $('#bridge')); 
toggleWithVisibility(road, $('#road')); 
toggleWithVisibility(rail, $('#rail')); 

あなたはまた、余分== trueを省略することによって、引数でtoggleを使用して機能コードを簡素化することができます。

function toggleWithVisibility(source, target) { 
    source.on('change:visible', function(){ 
     target.toggle(source.getVisible()); 
    }); 
} 

あなたは3つの変数がどのように定義されているかをまだ見せていないので、それらを単純化する可能性もあります。 sourcetargetを一緒に選択し、ループから関数を呼び出すことによって

0

あなたは、単一のjQuery()呼び出し、.on()、および条件演算子を使用することができ、

$("#bridge, #road, #rail").on("change:visible", function() { 
    $(this).toggle(!$(this).getVisible()); 
}); 
.filter()
+0

OPの3つの関数がすべて '#road'を更新するわけではないことに注意してください。 – nnnnnn

+0

@nnnnnn見逃した – guest271314

+1

'this'の適切な使用が問題を解決すると思われますが、' bridge'と '#bridge'が同じ要素なので不明です... – nnnnnn

0
var $list= ["bridge", "road","rail"]; 


$list.forEach(function(v) { 
    if($('#'+v').is(":visible")) { 
      $('#'+v').show();      
     } else { 
      $('#'+v').hide(); 
     } 
    } 
}); 

・ホープこのヘルプます。

+1

bridge 、道路と鉄道は変数ですが、残念ながらこれは 'change:visible'イベントにバインドされません – derp

1

機能を利用してください!

function toggleVisible(thing, selector){ 
    selector.toggle(thing.getVisible()); 
} 

bridge.on('change:visible', toggleVisible.bind(this, bridge, $('#bridge')); 
road.on('change:visible', toggleVisible.bind(this, road, $('#road')); 
rail.on('change:visible', toggleVisible.bind(this, rail, $('#rail')); 
+0

[toggle](http://api.jquery.com/toggle/)のパラメータは必要ありません – Rajesh

+0

私は他のイベントが表示/非表示の動作に影響している可能性があります。その状態を変更するのではなく、可視性を設定するだけです。 – derp

+0

'Toggle'は最初の引数として' duration'を想定しています。 'getVisible'はbooleanを返します。booleanは' 0'または '1'に変換されます。 – Rajesh

0

私はそれをテストしていません!

bridge.on('change:visible', function(){ 
     $('#bridge').toggle(); 
    }); 

    road.on('change:visible', function(){ 
     $('#road').toggle(); 
    }); 

    rail.on('change:visible', function(){ 
     $('#rail').toggle(); 
    }); 
+0

投稿する前に他の回答を確認してください。 – Rajesh

+0

簡単に同期が外れることがあります。 – Bergi

関連する問題