2012-09-17 36 views
-1

有沒有更簡單的方法(更清潔的方式)做我的下面的代碼?有沒有辦法縮短這段代碼?

if (whichToCheck == 1) { 
    if ($('#input_3').val().length) { 
     $('#error1').css('display', 'none'); 
     $('#error1').css('visibility', 'hidden'); 
     hasErrors = false; 
    } else { 
     $('#error1').css('display', 'block'); 
     $('#error1').css('visibility', 'visible'); 
     hasErrors = true; 
    } 
} 
else if (whichToCheck == 2) { 
    if ($('#input_4').val().length) { 
     $('#error2').css('display', 'none'); 
     $('#error2').css('visibility', 'hidden'); 
     hasErrors = false; 
    } else { 
     $('#error2').css('display', 'block'); 
     $('#error2').css('visibility', 'visible'); 
     hasErrors = true; 
    } 
} 
else if (whichToCheck == 3) { 
    if ($('#input_5').val().length) { 
     $('#error3').css('display', 'none'); 
     $('#error3').css('visibility', 'hidden'); 
     hasErrors = false; 
    } else { 
     $('#error3').css('display', 'block'); 
     $('#error3').css('visibility', 'visible'); 
     hasErrors = true; 
    } 
} 
else if (whichToCheck == 4) { 
    if ($('#input_7_0').is(':checked')) { 
     $('#error4').css('display', 'none'); 
     $('#error4').css('visibility', 'hidden'); 
     hasErrors = false; 
    } else { 
     $('#error4').css('display', 'block'); 
     $('#error4').css('visibility', 'visible'); 
     hasErrors = true; 
    } 
} 
else if (whichToCheck == 5) { 
    if ($('#input_6').val().length) { 
     $('#error5').css('display', 'none'); 
     $('#error5').css('visibility', 'hidden'); 
     hasErrors = false; 
    } else { 
     $('#error5').css('display', 'block'); 
     $('#error5').css('visibility', 'visible'); 
     hasErrors = true; 
    } 
} 

謝謝!

+6

這屬於[Codereview.SE]。 – zzzzBov

+0

沒有什麼理由設置「display:none」和「visibility:hidden」,特別是如果你要同時撤銷這兩個選項。 – Blazemonger

+0

同意下面的內容(切換塊和設置CSS),但所有常見屬性都可以設置一次,每塊更改一次 – ericosg

回答

3

首先,您應該使用開關塊並將要修改的元素存儲在變量中。 短版:

var input, error; 
switch(whichToCheck){ 
    case 1: 
     input=$('#input_3'); 
     error=$('#error1'); 
     break; 
    case 2: 
     input=$('#input_4'); 
     error=$('#error2'); 
     break; 
    default: 
     ... 
     break; 
} 
var hasErrors = !!input.val().length; 
if(hasErrors) error.show(); else error.hide(); 

或者爲最終較短:

hasErrors&&error.show(); 
hasErrors||error.hide(); 
+0

'hasErrors && error.show()'是一種編碼風格,它使得它完全不可讀,幾乎不可能維護 – wroniasty

+0

這是生產代碼,而不是開發。我不同意。 –

+0

你的意思是說開發代碼可能不可讀? – wroniasty

1

這一個最好設置CSS:

$('#error1').css({'display': 'none', 'visibility': 'hidden'}); 
+0

感謝您設置CSS的簡短方式,keaukraine! – StealthRT

2

一個更好的方式,如果做到這些。那麼... else語句將使用switch語句。特別是當有你正在尋找...

switch(whichToCheck){ 
    case "1": 
    // when whichToCheck == 1 
    break; 
    case "2": 
    // when whichToCheck == 2 
    break; 
    default: 
    // when the value of whichToCheck doesn't match any expected value 
    break; 
} 

另一件事多個值,你可以做,以減輕你的代碼是使用jQuery的show()hide()功能...好...捉迷藏顯示元素:)您並不需要明確設置displayvisibility屬性。

參考 -

1

對於初學者來說,你可以創建CSS類和jQuery的

了Exa使用addClass功能楓木:

CSS

.hide{ 
    display: none; 
    visibility: hidden; 
} 

jQuery的

$('#error1').addClass("hide"); 
+0

我想過這樣做,但仍然只想使用一個CSS類。 – StealthRT

+0

您可以使用'hide'類並在適當的時候設置它,而不是使用新的類來使用jQuery所提供的'removeClass'函數。 – Chase

1

當你寫你的代碼

$('#error3').css('display', 'block'); 
$('#error3').css('visibility', 'visible'); 

重複在幾個地方的風格變化。你可以把它變成一個函數,讓你傳遞錯誤字段名稱。

對於#error3你傳遞參數爲3,然後顯示和可見性參數。

感謝

1

你可以基於whichToCheck價值的ID和使用jQuery的隱藏方法來隱藏要素:

function toggleErrors($input, whichToCheck){ 
    if($input.val() !== '' || $input.is(':checked')){ 
    $('#error' + whichToCheck).hide(); 
    }else{ 
    $('#error' + whichToCheck).show(); 
    } 
} 

通行證在whichToCheck和相應的輸入元素的功能。

+0

這是正確的,但我也有一個複選框的值。 – StealthRT

+0

我添加了一個黑客的檢查條件。不過,如果可能的話,我鼓勵您使用關係來連接輸入和錯誤元素。 –

+0

**輸入**代表什麼?應該是** this.value **? – StealthRT

2

您可以通過動態選擇元素縮短很多。另外,把它們放在「緩存」變量中,而不是重新創建jQuery實例。你可以通過傳入一個對象來使用jQuery's .css() method的簡寫形式。此外,您應該將這兩種不同的樣式放入變量中,而不是重複它們 - 盡一切努力使代碼更加乾爽。

在一個班輪:

$('#error'+whichToCheck).css((hasErrors = !$('#input_'+(2+whichToCheck)).val().length) 
    ? {display: 'block', visibility: 'visible'} 
    : {display: 'none', visibility: 'hidden'} 
); 

然而,你的IDS似乎不是太正規,所以我推薦一個映射器在(可能重複)Alternative to a million IF statements

var toCheck = document.getElementById('input_' + {1:'3', 2:'4', 3:'5', 4:'7_0', 5:'6'}[whichToCheck]), 
    errorEl = $('#error'+whichToCheck); 
hasErrors = !(toCheck.type=="checkbox" ? toCheck.checked : toCheck.value); 
if (hasErrors) 
    errorEl.css({display: 'block', visibility: 'visible'}); 
else 
    errorEl.css({display: 'none', visibility: 'hidden'}); 

而且,您不需要設置displayvisibility,如果您使用jQuery的.hide()/.show()它也可以用於非塊元素:

errorEl[hasErrors ? "show" : "hide"](); 
+0

您是否注意到該複選框? **如果($('#input_7_0')。(':checked')){** – StealthRT

+0

感謝您的提示,我修改了代碼。 – Bergi

+0

新代碼現在似乎不適用於輸入框。在箱子裏什麼都沒有的時候,堅持說真話。 – StealthRT

1
  1. 使用開關()語句提到的阿梅爾。
  2. 提取顯示()&分別隱藏()方法。

下面是示例:

if (whichToCheck == 1) { 
     if ($('#input_3').val().length) { 
      Show('#error1'); 
      hasErrors = false; 
     } else { 
      Hide('#error1'); 
      hasErrors = true; 
     } 
    } else if (whichToCheck == 2) { 
     if ($('#input_4').val().length) { 
      Show('#error2'); 
      hasErrors = false; 
     } else { 
      Hide('#error2'); 
      hasErrors = true; 
     } 
    } else if (whichToCheck == 3) { 
     if ($('#input_5').val().length) { 
      Show('#error3'); 
      hasErrors = false; 
     } else { 
      Hide('#error3'); 
      hasErrors = true; 
     } 
    } else if (whichToCheck == 4) { 
     if ($('#input_7_0').is(':checked')) { 
      Show('#error4'); 
      hasErrors = false; 
     } else { 
      Hide('#error4'); 
      hasErrors = true; 
     } 
    } else if (whichToCheck == 5) { 
     if ($('#input_6').val().length) { 
      Show('#error5'); 
      hasErrors = false; 
     } else { 
      Hide('#error5'); 
      hasErrors = true; 
     } 
    } 

    function Show(id) { 

     $(id).show(); 

    } 

    function Hide(id) { 
     $(id).hide(); 
    } 
+0

那麼爲什麼你沒有實現交換機? – Lix

+0

在這裏,我已經提到要使用Switch假設這個人知道如何使用。所以,我解釋瞭如何使用Switch。但我想指出,爲隱藏和顯示移動一些sphagetti編碼來分離方法來照顧它們。這是我解釋中的上下文,而不是「使用Switch」。 – Dhanasekar

1

縮短你的代碼的關鍵似乎是whichToCheck變量的來源。或者你可以這樣做:

//... 
if ($('#input_' + whichToCheck).val().length) { 
    $('#error_' + whichToCheck).css ({ 'display' : 'none', 'visibility' : 'hidden' }); 
} else { 
    $('#error_' + whichToCheck).css ({ 'display' : 'block', 'visibility' : 'visible' });   
}