2010-11-16 83 views

回答

7

明顯的方式搞亂做,這是這可能會破壞:

var h = window.location.hash; 
if (h != '' && h != '#all' && h != '#') 
+0

+1。很好很簡單 – cobbal 2010-11-16 05:44:27

+0

我傾向於使用局部變量這種方式很多。它也使調試更容易。 – 2010-11-16 21:26:49

6

您可以使用運營商和對象文本:

if (!(window.location.hash in {'':0, '#all':0, '#':0})) 

這部作品通過測試對象的鍵(0的只是填料)。

還要注意的是,如果你是object的原型

+0

使用數組將是整潔(不需要填充0)解決方案,但是IE沒有'indexOf',所以我想這是更好的 – 2010-11-16 05:42:29

+0

你真正需要的'!'? '0'是不是完成了?快速[搜索](http://snippets.dzone.com/posts/show/6557)建議在簡單的「或」情況下使用'1',所以我猜「0」會否定它? – 2010-11-16 05:51:57

+0

@Isaac 0的意義不大,'in'只是檢查鍵。 – cobbal 2010-11-16 05:54:37

3

正則表達式?事實並非如此可讀,但足以簡潔:

if (/^(|#|#all)$/.test(window.location.hash)) { 
    // ... 
} 

這也適用於:

if (window.location.hash.match(/^(|#|#all)$/)) { 
    // ... 
} 

...但它的效率較低,每Ken的評論。

+0

爲了完全準確,第二個示例應該使用'search'而不是'match',並且都應該測試值== -1。字符串的「搜索」方法與RegExp的「test」方法相當,而其「匹配」方法與RegExp的「exec」方法相當。 'match'和'exec'比較慢,但提供更多信息(或者不匹配時爲null),而search和test只是給出第一個匹配開始的字符串的索引比賽)。 – 2010-11-16 06:11:00

+0

'RegExp.test'返回一個布爾值,而不是索引。不過,我同意你的評論的其餘部分。我的第二個例子效率稍低,但比您提出的替代方案更具可讀性 - 我猜,簡潔是問題的關鍵。 – harto 2010-11-16 23:35:52

1

對較新的瀏覽器使用indexOf,併爲舊版瀏覽器提供了一個實現,您可以找到here

// return value of -1 indicates hash wasn't found 
["", "#all", "#"].indexOf(window.location.hash) 
1

只是一個加法,因爲除了相當好多種不要重複自己辦法,沒有人提到:

在瀏覽器中,windowGlobal 對象,所以就把它砍下來,如果你不 有另一個屬性 "location"在當前範圍 (不太可能)。 location.hash足夠

1

我覺得這是好事,檢查長度,因爲第一個字符始終是一個哈希值。

var h = location.hash; 
if (h.length > 1 && h != '#top') 
相關問題