2014-02-11 2 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));  
    } 

Das ist mein Code, und aus irgendeinem Grund wird die Funktion nicht ausgeführt, die ausgeführt werden sollte. Zu Testzwecken könnten wir ändern und es wird immer noch nicht laufen. Kann mir jemand erklären, warum das nicht läuft? Verwenden Sie nicht wirklich SchalteranweisungenSchaltergehäuse Regextest

+0

Schalter Sie immer mit Pfad vergleichen. Machen Sie Ihre Zeichenfolge so, dass Sie das gleiche wie Pfad eingeben. für die Verwendung von Substring wie Sie versuchen, siehe hier: http: //stackoverflow.com/questions/2896626/switch-statement-for-string-matching-in-javascript – chillworld

Antwort

2

switch-case funktioniert nicht so.

regex.test() Die Methode gibt einen booleschen Wert (true/false) zurück, und Sie vergleichen dies mit der Eingabezeichenfolge selbst, was für die case-Anweisung nicht zutrifft.

Sie müssen switch-case in mehrere if/else if/else Block umwandeln, um Ihre Logik auszuführen.

+0

Oh, also müsste der Schalter für wahr gesetzt werden? – EasyBB

+0

Für Ihre aktualisierte Antwort, ich habe nur den Schalter auf True und es funktioniert jetzt völlig in Ordnung. Ich habe es von einem 'if/else if/else' geändert, also wurde es minimiert und nicht so überladen. – EasyBB

+0

Schalter ist nur nützlich, wenn mehrere Werte übereinstimmen müssen, hier erhalten Sie entweder wahr oder falsch von 'regex.test()' Methode. – anubhava

9

Änderung

switch(path){ 

zu

switch(true){ 

, wie Sie in Thread ich reffering in Kommentar zu sehen.

+0

Ja, ich sah das früher, aber nachdem Anubhava es erklärt hatte, verstand ich, warum es nichts zurückgab und das war, weil das, wonach es suchte, nicht wahr oder falsch war. es funktioniert jetzt danke. – EasyBB

+0

Ich vergesse immer wieder haha, danke! – jemiloii

2

Nur für das Protokoll könnte die switch case neu geschrieben werden:

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' 
); 

Oder getCSS umschreiben, mit einem Hilfsobjekt

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

Ein Zitat zu viele? Test (Pfad) ' – mplungjan

+0

@mplungjan Ja, korrigiert, danke – KooiInc

2

Keine der entsandten Antworten eine richtige Methode zeigt eine verwenden, RegExp-Muster in einem Schaltergehäuse so dachte ich, ich schreiben würde:

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

+0

Das funktioniert gut. Darf ich fragen, was ist das UND für und warum funktioniert es nicht ohne? – JustAGuy

+0

@gilfalko die && myVar ist erforderlich, weil der Schalter nach einem Fall sucht, in dem der Parameter übereinstimmt, also machen wir das &&, um die Übereinstimmung nur dann zu machen, wenn die Regex wahr ist. –

+0

Sie können das && entfernen und den Parameter in 'true' ändern, wie im Beispiel von @chillworld, und es wird auch funktionieren –

0

haben einen Blick

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

Warum -1 für diese Antwort? – DebuggerCoder