【问题标题】:JS code not working as expectedJS 代码没有按预期工作
【发布时间】:2016-12-04 04:15:25
【问题描述】:

试图调试它,但它超出了我的范围。我正在为学校编写时间表,使用 jQuery 到 append() HTML 到由 Calendar Drupal module 生成的 td。

  • 有测试、调查和教训。
  • 每 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

更新:问题是 pMath1() 总是返回 "Inv 8" 而 pMath2 () 仍然未定义

更新 2:好的,可以使用此代码。特别感谢 XufoxRimon 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);
  });


});

【问题讨论】:

  • 到底是什么问题?
  • 为什么要在.each 循环中定义函数?你听说过可重用代码吗?
  • 我在您的逻辑中注意到的第一个缺陷:lesson 永远不会被更新。 lesson72 开头,并且可以pMath1pMath2 内增加1,条件是(至少)m10 返回false(对应于所有@ 987654336@ 检查)。但是,m10 只会在 lesson % 10 返回 0 时返回 false,而它永远不会返回(lesson % 102)。第二件事:m5 中的m10 == false 应该是m10() == false。你需要重新思考你的逻辑。
  • 尝试将代码标准引入您的工作并正确格式化您的代码。现在是一个巨大的混乱。我敢打赌你甚至都没有注意到,function m5() 中的m10 == false 是一个明显的错字,返回false 并使整个函数返回false.....

标签: javascript jquery debugging drupal-7


【解决方案1】:

好的,关于函数和return语句的基本情况是,如果你在函数中的任何一点调用return,那么在return语句之后该函数的任何代码都不会执行;

所以,对于 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");
  }
}

所以,如果你关注我的 cmets,你就会知道该怎么做,但是,我正在调整 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() 尝试同样的事情,因为它有同样的错误。玩得开心:)

【讨论】:

  • 这不是关于你在哪一行写了哪些代码,它更像是你正在使用哪个语句/运算符。数字向上移动 1 并不意味着变量值会减少。 inv 的初始值为 8,之后,您总是使用 inv++(它是用于将当前值加 1 的运算符),但是您没有在任何地方使用 inv——或者只是您没有在任何地方减去 inv 值,所以,有inv 的值没有理由小于 8,它总是 8 或更大。重点是,return 是函数的特殊运算符,用于在调用时停止执行代码
  • ++i 也不会减少值,i++ 和 ++i 之间存在细微差别,但两者的工作相同,这会增加值。如果要降低价值,则需要使用 i-- 或 --i 这些实际上是编程的基础。如果您必须继续使用这些东西,我建议您快速阅读 C 以了解编程基础知识。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-08-21
  • 2017-04-04
  • 2018-08-16
  • 2018-08-21
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多