Логический оператор ИЛИ в операторе JavaScript - PullRequest
4 голосов
/ 04 января 2012

У меня есть два файла jQuery - один [newForms_jQuery.js] вызывается для userNewItemForm и adminNewItemForm, другой [editForms_jQuery.js] вызывается для userEditItemForm и adminEditItemForm.

Я хотел бы объединить эти два файла в один файл jQuery, и я хотел использовать оператор case.

Я узнал, что синтаксис будет

switch(n)
{
case 1:
  execute code block 1
  break;
case 2:
  execute code block 2
  break;
default:
  code to be executed if n is different from case 1 and 2
}

Я получаю имя файла, чтобы различить формы New и Edit, а затем делаю что-то на основе этого. Моей первой мыслью было использовать логическое ИЛИ в моем случае, например:

case (url="userNewItemForm.aspx") || (url="adminNewItemForm.aspx"):
//do something
case (url="userEditItemForm.aspx") || (url="adminEditItemForm.aspx"):
//do soemthing else

Однако потом я нашел https://stackoverflow.com/a/1806279/429694. Итак, я изменил свой сценарий на:

switch(url)
{
case "userNewItemForm.aspx": //intentionally left blank to fall through
case "adminNewItemForm.aspx":
// do new record stuff
break;
case "userEditItemForm.aspx": //intentionally left blank to fall through
case "adminEditItemForm.aspx":
//do edit record stuff
break; 
default:
alert(url);
}

Это, похоже, сработало, однако при дальнейшем тестировании я обнаружил, что в кейс-заявлениях нет разрыва; не провалился, как я ожидал. Любой совет?

Update1: Следуя совету @ jbabey, я изменил свой сценарий следующим образом, который, по моему мнению, решил мою проблему, однако это не совсем так. Кажется, когда я открываю URL, который находится во 2-й части оператора OR, он не выбирает имя и вместо этого выполняет регистр по умолчанию.

Вот мой текущий код

    function getFileName() 
    {
    url = document.location.href; //gets the full url. URL is global var after function called
    url = url.substring(0, (url.indexOf("#") == -1) ? url.length : url.indexOf("#")); //this removes the anchor at the end, if there is one
    url = url.substring(0, (url.indexOf("?") == -1) ? url.length : url.indexOf("?")); //this removes the query after the file name, if there is one
    url = url.substring(url.lastIndexOf("/") + 1, url.length); //this removes everything before the last slash in the path
    return url; //returns filename
    }
$(document).ready(function(){  
     getFileName();
    switch (url)
    {
            case ("eacrfNew_jQuery.aspx" || "newItem_jQuery.aspx"):
              // do new record stuff
            break;
            case ("eacrfEdit_jQuery.aspx" || "editItem_jQuery.aspx"):
              //do edit record stuff 
            break; //close edit record stuff
            default: 
              // which file did it open?    
              alert(url);
    } 
   }); // close doc.ready

ФИНАЛЬНОЕ ОБНОВЛЕНИЕ:

ВЫ НЕ МОЖЕТЕ ИСПОЛЬЗОВАТЬ ЛОГИЧЕСКИЕ ОПЕРАТОРЫ В ЗАЯВЛЕНИЯХ СЛУЧАЯ Вместо этого вы должны использовать if ... else См. http://www.naveen.com.au/javascript/jquery/switch-case-in-jquery/319 для получения подробной информации.

function getFileName() 
{
url = document.location.href; //gets the full url into global var
return url; //returns filename
}

function clearID()
{
 //clears field values 
}

$(window).load(function(){  
   $(document).ready(function(){  
     getFileName();
     if ((url === "eacrfNew_jQuery.aspx") || (url === "newItem_jQuery.aspx")) {
        // do new record stuff
     } else if ((url === "eacrfEdit_jQuery.aspx") || (url === "editItem_jQuery.aspx")) {
        // do edit record stuff  
     } else {   
       /// default: which file did it open?
       alert(url);
     }
   }); // close doc.ready 
}); // close window.load 

Ответы [ 3 ]

9 голосов
/ 04 января 2012

Вот почему я окружаюсь {}

switch(url)
{
   case "userNewItemForm.aspx": 
   case "adminNewItemForm.aspx":
   {
      // do new record stuff
      break;
   }
   case "userEditItemForm.aspx": 
   case "adminEditItemForm.aspx":
   {
      // do edit record stuff
      break;
   }
}

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

1 голос
/ 04 января 2012

Вместо использования каскадных кейсов, может быть более целесообразно оценивать ваши кейсы как логические:

switch (true) {
    case (bool1 && bool2):
        alert('case 1');
        break;
    case (bool1 || bool2):
        alert('case 2');
        break;
    default:
        alert('default');   
}

См. Пример здесь: http://jsfiddle.net/Z7SDY/1/

0 голосов
/ 04 января 2012

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

провал без перерыва соответствует проекту ECMA.

см. здесь для более подробной информации

...