开发者

How to merge if/else statements in JS?

I'm wondering how to merge these JS if/else statements correctly?

if (window.addEventListener) { window.addEventListener('dosomething', foo, false); }
else { document.addEventListener('dosomething', foo, false); }

if (window.attachEvent) { window.attachEvent('dosomething', foo); }
else { document.attachEvent('dosomething', foo); }

EDIT I

The original code was:

if (window.attachEvent) { window.attachEvent('dosomething', foo); }
else if (window.addEventListener) { window.addEventListener('dosomething', foo, false); }
else { document.addEventListener('dosomething', foo, false); }

Now, I'd like to add

document.attachEvent('dosomething'开发者_JAVA百科, foo);

here.

EDIT II

Turns out, "document.addEventListener" / "document.attachEvent" are redundant, so I'll leave it to

if (window.addEventListener) { window.addEventListener('dosomething', foo, false); } 
else if (window.attachEvent) { window.attachEvent('dosomething', foo); }

Thanks everyone!


The original code looks OK except that it's better to check window.addEventListener first since that is the standard DOM Events interface. attachEvent should only be used as a fallback for IE versions before 9.

I don't know what you're doing with checking for the methods on both window and document. If the method exists on one it will by necessity exist on the other, so your extra option will never occur.

If there is neither window.addEventListener nor window.attachEvent, you are using an ancient browser or a limited (eg. mobile phone) browser. Neither of those will have the same method on document; if they support events at all you would only be able to bind using old-school window.onsomething= function() {...}; style events.


Both conditions perform a different task, you should not join them. However, you may want to have a look at javascript ternary operator to lessen your code.


You don't want to "merge" these if statements. You are checking for two totally different things, even though they are related. I strongly urge you not to.


Leave them as they are.

If you really want to improve your code use a js library that can handle unified events for all browsers (i.e. jQuery).


You can use the || operator to shorten it to this:

(window.addEventListener || document.addEventListener)('dosomething', foo, false);
(window.attachEvent || document.attachEvent)('dosomething', foo);

This works because the expression expr1 || expr2 is evaluated as follows:

Returns expr1 if it can be converted to true; otherwise, returns expr2. Thus, when used with Boolean values, || returns true if either operand is true; if both are false, returns false.


Wasn't the advice to formulate if/else statements in JS like

if (foo) {
   bar();
} else {
   bla();
}

to avoid semicolon insertion issues?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜