2010-05-14 38 views
0

如何在JavaScript中改進以下if-else結構?如何改善這個如果在JavaScript結構?

if(isIE()) 
    if(termin != "") 
     TargetElement.onclick = function() {merkzettelRemove(this, id, termin)}; 
    else 
     TargetElement.onclick = function() {merkzettelRemove(this, id)}; 
    else 
     if(termin != "") 
      TargetElement.setAttribute("onclick","merkzettelRemove(this, " + id + ", 
       '" + termin + "')"); 
     else 
      TargetElement.setAttribute("onclick","merkzettelRemove(this, " + id + ")"); 
+0

你想要改進什麼?我能想到的唯一方法是縮短這個使用Javscript框架。 – jigfox 2010-05-14 10:28:40

+3

如果你使用大括號,它會得到改善。 – Skilldrick 2010-05-14 10:34:24

+0

@Jens - 有很多方法可以縮短這一點,其中沒有包括添加庫。而改善並不意味着縮短。 – 2010-05-14 11:08:11

回答

5
// get a cross-browser function for adding events 
var on = (function(){ 
    if (window.addEventListener) { 
     return function(target, type, listener){ 
      target.addEventListener(type, listener, false); 
     }; 
    } 
    else { 
     return function(object, sEvent, fpNotify){ 
      object.attachEvent("on" + sEvent, fpNotify); 
     }; 
    } 
}()); 

// add the event listener 
on(TargetElement, "click", function(){ 
    // if termin is empty we pass undefined, this is the same as not passing it at all 
    merkzettelRemove(this, id, (termin) ? termin : undefined); 
}); 
+0

問題是我認爲,每次點擊時我都有越來越多的事件監聽器。這是真的嗎? – user160820 2010-05-17 09:14:06

+0

否:)你只在調用'on(...)時添加聽衆,而且這只是一次正確的嗎? – 2010-05-17 11:32:19

0

我知道這是不是你的問題的答案,但如果你沒有任何理由不這樣做,你一定要使用在乎你的兼容性問題,如jQuery庫。然後,你可以寫這樣的事情:

var el = $(TargetElement); 

if (termin != "") 
    el.click(function() {merkzettelRemove(this, id, termin)}); 
else 
    el.click(function() {merkzettelRemove(this, id)}); 
+1

我不一定會說jQuery'關心'兼容性問題:) – 2010-05-14 10:35:08

+0

你是什麼意思,肖恩? – 2010-05-14 10:50:42

+1

jQuery的開發人員並不知道他們的'高質量'代碼 - 版本之間經常發生中斷,特別是在支持舊瀏覽器方面。 – 2010-05-14 11:40:39

0

我想使用JavaScript框架是最好的解決方案,但你可以嘗試這樣的事:第一

var src="merkzettelRemove(this, " + id + (termin && (",'" + termin + "'")) + ")"; 
if (isIE()) { 
    TargetElement.onclick = new Function(src); 
} else { 
    TargetElement.setAttribute("onclick", src); 
} 
2

第一件事,把一些更多的大括號。它會讓事情變得更加清晰,並且在將來編輯這些內容時可以節省無數的心痛。

是的,你可以如果他們包裝一個單獨的語句,沒有大括號就可以脫身。當你從現在開始三個月後再添加其他東西到其中一個塊中時,除非你記得用花括號將整個塊包裹起來,否則你的代碼將會中斷。養成從一開始就這樣做的習慣。

+0

當我離開我對這個問題的評論時,我沒有看到這個。我想說的代碼 – Skilldrick 2010-05-14 10:36:53

+1

這不僅僅是爲了處理編輯,而且還表現出更好的意圖,看看上面的代碼,看起來第二個'if'有兩個'else',因爲壓縮不好。添加大括號會使它明顯在哪裏發生。 – Skilldrick 2010-05-14 10:42:27

1

首先,到處使用{},它會使循環更具可讀性。

二:我覺​​得這個不相同

if(isIE()) { 
    TargetElement.onclick = function() { 
      merkzettelRemove(this, id, termin || null); 
      }; 
} else { 
    TargetElement.setAttribute("onclick", 
      "merkzettelRemove(this, " + id + ",'" + termin || null + "')"); 
} 

三,你可以嘗試使用unobtrusive JavaScript來處理程序添加到TargetElement

1

首先,失去了瀏覽器嗅探。 onclick= function...無處不在; setAttribute不僅在IE中破解,而且也很難看。 JavaScript-in-a-string是一種很大的代碼味道;避免。 setAttribute在HTML屬性上存在IE問題,並且與簡單DOM級別1的HTML屬性相比可讀性差;避免。

其次,這將是理想的,使merkzettelRemove接受外的帶外值(nullundefined,甚至''本身),以及一個參數省略。它可能已經允許undefined,這取決於它使用什麼機制來支持可選參數。如果是這樣,你可以簡單地說:

TargetElement.onclick= function() { 
    merkzettelRemove(this, id, termin || undefined); 
}; 

如果必須完全省略該參數,你不希望使用if...else,還有周圍的另一種方式,雖然IMO清晰度更糟糕的是:

TargetElement.onclick= function() { 
    merkzettelRemove.apply(null, termin==''? [this, id] : [this, id, termin]); 
}; 
0

如何使用短路操作。所以下面的代碼

如果(A) {

如果(B){ ℃; }
否則{ d;} 否則{如果 (E)
F; else G; } }

將成爲

甲& &((B & & C)|| d ||((E & & F)|| G));