2014-02-11 58 views
5
var path = location.pathname; 
switch(path){ 
    case (/\/memberlist/).test(path) :getCSS('url-22.css'); break; 
    case (/\/register/).test(path): getCSS('url-6.css'); break; 
    case (/buy-credits/g).test(path): getCSS('url-7.css'); break; 
    case (/\/?u(\d+)friends$/).test(path): getCSS('url-8.css'); break; 
    case (/\/privmsg/).test(path): getCSS('url-9.css'); break; 
    case (/\/?u(\d+)wall$/).test(path): getCSS('url-4.css'); break; 
} 
    function getCSS(url,media){ 
     var a = document.createElement('link'); 
      a.href=url; 
      a.media= media || 'screen'; 
      a.rel="stylesheet"; 
    return (document.getElementsByTagName('head')[0].appendChild(a));  
    } 

這是我的代碼,由於某種原因,它沒有運行應該運行的函數。出於測試目的,我們可以更改var path="/memberlist",它仍然不會運行。有人可以向我解釋爲什麼這不會運行。不要真的使用開關語句Switch Case正則表達式測試

+0

開關你總是與路徑比較。所以讓你輸入的字符串和路徑一樣。 使用像你嘗試子字符串在這裏看到:http://stackoverflow.com/questions/2896626/switch-statement-for-string-matching-in-javascript – chillworld

回答

2

switch-case不能這樣工作。

regex.test()方法返回一個布爾值(true/false),並且將其與輸入字符串本身進行比較,對於case語句中的任何一個,這都不是真的。

您需要將switch-case轉換爲多個if/else if/else塊來執行您的邏輯。

+0

哦,所以開關將不得不被設置爲真? – EasyBB

+0

對於您更新的答案,我只是將開關更改爲true,現在它工作得很好。我把它從一個'if/else if/else'改成了它,所以它被最小化了,而且沒有那麼混亂。 – EasyBB

+0

只有當需要匹配多個值時,switch纔有用,在這裏您將從'regex.test()'方法獲得true或false。 – anubhava

9

變化

switch(path){ 

switch(true){ 

,你可以在線程看到我reffering在評論。

+0

是的,我之前看到過這個,雖然在anubhava解釋它之後,我明白了爲什麼它沒有返回任何東西,那是因爲它所尋找的不是真的或假的。它現在有用,謝謝。 – EasyBB

+0

我一直忘記這個哈哈,謝謝! – jemiloii

2

只是爲了記錄在案,在switch case可以改寫爲:

getCSS(
    /\/memberlist/).test(path) && 'url-22.css' || 
    /\/register/).test(path)  && 'url-6.css' || 
    /buy-credits/g).test(path) && 'url-7.css' || 
    /\/?u(\d+)friends$/)   && 'url-8.css' || 
    /\/privmsg/).test(path)  && 'url-9.css' || 
    /\/?u(\d+)wall$/).test(path) && 'url-4.css' || 
    'default' 
); 

或重寫getCSS,使用輔助對象

var path2url = { 
    css: [ 
       {re: /\/register/, css: 'url-22.css'}, 
       {re: /buy-credits/g, css: 'url-6.css'}, 
       {re: /\/?u(\d+)friends$/, css: 'url-8.css'}, 
       {re: /\/privmsg/, css: 'url-8.css'}, 
       {re: /\/?u(\d+)wall$/, css: 'url-4.css'} 
     ], 
    getURL: function(path) { 
    var i = this.css.length; 
    while (--i) { 
     if (this.css[i].re.test(path)) { 
     return this.css[i].css; 
     } 
    } 
    return null; // or something default 
    } 
}; 

function getCSS(path,media){ 
    var a = document.createElement('link'); 
    a.href= path2url.getURL(path); // <= 
    a.media= media || 'screen'; 
    a.rel="stylesheet"; 
    return (document.getElementsByTagName('head')[0].appendChild(a));  
} 
+0

報價太多?測試(路徑)' – mplungjan

+0

@mplungjan是的,更正,謝謝 – KooiInc

2

無張貼的答案顯示出正確的方法使用在開關的情況下正則表達式模式,所以我想我會發布:

switch (myVar) { 
 
    case 'case1': 
 
     /...do work 
 
     break 
 
    case /[a-z]*/.test(myVar) && myVar: 
 
     /...regex match, do work 
 
     break 
 
}

+0

這很好。 我可以問什麼是AND,但爲什麼沒有它就無法工作? – JustAGuy

+0

@gilfalko && myVar是必需的,因爲交換機正在尋找一個參數匹配的情況,所以我們只有在正則表達式爲真時才用&&來進行匹配。 –

+0

您可以刪除&&並將參數更改爲'true',如@ chillworld的示例中那樣,它也可以工作 –

0

看一看

switch(str){ 
    case (/(abc|xyz)/.test(str) ? str : false): 
     // Do some stuff 
     break; 
    default: 
     // Do default stuff   
} 
+0

爲什麼-1這個答案? – DebuggerCoder