2013-08-22 4 views
0

Я пишу сценарий, который проверяет текущий URL в браузере и действует соответствующим образом, мой код выглядит следующим образом:Улучшить условную структуру?

if (url.match("^https?://(www\.)?bing\..+$")) { 
    engine = "bing"; 
} else { 
    if (url.match("^https?://(www\.)?google\..+$")) 
     engine = "google"; 
    else 
    if (url.match("^https?://(www\.)?yahoo\..+$")) 
     engine = "yahoo"; 
    else .... // etc. 
} 

и так далее для 8 сайта, я просто держать с если еще, есть способ улучшить этот код, потому что это выглядит мне немым.

+2

Карта двигатели в их регулярные выражения и петлю. –

+0

не могли бы вы дать мне небольшой пример, я немного новичок в Javascript ^^; еще раз спасибо. – MNS

ответ

1

Фактически вы можете получить позицию соответствия в своей переменной для фрагмента URL-адреса, который вы ищете.

Как так:

url = ['https://www.google.com','https://www.yahoo.com'] 

for (var i = 0; i<url.length; i++) 
{ 
    var site = url[i].match("^https?://(www\.)?([A-Za-z0-9]+)\..+$")[2] 
    alert(site) 
} 

И с этим в руке вы можете переключить его делать то, что вы пытаетесь:

switch(site) { 
    case "google": { /* do something..*/ } break; 
    case "yahoo" : { /* do something..*/ } break; 
} 

Следит рабочему скрипку http://jsfiddle.net/XPT3L/

+0

ТОЧНО ЧТО Я НУЖДАЮ: D Большое спасибо ** Роджер **, с переключателем и все. – MNS

3

PUT моторы в массиве и петле,

примерно

sengs = ['bing','google','yahoo']; 
    foreach of yourarray { 
     if(url.match("^https?://(www\.)?"+your value+"\..+$")){ 
      engine = your value; 
     } 
    } 
2

Почему бы не просто получить доменное имя от URL-адреса, используя match на странице? Это сделает ваш код намного короче, и вам не нужно писать почти -простая проверка каждый раз.

var engine = url.match(/:\/\/(.[^\.]+)/)[1]; 

Эта часть только захватывает первое слово после того, как протокол, который www для большинства веб-сайтов. чтобы убедиться, что вы захватить правильное имя, которое вы могли бы обернуть это в функции с дополнительной проверкой:

function getDomainName(url) { 
    url = url.match(/:\/\/(.[^/]+)/)[1].split('.'); 
    return url[url.length - 2].toLowerCase(); 
} 

Вызов getDomainName(url) теперь будет возвращать имя домена, который вы могли бы использовать позже.

getDomainName('http://bing.com/'); // bing 
getDomainName('http://www.google.com/'); // google 
getDomainName('http://stackoverflow.com/questions/18380805/improve-the-conditional-structure/'); // stackoverflow 
// and so on 

Теперь вам нужно только проверить, находится ли это значение внутри массива двигателя, который вы принимаете. Это можно сделать, используя Array.indexof.

var engines = ['google', 'bing', 'yahoo']; 
var domain = getDomainName(url); 

if (engines.indexOf(domain) > -1) { 
    engine = domain; 
} 

Edit: Теперь у вас есть ваше имя двигателя, использовать это в распределительном регистре (или если заявления, если вам нравится это лучше), и делать то, что вы хотите сделать. Если вы сделаете это, вы можете избавиться от массива двигателей.

Собирает все это вместе, этот код все, что вам нужно:

function getDomainName(url) { 
    url = url.match(/:\/\/(.[^/]+)/)[1].split('.'); 
    return url[url.length - 2].toLowerCase(); 
} 

switch (getDomainName(url)) { 
    case "google": 
    // do stuff for google's engine. 
    break; 

    case "bing": 
    // Do Bing stuff. 
    break; 

    case "yahoo": 
    // and so on 
    break; 

    default: 
    // None of the engines was found 
    break; 
} 
+0

В моем Вопросе не было ясно, извините, да, это отличная идея, но я для каждого движка, я должен сделать что-то другое. Хотя обертывание в функции - отличная идея, большое спасибо ребятам. – MNS

+1

@ user2463937 ты был совершенно ясен. Это просто заменяет проверки для получения домена за один раз, а не для каждого случая.Я добавлю кое-что, чтобы показать вам, как вы можете использовать это в случае с коммутатором. – Broxzier

+0

Абсолютно верно, еще раз спасибо. :) – MNS