首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript上的DOM操作实践-请帮助

JavaScript上的DOM操作实践-请帮助
EN

Stack Overflow用户
提问于 2018-10-07 13:32:35
回答 1查看 99关注 0票数 0

我目前正在自学JavaScript,并尝试使用一个简单的调度器应用程序练习DOM操作,该应用程序接受表单中的信息(接受日期、名称和事件描述),然后将表单响应插入到与日期对应的日历中。

我基本上使用了一个for循环来遍历整个日历,以找到与表单中选择的日期相对应的日期,如果该日期相等,则输入值将位于该日期下。

(为了简单起见,我们暂时假设日历只能包含2018年10月的日期。)

非常感谢你的帮助!

const dateInput = document.getElementById('date');
const nameInput = document.getElementById('who');
const remarksInput = document.getElementById('remarks');
const eventAdderButton = document.getElementById('event-adder-button');
const calendar = document.getElementsByClassName('days');

eventAdderButton.addEventListener('click', () => {
  const date = dateInput.value.slice(3,5);
  for (let i = 0; i < calendar.length; i += 1) {
    const calendardays = calendar[i].getElementsByTagName('td');

    for (let j = 0; j < calendardays.length; j += 1) {
      if (calendardays[j].textContent == date) {
        const newEvent = document.createElement('p');
        newEvent.textContent = remarksInput.value + nameInput.value;
        calendardays[j].innerHTML = "<p>" + calendardays[j] + "</p>" + newEvent.innerHTML;
      }
    }
  }
})
body {
  text-align: center;
  box-sizing: border-box;
}

h2 {
  color: inherit;
}

.intro-wrapper {
  background-color: #45d1a0;
  padding: 10px;
  margin: 10px 10px;
}



#intro {
  background-color: #45d1a0;
  color: white;
  font-family: "Chelsea Market";
  border-style: double;
  border-color: white;
  border-width: thick;
  padding: 10px;
  margin: 10px 10px;

}


.form-wrapper {
  background-color: #d15545;
  font-family: "Chelsea Market";
  padding: 10px;
  margin: 10px 10px;
}

.form-start {
  color: white;
  border-style: double;
  border-color: white;
  border-width: thick;
  padding: 10px;
  margin: 10px 10px;
}

label, #event-adder-button {
  margin-top: 20px;
}


#date, #who, #remarks {
  margin: 0 auto;
  text-align: center;
  width: 300px;
}

.calendar-wrapper {
  background-color: #03f;
  color: white;
  font-family: "Chelsea Market";
  padding: 10px;
  margin: 10px 10px;
}

ul {list-style-type: none;}

/* Month header */
.month {
    padding: 25px 25px;
    background: #1abc9c;
    text-align: center;
}

/* Month list */
.month ul {
    margin: 0;
    padding: 0;
}

.month ul li {
    color: white;
    font-size: 20px;
    text-transform: uppercase;
    letter-spacing: 3px;
}

/* Previous button inside month header */
.month .prev {
    float: left;
    padding-top: 10px;
}

/* Next button */
.month .next {
    float: right;
    padding-top: 10px;
}

/* calendar table */

.calendar-table {
  width: 100%;
}


/* Weekdays (Mon-Sun) */
.weekdays {
    margin: 0;
    padding: 10px 0;
    background-color:#ddd;
    width: 100%;
}

.weekdays th {
    width: 10%;
    color: #666;
    text-align: center;
    border: solid;
}

/* Days (1-31) */
.days {
    padding: 10px 0;
    background: #eee;
    margin: 0;
}

.days td {
    width: 10%;
    height: 100px;
    margin-bottom: 5px;
    padding-top: 5px;
    font-size:12px;
    color: #777;
    border: solid;
    text-align: left;
    vertical-align: top;

}

/* Highlight the "current" day */
.days td .active {
    padding: 3px;
    background: #1abc9c;
    color: white !important
}
<!DOCTYPE HTML>
<html>

  <head>
    <title>My Calendar Application</title>
    <link href='http://fonts.googleapis.com/css?family=Chelsea+Market' rel='stylesheet' type='text/css'>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link rel="stylesheet" href="styles.css" />
  </head>

  <body>

    <!-- Banner -->
    <div class="intro-wrapper">
      <section id="intro">
        <p></p>

        <h2>Manage your Schedule</h2>
        <p>Add. Share. And Enjoy!</p>
      </section>
    </div>

    <div class="form-wrapper">
      <section id="one">
        <div class="form-start">
          <header>
            <h2>Add an Event</h2>
          </header>
          <form method="post" action="#">
            <div>
              <label for="date">Date</label>
              <br>
              <input name="date" id="date" type="date">
            </div>
            <br>
            <div>
              <label for="who">With Whom?</label>
              <br>
              <input name="who" id="who" type="text">
            </div>
            <br>
            <div>
              <label for="remarks">Remarks</label>
              <br>
              <textarea name="remarks" id="remarks" rows="4"></textarea>
            </div>
            <input value="Add Event" type="submit" id="event-adder-button"></li>
          </form>
        </div>
      </section>
    </div>

    <!--end of Form-->

    <!-- Calendar -->
    <section class="calendar-wrapper">
      <div class="inner">
        <h2>Calendar</h2>
      </div>
      <div class="month">
        <ul>
          <li class="prev">&#10094;</li>
          <li class="next">&#10095;</li>
          <li>October<br><span style="font-size:18px">2018</span></li>
        </ul>
      </div>
      <div>
        <table class="calendar-table">
          <tr class="weekdays">
            <th>Mo</th>
            <th>Tu</th>
            <th>We</th>
            <th>Th</th>
            <th>Fr</th>
            <th>Sa</th>
            <th>Su</th>
          </tr>
          <tr class="days">
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
            <td>5</td>
            <td>6</td>
            <td>7</td>
          </tr>
          <tr class="days">
            <td>8</td>
            <td>9</td>
            <td><span class="active">10</span></td>>
            <td>11</td>
            <td>12</td>
            <td>13</td>
            <td>14</td>
          </tr>

          <tr class="days">
            <td>15</td>
            <td>16</td>
            <td>17</td>
            <td>18</td>
            <td>19</td>
            <td>20</td>
            <td>21</td>
          </tr>
          <tr class="days">
            <td>22</td>
            <td>23</td>
            <td>24</td>
            <td>25</td>
            <td>26</td>
            <td>27</td>
            <td>28</td>
          </tr>
          <tr class="days">
            <td>29</td>
            <td>30</td>
            <td>31</td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
          </tr>
        </table>
      </div>
    </section>


    <script src="app.js"></script>

  </body>

</html>

EN

回答 1

Stack Overflow用户

发布于 2018-10-08 06:56:34

你的代码中有几个问题:

  1. 如果您没有停止表单提交,这会导致页面重置(包括表单),则需要对表单提交事件使用preventDefault()。
  2. 您没有正确比较日期的html元素和日期字符串,拆分函数未按预期工作,应将其更改为date.value.split('-') to get an array withyyyy-mm-dd`格式。
  3. 由于天作为dd格式字符串传递,所有小于10天的==比较都将失败(例如:02 == 2 === false),使用parseInt()
  4. After解决了上述问题,您将把新数据添加到每天的表中,这会导致使用新添加的元素修改textContent,因此所有进一步的比较都将失败。(例如:与谁?“我”,备注?‘on’,日期: 10/02/2018,在该表元素上生成了textContent的2meOkay

下面我提供了一个功能强大的html页面,您可以查看该页面以获取更多细节:

剥离css可能会更干净,但这最适合于复制测试场景。

<!DOCTYPE HTML>
<html>

<head>
    <title>My Calendar Application</title>
    <link href='http://fonts.googleapis.com/css?family=Chelsea+Market' rel='stylesheet' type='text/css'>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style>
        body {
            text-align: center;
            box-sizing: border-box;
        }

        h2 {
            color: inherit;
        }

        .intro-wrapper {
            background-color: #45d1a0;
            padding: 10px;
            margin: 10px 10px;
        }



        #intro {
            background-color: #45d1a0;
            color: white;
            font-family: "Chelsea Market";
            border-style: double;
            border-color: white;
            border-width: thick;
            padding: 10px;
            margin: 10px 10px;

        }


        .form-wrapper {
            background-color: #d15545;
            font-family: "Chelsea Market";
            padding: 10px;
            margin: 10px 10px;
        }

        .form-start {
            color: white;
            border-style: double;
            border-color: white;
            border-width: thick;
            padding: 10px;
            margin: 10px 10px;
        }

        label,
        #event-adder-button {
            margin-top: 20px;
        }


        #date,
        #who,
        #remarks {
            margin: 0 auto;
            text-align: center;
            width: 300px;
        }

        .calendar-wrapper {
            background-color: #03f;
            color: white;
            font-family: "Chelsea Market";
            padding: 10px;
            margin: 10px 10px;
        }

        ul {
            list-style-type: none;
        }

        /* Month header */

        .month {
            padding: 25px 25px;
            background: #1abc9c;
            text-align: center;
        }

        /* Month list */

        .month ul {
            margin: 0;
            padding: 0;
        }

        .month ul li {
            color: white;
            font-size: 20px;
            text-transform: uppercase;
            letter-spacing: 3px;
        }

        /* Previous button inside month header */

        .month .prev {
            float: left;
            padding-top: 10px;
        }

        /* Next button */

        .month .next {
            float: right;
            padding-top: 10px;
        }

        /* calendar table */

        .calendar-table {
            width: 100%;
        }


        /* Weekdays (Mon-Sun) */

        .weekdays {
            margin: 0;
            padding: 10px 0;
            background-color: #ddd;
            width: 100%;
        }

        .weekdays th {
            width: 10%;
            color: #666;
            text-align: center;
            border: solid;
        }

        /* Days (1-31) */

        .days {
            padding: 10px 0;
            background: #eee;
            margin: 0;
        }

        .days td {
            width: 10%;
            height: 100px;
            margin-bottom: 5px;
            padding-top: 5px;
            font-size: 12px;
            color: #777;
            border: solid;
            text-align: left;
            vertical-align: top;

        }

        /* Highlight the "current" day */

        .days td .active {
            padding: 3px;
            background: #1abc9c;
            color: white !important
        }
    </style>
</head>

<body>

    <!-- Banner -->
    <div class="intro-wrapper">
        <section id="intro">
            <p></p>

            <h2>Manage your Schedule</h2>
            <p>Add. Share. And Enjoy!</p>
        </section>
    </div>

    <div class="form-wrapper">
        <section id="one">
            <div class="form-start">
                <header>
                    <h2>Add an Event</h2>
                </header>
                <form method="post" id="form">
                    <div>
                        <label for="date">Date</label>
                        <br>
                        <input name="date" id="date" type="date">
                    </div>
                    <br>
                    <div>
                        <label for="who">With Whom?</label>
                        <br>
                        <input name="who" id="who" type="text">
                    </div>
                    <br>
                    <div>
                        <label for="remarks">Remarks</label>
                        <br>
                        <textarea name="remarks" id="remarks" rows="4"></textarea>
                    </div>
                    <input value="Add Event" type="submit" id="event-adder-button">
                    </li>
                </form>
            </div>
        </section>
    </div>

    <!--end of Form-->

    <!-- Calendar -->
    <section class="calendar-wrapper">
        <div class="inner">
            <h2>Calendar</h2>
        </div>
        <div class="month">
            <ul>
                <li class="prev">&#10094;</li>
                <li class="next">&#10095;</li>
                <li>October
                    <br>
                    <span style="font-size:18px">2018</span>
                </li>
            </ul>
        </div>
        <div>
            <table class="calendar-table">
                <tr class="weekdays">
                    <th>Mo</th>
                    <th>Tu</th>
                    <th>We</th>
                    <th>Th</th>
                    <th>Fr</th>
                    <th>Sa</th>
                    <th>Su</th>
                </tr>
                <tr class="days">
                    <td><span class="dayNumber">1</span></td>
                    <td><span class="dayNumber">2</span></td>
                    <td><span class="dayNumber">3</span></td>
                    <td><span class="dayNumber">4</span></td>
                    <td><span class="dayNumber">5</span></td>
                    <td><span class="dayNumber">6</span></td>
                    <td><span class="dayNumber">7</span></td>
                </tr>
                <tr class="days">
                    <td><span class="dayNumber">8</span></td>
                    <td><span class="dayNumber">9</span></td>
                    <td><span class="dayNumber active">
                        10
                    </span></td>
                    <td><span class="dayNumber">11</span></td>
                    <td><span class="dayNumber">12</span></td>
                    <td><span class="dayNumber">13</span></td>
                    <td><span class="dayNumber">14</span></td>
                </tr>

                <tr class="days">
                    <td><span class="dayNumber">15</span></td>
                    <td><span class="dayNumber">16</span></td>
                    <td><span class="dayNumber">17</span></td>
                    <td><span class="dayNumber">18</span></td>
                    <td><span class="dayNumber">19</span></td>
                    <td><span class="dayNumber">20</span></td>
                    <td><span class="dayNumber">21</span></td>
                </tr>
                <tr class="days">
                    <td><span class="dayNumber">22</span></td>
                    <td><span class="dayNumber">23</span></td>
                    <td><span class="dayNumber">24</span></td>
                    <td><span class="dayNumber">25</span></td>
                    <td><span class="dayNumber">26</span></td>
                    <td><span class="dayNumber">27</span></td>
                    <td><span class="dayNumber">28</span></td>
                </tr>
                <tr class="days">
                    <td><span class="dayNumber">29</span></td>
                    <td><span class="dayNumber">30</span></td>
                    <td><span class="dayNumber">31</span></td>
                    <td><span class="dayNumber"></span></td>
                    <td><span class="dayNumber"></span></td>
                    <td><span class="dayNumber"></span></td>
                    <td><span class="dayNumber"></span></td>
                </tr>
            </table>
        </div>
    </section>

    <script>
        const dateInput = document.getElementById('date');
        const nameInput = document.getElementById('who');
        const remarksInput = document.getElementById('remarks');
        const eventAdderButton = document.getElementById('event-adder-button');
        const calendar = document.getElementsByClassName('days');

        eventAdderButton.addEventListener('click', () => {
            const date = dateInput.value.split('-'); // Split date string
            // Parse as string so == works for string to number;
            const year = parseInt(date[0]);
            const month = parseInt(date[1]);
            const day = parseInt(date[2]);
            console.log('Adder clicked: ', date);
            console.log('Adder day: ', day);
            console.log('Calendar Days: ', calendar);
            for (let i = 0; i < calendar.length; i++) {
                const calendardays = calendar[i].getElementsByTagName('td');
                for (let j = 0; j < calendardays.length; j++) {
                    const dayNumber = calendardays[j].getElementsByClassName('dayNumber'); 
                    // DayNumber is an array with single element from span.dayNumber, 
                    // >  this keeps the day comparison easy and consistent.
                    if (dayNumber[0].textContent == day) {
                        const newEvent = document.createElement('p');
                        newEvent.textContent = `${remarksInput.value}:  ${nameInput.value}`;
                        // > Changed the below line, kept it as reference.
                        // calendardays[j].innerHTML = "<p>" + calendardays[j] + "</p>" + newEvent.innerHTML;
                        calendardays[j].appendChild(newEvent);
                    }
                }
            }
        })

        const form = document.getElementById("form");
        form.addEventListener("submit", formSubmitted, true);
        // Prevent the form from submitting!
        function formSubmitted(e) {
            console.log('formSubmitted! ', e);
            e.preventDefault()
        }
    </script>
</body>

</html>

Result将事件添加到日历

备注:很抱歉没有发布代码片段,现在还不能这样做...:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52685732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档