2010-05-14 33 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));