0

遇到一个可能有点难以解释的问题,所以我会尽力而为。我一直在尝试创建一个简单的 JavaScript 待办事项应用程序。我在页面上有多个表格,它们都对应一个单独的日期(1 月 1 日、1 月 2 日等)。当然,每个表单都有输入,在这种情况下,每个表单都有 4 个子节点(内容、位置、时间和提交按钮)。

这是HTML:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <meta description="Gallery, Javascript">
        <link rel="stylesheet" href="todo.css" media="screen" />
        <title>Creating a simple to-do app</title>
    </head>
    <body>
        <div id="outerWrapper">
        <div id="wrapper">
            <header id="header">
                <h1>A simple to-do app</h1>
            </header>
            <section id="todo">
                <div class="oneDateSection">
                    <div class="orangeBox">
                        <h1>January 1st, 2013</h1>
                    </div>
                    <div class="oneDateSectionList">
                        <form method="POST" class="formList" action="">
                            <div><label for="what">What:</label><input type="text" name="what" class="what" id="what" /></div>
                            <div><label for="where">Where:</label><input type="text" name="where" class="where" id="where" /></div>
                            <div><label for="what">When:</label><input type="text" name="when" class="when" id="when"/></div>
                            <div><input type="submit" value="Add!" name="submit" class="submit" /></div>
                        </form>
                    </div>
                </div>
                <div class="oneDateSection">
                    <div class="orangeBox">
                        <h1>January 2nd, 2013</h1>
                    </div>
                    <div class="oneDateSectionList">
                        <form method="POST" class="formList" action="">
                            <div><label for="what">What:</label><input type="text" name="what" class="what" id="what" /></div>
                            <div><label for="where">Where:</label><input type="text" name="where" class="where" id="where" /></div>
                            <div><label for="what">When:</label><input type="text" name="when" class="when" id="when"/></div>
                            <div><input type="submit" value="Add!" name="submit" class="submit" /></div>
                        </form>
                    </div>
                </div>
                <div class="oneDateSection">
                    <div class="orangeBox">
                        <h1>January 3rd, 2013</h1>
                    </div>
                    <div class="oneDateSectionList">
                        <form method="POST" class="formList" action="">
                            <div><label for="what">What:</label><input type="text" name="what" class="what" id="what" /></div>
                            <div><label for="where">Where:</label><input type="text" name="where" class="where" id="where" /></div>
                            <div><label for="what">When:</label><input type="text" name="when" class="when" id="when"/></div>
                            <div><input type="submit" value="Add!" name="submit" class="submit" /></div>
                        </form>
                    </div>
                </div>
                <div class="oneDateSection">
                    <div class="orangeBox">
                        <h1>January 4th, 2013</h1>
                    </div>
                    <div class="oneDateSectionList">
                        <form method="POST" class="formList" action="">
                            <div><label for="what">What:</label><input type="text" name="what" class="what" id="what" /></div>
                            <div><label for="where">Where:</label><input type="text" name="where" class="where" id="where" /></div>
                            <div><label for="what">When:</label><input type="text" name="when" class="when" id="when"/></div>
                            <div><input type="submit" value="Add!" name="submit" class="submit" /></div>
                        </form>
                    </div>
                </div>
                <div class="oneDateSection">
                    <div class="orangeBox">
                        <h1>January 5th, 2013</h1>
                    </div>
                    <div class="oneDateSectionList">
                        <form method="POST" class="formList" action="">
                            <div><label for="what">What:</label><input type="text" name="what" class="what" id="what" /></div>
                            <div><label for="where">Where:</label><input type="text" name="where" class="where" id="where" /></div>
                            <div><label for="what">When:</label><input type="text" name="when" class="when" id="when"/></div>
                            <div><input type="submit" value="Add!" name="submit" class="submit" /></div>
                        </form>
                    </div>
                </div>
                <div class="oneDateSection">
                    <div class="orangeBox">
                        <h1>January 6th, 2013</h1>
                    </div>
                    <div class="oneDateSectionList">
                        <form method="POST" class="formList" action="">
                            <div><label for="what">What:</label><input type="text" name="what" class="what" id="what" /></div>
                            <div><label for="where">Where:</label><input type="text" name="where" class="where" id="where" /></div>
                            <div><label for="what">When:</label><input type="text" name="when" class="when" id="when"/></div>
                            <div><input type="submit" value="Add!" name="submit" class="submit" /></div>
                        </form>
                    </div>
                </div>
                <div class="oneDateSection">
                    <div class="orangeBox">
                        <h1>January 7th, 2013</h1>
                    </div>
                    <div class="oneDateSectionList">
                        <form method="POST" class="formList" action="">
                            <div><label for="what">What:</label><input type="text" name="what" class="what" id="what" /></div>
                            <div><label for="where">Where:</label><input type="text" name="where" class="where" id="where" /></div>
                            <div><label for="what">When:</label><input type="text" name="when" class="when" id="when"/></div>
                            <div><input type="submit" value="Add!" name="submit" class="submit" /></div>
                        </form>
                    </div>
                </div>
            </section>
        </div>
    </div>
    <script src="todo2.js"></script>
    </body>
</html>

这是JavaScript:

var utilities = {
    $: function(id) {
            return document.getElementById(id);
    },
    addEvent: function(obj, type, fn) {
        if (obj && obj.addEventListener) {
            obj.addEventListener(type, fn, false);
        } else if (obj && obj.attachEvent) {
            obj.attachEvent("on" + type, fn);
        }
    }
}

function removeErrorMessage(id) {
    'use strict';
    var span = utilities.$(id + 'Error');
    if(span) {
        span.parentNode.removeChild(span);
    }
}


function addErrorMessage(id, msg) {
    'use strict';
    var elem = utilities.$(ID);
    var newID = id + "Error";
    var span = utilities.$(newID);

    if(span) {
        span.firstChild.value = msg;
    } else {
        span = document.createElement("span");
        span.setAttribute("class", "error");
        span.setAttribute("id", newID);
        span.appendChild(document.createTextNode(msg));
        elem.parentNode.appendChild(span);
    }
}


function storeInformation(e) {
    'use strict';
    if (e == "undefined") {
        e = window.event;
    }

    //Reference what, where and when input elements in form that calls this function
    var whatElements = this.getElementsByClassName("what");
    var whereElements = this.getElementsByClassName("where");
    var whenElements = this.getElementsByClassName("when");

    //Create object to store information
    var information = {
        what: whatElements[0].value,
        where: whereElements[0].value,
        when: whenElements[0].value,
        postedDate: new Date()
    }
    //Create HTML that will display information from form
    var output =    "What: " + information.what + "<br />" + 
                    "Where: " + information.where + "<br />" + 
                    "When: " + information.when + "<br />" +
                    "Posted: " + information.postedDate;

    //So you have TWO options. Either you have filled it out, or you haven't.

    //First case, and main IF: Some part of the form hasn't been filled out
    if ( (information.what == "") || (information.where == "") || (information.when == "") ) {

        //If the 'what' form field is empty
        if (information.what == "") {
            addErrorMessage(this.what, "Please enter what!");
        } else {
            removeErrorMessage(this.getElementById("what"));
        }

        //If the 'where' form field is empty
        if(information.where == "") {
            addErrorMessage(this.where, "Please enter where!");
        } else {
            removeErrorMessage(this.getElementById("where"));
        }

        //If the 'when' form field is empty
        if(information.when == "") {
            addErrorMessage(this.when, "Please enter when!");
        } else {
            removeErrorMessage(this.getElementById("when"));
        }

    //OR, all the form fields HAVE BEEN FILLED OUT.
    } else {
        if (paragraph) {
            paragraph.innerHTML = output;
        } else {    
            var newDiv = document.createElement("div");
            newDiv.setAttribute("class", "outputDiv");
            var paragraph = document.createElement("p");
            paragraph.setAttribute("class", "outputParagraph");
            newDiv.appendChild(paragraph);
            paragraph.innerHTML = output;
            //Append everything
            whatElements[0].parentNode.parentNode.appendChild(newDiv);
        }
    }

    //Prevent form from submitting
    if (e.preventDefault) {
        e.preventDefault();
    } else {
        e.returnValue = false;
    }
    return false;
}

window.onload = function() {
    'use strict';
    var allForms = document.getElementsByClassName("formList");
    for (var i = 0, count = allForms.length; i < count; i++) {
        utilities.addEvent(allForms[i], "submit", storeInformation);
    }
}

现在,我确定可能存在布局问题,并且这里的 JS 不正确(如果您能指出这一点,那将是一个奖励)。但是,我的问题是this关键字。在 JS 中,我使用 this.what、this.where 和 this.when 来引用表单的输入 ID。我使用“this”是因为页面上有多个表单,我提供了一个事件侦听器,因此,在实际使用中,无论最终用户使用什么表单,它都会存储正确的信息。

问题出在我的“addErrorMessage”函数中,据说“elem”为空。在使用 Chrome 的调试器逐步完成该过程后,作为参数传递给 addErrorMessage 的 ID 仍然引用表单,但由于某种原因没有存储在 elem 中。

例如,我在想“this.what”不能转移到另一个函数?即,引用其自身属性的表单不能在另一个函数中使用?我不确定问题是什么。Chrome 会正确告诉我“this.what”引用的值,并传递给“addErrorMessage”,但不会尝试将此信息存储在“elem”中。

任何人都可以帮忙吗?我现在不是一个 JS 人,所以请对我放轻松。为长长的问题道歉!

干杯。

4

1 回答 1

0
var elem = utilities.$(ID);

应该

var elem = utilities.$(id);
于 2013-02-22T09:12:02.553 回答