2014-11-07 2 views
-2

Странная проблема с Javascript. Что происходит:Javascript Если заявление ведет себя странно

  • Пользователь нажимает кнопку, он передает значение ASCII скрипту.
  • Значение ASCII хранится в переменной под названием «выбор»
  • Затем скрипт прокручивает файл XML и сравнивает первую букву каждого названия фильма с выбором var.
  • Точка сценария должна показывать пользователю все фильмы, начинающиеся с буквы по своему выбору.

Проблема:

  • Все буквы отлично работает для S и P.

функция Go (выбор), за исключением {

var nextChar = choice; 
nextChar++; 

$.ajax({ 
type: "GET", 
url: "../xml/movielist.xml", 
dataType: "xml", 
success: function (xml) 
{ 
    var link = '<a href="'; 
    var linkMid = '">'; 
    var linkEnd = "</a>"; 
    var output = ""; 

    $(xml).find('movie').each(function()             //For each <Movie> tag, retrieve the following: 
    {           
     var title = $(this).find('title').text()           //Retreive Movie's Title 

     if ((title.substring(0, 5) == "The " + String.fromCharCode(choice)) || (title.substring(0, 1) == String.fromCharCode(choice)) || (title.substring(0, 3) == "A " + String.fromCharCode(choice))) 
     { 
      /*Deleted lines here to save space and they also don't apply to the problem at hand*/ 
      output = output + "<tr>" + rowOut + "</td>"; 

     } 
     if (title.substring(0, 1) == String.fromCharCode(nextChar)) 
     { 
      document.getElementById("results").innerHTML = output; 
      return false; 
     }    

    }) 
} 

}) } ;

Пример кода XML. Это первые два фильма, которые начинаются с буквы С.

<movie> 
    <title>Salt</title> 
    <link>films/salt.aspx</link> 
    <runtime>1h 34m</runtime> 
    </movie> 
    <movie> 
    <title>See No Evil</title> 
    <link>films/seenoevil.aspx</link> 
    <runtime>1h 24m</runtime> 
    </movie> 

Позвольте мне повторить, что этот сценарий прекрасно работает и выводит результаты на экран для каждой буквы, кроме S, P и Z (хотя я знаю, почему Z не работает, я еще не написал код). Я понятия не имею, почему S и P ведут себя по-другому. Через некоторую отладку я пришел к выводу, что оператор If никогда не вводится, когда пользователь выбирает S или P, что означает, что условия в операторе If не выполняются, даже если переменная «выбор» равна 80 или 83 (P или S соответственно) на протяжении всего упражнения.

Я уверен, что это что-то глупое, но я действительно не могу обернуть вокруг себя голову.

Любые предложения были бы весьма полезными. Заранее спасибо!

+2

Вы можете взять то, что вы писали и перегонять его в чем-то немного больше концентрировали. Представьте, что вы пишете письмо своему коллеге. Нам очень трудно прочитать параграфы и параграфы и выяснить, что вы хотите. Дайте пару фраз, объясните, что вам нужно, затем укажите свой вопрос явно. Таким образом, нам будет намного легче помочь вам. –

+0

Вы уверены, что название не имеет ведущих пробелов? Также вы пробовали тестировать его только для if (title.substring (0, 1) == String.fromCharCode (выбор)), когда выбор «S»? –

+0

@JeromeAnthony Да, я пробовал только одно условие, и ни один из заголовков в файле XML не имеет перед ними пробела. – Alcolawl

ответ

0

Fixed. Проблема заключалась в смешении нелогичных условий в утверждениях If и ошибочном дизайне. Программа вернет false, когда цикл столкнулся с фильмом, который начинался со следующей буквы. Поэтому, если пользователь выбрал букву «S», сценарий будет перебирать XML-файл и находить все фильмы, которые начинались с буквы S. В этом случае цикл затем выйдет, когда он попадет в фильм, который начинается с буква "T".

if (title.substring(0, 1) == String.fromCharCode(nextChar)) 
    { 
     document.getElementById("results").innerHTML = output; 
     return false; 
    } 

Этот бит кода несет ответственность за это. Проблема заключалась в том, что, когда пользователь выбрал «S», цикл будет работать до тех пор, пока не ударит фильм, начинающийся с буквы «T». Было много фильмов, которые начинались с «The», например, «The Internship». Это приведет к преждевременному выходу цикла.

Чтобы это исправить, я изменил условие останова на:

 if (choice == 83)                 //If the user chose the letter "S", use this condition to break the loop instead. Special Case! 
     { 
      if ((title.substring(0, 5) == "The T")) 
      { 
       document.getElementById("results").innerHTML = output; 
       return false; 
      } 
     } 
     else if ((String.fromCharCode(nextChar) == title.substring(0, 1)) && (title.substring(0, 5) != "The " + String.fromCharCode(choice))) //Otherwise exit normally 
     { 
      document.getElementById("results").innerHTML = output; 
      return false; 
     } 

Это гарантировало, что цикл будет завершаться нормально во всех случаях, включая S.Если пользователь выбрал букву S, он выйдет, если и только если следующий фильм начинается с буквы T или «T», но не начинается с «The S».

Новый и полностью функциональный код выглядит нечто похожее на это (я вырезаны ненужные строки для опрятности и экономии пространства):

$(xml).find('movie').each(function()             //For each <Movie> tag, retrieve the following: 
    {           
     var title = $(this).find('title').text()           //Retreive Movie's Title 

     if ((choice == title.substring(0, 1).charCodeAt()) || (title.substring(0, 3) == "A " + String.fromCharCode(choice)))   //If the first letter of the movie starts with the user's chosen letter OR If the movie starts with A_ and the user's chosen letter 
     { 
      //Do stuff here 
     } 

     if ((title.substring(0, 5) == "The " + String.fromCharCode(choice)))    //If the movie starts with The_ and the user's chosen letter 
     { 
      //Otherwise, do stuff here 
     } 

     if (choice == 83)                 //If the user chose the letter "S", use this condition to break the loop instead. Special Case! 
     { 
      if ((title.substring(0, 5) == "The T")) 
      { 
       document.getElementById("results").innerHTML = output; 
       return false; 
      } 
     } 
     else if ((String.fromCharCode(nextChar) == title.substring(0, 1)) && (title.substring(0, 5) != "The " + String.fromCharCode(choice))) //Otherwise exit normally 
     { 
      document.getElementById("results").innerHTML = output; 
      return false; 
     } 
0

Попробуйте использовать choice == title.substring(0, 1).charCodeAt()

+0

Та же проблема все еще существует. Все буквы работают, кроме «S» и «P», – Alcolawl

Смежные вопросы