2016-12-04 2 views
-1

Попытка отладить это, но это просто вне меня. Я программирую расписание для школы, используя jQuery для append() HTML для td, сгенерированных Calendar Drupal module.JS-код не работает как ожидалось

  • Имеются испытания, исследования и уроки.
  • Проверяйте каждые 5 уроков и расследование каждые 10.
  • В понедельник, среду и пятницу вы получаете две «вещи» (два урока, тест или расследование, урок и тест, или расследование, и урок)
  • Во вторник и в четверг вы получаете только один урок, испытание или расследование
  • Он не начинается с урока 1, теста 1 или inv 1, а на уроке 72, тесте 14 и исследовании 8.

Вот мой код:

jQuery(document).ready(function($) { 

    /* Schedule */ 

    last = "lesson"; 
    lesson = 71; 
    test = 13; 
    inv = 7; 

    function m10() { 
    if (lesson % 10 == 0) { 
     return true; 
    } else { 
     return false; 
    } 
    } 

    function m5() { 
    if (lesson % 5 == 0) { 
     return true; 
    } else { 
     return false; 
    } 
    } 

    function pMath1() { 
    if (m10() == false && last !== "test") { 

     lesson++; 
     last = "lesson"; 
     return "Lesson " + lesson; 

    } else if (m5() == true && last !== "test") { 

     test++; 
     last = "test"; 
     return "Test " + test; 

    } else if (m10() == true && last == "test") { 

     inv++; 
     last = "inv"; 
     return "Inv " + inv; 

    } else { 
     console.log("pMath1 doesn't work"); 
    } 
    } 


    function pMath2() { 
    if (m10() == false) { 

     lesson++; 
     last = "lesson"; 
     return "Lesson " + lesson; 

    } else if (m5() == true && last !== "test") { 

     test++; 
     last = "test"; 
     return "Test " + test; 

    } else if (m10() == true && last == "test") { 

     inv++; 
     last = "inv"; 
     return "Inv " + inv; 

    } else { 
     console.log("pMath2 doesn't work"); 
    } 
    } 

    $(".view-id-school .single-day td:gt(6)").each(function() { 

    var datePrep = $(this).attr("data-date"); 
    var dateSplit = datePrep.split("-"); 
    var dateStr = new Date(dateSplit[0], dateSplit[1], dateSplit[2]); 
    var dateStr2 = new Date(2016, 12, 03); 

    var classN = $(this).attr("headers"); 

    if (classN == "Monday" || classN == "Wednesday" || classN == "Friday") { 

     $(this).removeClass("no-entry"); 

     var mathC = "M: " + pMath1() + ", " + pMath2(); 

    } else if (classN == "Tuesday" || classN == "Thursday") { 

     $(this).removeClass("no-entry"); 

     var mathC = "M: " + pMath1(); 

    } else { 
     mathC = ""; 
    }; 

    content = mathC; 

    if (dateStr > dateStr2) { 
     $(this).find(".inner").empty().append('<div class="calendar monthview"><div class="views-field views-field-title"><span class="field-content">' + content + '</span></div><div class="cutoff" /></div></div></div>'); 
    } 
    }); 


}); 

JS Fiddle

Update: Проблема заключается в том, что pMath1() всегда возвращает "Inv 8" и pMath2() остается неопределенным

Update 2: Хорошо, получили его работы с этим кодом , Отдельное спасибо Xufox и Rimon Habib для всей вашей помощи:

jQuery(document).ready(function ($) { 

    /* Schedule */ 

    dateStr2 = new Date(2016, 12, 03); 

    last = "lesson"; 
    lesson = 71; //Lesson you want to start on minus 1 
    test = 13; //Test you want to start on minus 1 
    inv = 7; //Investigation you want to start on minus 1 

    function m10() { if (lesson % 10 == 0) { return true; } else { return false; } } 

    function m10M1() { if (((lesson % 10) - 1) == 0 && last == "inv") { return true; } else { return false; } } 

    function m5() { if (lesson % 5 == 0) { return true; } else { return false; } } 

    function pMath1() { 
    if (m10M1()) { //Check if Lesson is x1 (e.g. 81) and minus 1 from it 
     last = "lesson"; 
     return "Lesson " + lesson; 

    } else if (m10() == false && last !== "test") { //Add Lesson 

     lesson++; 
     last = "lesson"; 
     return "Lesson " + lesson; 

    } else if (m5() == true && last !== "test") { //Add Test 

     test++; 
     last = "test"; 
     return "Test " + test; 

    } else if (m10() == true && last == "test") { //Add Inv 

     inv++; 
     lesson++; 
     last = "inv"; 
     return "Inv " + inv; 

    } else { 
     console.log("pMath1 doesn't work"); 
    } 
    } 


    function pMath2() { 
    if (m10M1()) { //Check if Lesson is x1 (e.g. 81) and minus 1 from it 

     last = "lesson"; 
     return "Lesson " + lesson; 

    }else if (m10() == false) { //Add Lesson 

     lesson++; 
     last = "lesson"; 
     return "Lesson " + lesson; 

    } else if (m5() == true && last !== "test") { //Add Test 

     test++; 
     last = "test"; 
     return "Test " + test; 

    } else if (m10() == true && last == "test") { //Add Inv 

     inv++; 
     lesson++; 
     last = "inv"; 
     return "Inv " + inv; 

    } else { 
     console.log("pMath2 doesn't work"); 
    } 
    } 

    $(".view-id-school .single-day td:gt(6)").each(function() { 

    var datePrep = $(this).attr("data-date"); 
    var dateSplit = datePrep.split("-"); 
    var dateStr = new Date(dateSplit[0], dateSplit[1], dateSplit[2]); 

    var classN = $(this).attr("headers"); 

    if (classN == "Monday" || classN == "Wednesday" || classN == "Friday") { 

     $(this).removeClass("no-entry"); 

     var mathC = "M: " + pMath1() + ", " + pMath2(); 

    } else if (classN == "Tuesday" || classN == "Thursday") { 

     $(this).removeClass("no-entry"); 

     var mathC = "M: " + pMath1(); 

    } else { 
     mathC = ""; 
    }; 

    content = mathC; 

    if (dateStr > dateStr2) { 
     $(this).find(".inner").empty().append('<div class="calendar monthview"><div class="views-field views-field-title"><span class="field-content">' + content + '</span></div><div class="cutoff" /></div></div></div>'); 
    } 

    console.log("Last: " + last + " <br /> Lesson: " + lesson + " <br /> inv: " + inv + " <br /> test: " + test + " <br /> " + "Content: " + content); 
    }); 


}); 
+0

В чем же проблема? – Xufox

+0

Почему вы определяете функции внутри цикла '.each'? Вы когда-нибудь слышали о многократном использовании кода? –

+2

Первый недостаток, который я заметил в вашей логике: «Урок» никогда не будет обновляться. 'lesson' начинается с' 72' и _could_ увеличивается на 1 в 'pMath1' и' pMath2' при условии, что (по крайней мере) 'm10' возвращает' false' (соответствует всем 'm10() == false' чеки). Однако 'm10' вернет' false', если 'lesson% 10' возвращает' 0', чего он никогда не делает ('урок% 10' равен' 2'). Второе: 'm10 == false' в' m5' должно быть 'm10() == false'. Вам нужно переосмыслить свою логику. – Xufox

ответ

1

Окей, Основная вещь о функциях и оператор возврата, если вы звоните возвращение в любой точке функции, любой код остается этой функции после возвращения оператор не собирается выполнять;

Итак, для функции pMath1 начальное значение inv = 8;

и если вы обратите внимание на функцию pMath1(),

function pMath1() { 

    if (m10() == false && m5() == false && last !== test) { 

    return "Lesson " + lesson; // code execution stops here as return called 
    lesson++; // lesson value is not gonna increment 
    last = "lesson"; // neither last value will update 

    } else if (m10() == false && m5() == true) { 

    return "Test " + test; // again, code execution stops here 
    test++; // test value will not increment 
    last = "test"; // neither this will be executed 

    } else if (m10() == true) { 

    return "Inv " + inv; // and here is our inv variable, it was 8, we are returning 8, not giving chance inv to increase as stated line below 
    inv++; 
    last = "inv"; 

    } else { 
    console.log("pMath1 doesn't work"); 
    } 
} 

так, если вы будете следовать моим комментариям, вы получите представление, что делать, однако, я регулируя pMath1(),

function pMath1() { 

    if (m10() == false && m5() == false && last !== test) { 

    lesson++; // now lesson value will increase 
    last = "lesson"; // and this one will also execute 

    return "Lesson " + lesson; // and when we are done, we can return and halt execution here; by this time our variables are processed. 

    } else if (m10() == false && m5() == true) { 


    test++; 
    last = "test"; 

    return "Test " + test; // same approach again 


    } else if (m10() == true) { 

    inv++; 
    last = "inv"; 

    return "Inv " + inv; // and here is our holy grail, we gave chance inv to increase first, now we are returning its incremented value. it will be no longer stick with 8. 

    } else { 
    console.log("pMath1 doesn't work"); 
    } 
} 

Хорошо, теперь наша переменная inv должна не совпадать с 8, так как мы знаем, как использовать return, вы можете попробовать одно и то же в pMath2(), поскольку она имеет ту же ошибку. получайте удовольствие от этого :)

+0

Его не касается в какой строке вы пишете код, более похожий, какой оператор/оператор вы используете.число перемещается 1 строка вверх не означает, что значение переменной будет уменьшаться. начальное значение для inv было 8, и после этого вы всегда использовали inv ++ (который является оператором для добавления 1 с текущим значением), но вы не использовали нигде inv- или просто вы не вычитали значение inv в любом месте, поэтому существует нет причины, что значение inv будет меньше 8, оно будет либо 8, либо более. вся точка is, return - специальный оператор для функций, который используется для прекращения выполнения кода, когда его вызванный –

+0

++ i тоже не уменьшит значение, существует небольшая разница между i ++ и ++ i, но обе делают ту же работу, что увеличивает значение. если вы хотите уменьшить значение, вам нужно использовать i-- или --i Это на самом деле основы программирования. Я бы порекомендовал немного быстро прочитать C, чтобы знать основы программирования, если вам нужно продолжать работу с этими вещами. Спасибо. –

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