0

到目前为止,我主要使用 Python 工作,所以在 JavaScript 方面我是新手。现在我需要后者来实现一个表单。我有一些想法和要求,希望您告诉我如何开始以及使用哪些框架或工具。

我的要求是:

  1. 服务器端逻辑将在 Python 和 Django 中实现。
  2. 整个表单位于一个网页上。
  3. 网页的整体设计应该使用Twitter Bootstrap来完成。
  4. 加载页面后,仅显示表单的第一个字段。
  5. 填写此字段并正确验证后,在第一个字段下方显示表单的第二个字段
  6. 显示新字段时,如有必要,其网页应自动向下滚动,以便新字段在浏览器中居中。滚动应该发生一些漂亮的动画。
  7. 我的表单还包括一些ChoiceField类型的字段。每个选项都有自己的一组附加设置,这些设置也将作为表单字段实现。做出特定选择后,应仅显示相应的设置集,而不是同时显示所有选择字段的所有设置。(我可以用一个简单的if-else结构做到这一点吗?)
  8. 当所有字段都已显示、填写和验证并且表单已提交时,服务器会进行一些计算。一旦准备好,这些计算的结果应该显示在整个表单的下方。网页应再次自动向下滚动到结果。最好的办法是将网页向下滚动到表单不再可见但只显示结果的程度。所以这可能取决于当前打开的浏览器窗口的大小。

我知道这一切都是可能的,我也时不时看到过这样的形式,但目前还没有具体的例子。我也知道这一切都可以通过 JavaScript 实现。我可以使用 JQuery 实现以上所有功能还是需要其他工具?如果一位 JavaScript 专家能指导我解决我脑海中的这个混乱局面,那就太好了。先感谢您!

4

2 回答 2

3

让它起作用

在使用 javascript 做任何事情之前,请先制作一个正常的表单。即使用您想要的任何服务器端语言生成表单,并且当您提交表单时,它应该执行您希望它执行的操作。如果您有一个没有 javascript 的表单,那么您有信心在 js 中断时它总是可以工作。

让它更好地工作/渐进式增强

您的 js 似乎有 2 或 3 个要求 - 单独对待它们:

1. 表单应该一次只显示一个输入

例如,像这样的标记:

<form id="myForm" method="post">
    <legend>My Awesome Form</legend>
    <div class="question">
        <label for="x">X</label>
        <input name="x" id="x">
    </div>
    <div class="question">
        <label for="y">Y</label>
        <input name="y" id="y">
    </div>
    <div class="question">
        <label for="z">Z</label>
        <input name="z" id="z">
    </div>

    <div class="submit"><input type="submit" value="Submit"></div>
</form>

像这样使用一些js:

$('.question', '#myForm').not(':first-child').hide();
$('input', '#myForm').change() {
    var div, next;

    div  = $(this).parent();
    next = div.next();

    if ($(this).val() && next.length) {
        parent.hide();
        next.show();
    }
});

一次只显示一个问题 div,并在填充输入时显示下一个(如果有下一个)。

2. 验证用户输入

要验证用户输入,请创建一个为您执行此操作的函数,根据需要返回 true/false 并将其挂钩到您的 js 中,以便在输入值被视为无效时它不会继续:

validate(field, input) {
    var valid = false;

    // implement your logic here to validate input

    if (valid) {
        return true
    }
    return false;
}

$('input', '#myForm').change() {
    var div, next;

    if (!validate($('this').attr('name'), $(this).val()) {
        return;
    }

    div  = $(this).parent();
    next = div.next();

    if ($(this).val() && next.length) {
        parent.hide();
        next.show();
    }
});

如果当前输入的值无效,这将阻止用户进入下一个输入。

3.通过ajax提交表单

单击提交应该将表单数据发送到服务器,以(几乎)与正常提交表单相同的方式。唯一的区别应该是它使用您解析的 json 响应或您在页面末尾转储的 html 片段进行响应:

$('#myForm').submit(function(e) {
    e.preventDefault();

    $.ajax({
        type: "POST",
        url: $(this).attr('action'),
        data: $(this).serialize(),
        success: function(data, textStatus, jqXHR) {
            // handle success response
        },
        error: function(jqXHR, textStatus, errorThrown)) {
            // show the user an error
        }
    });
});

这里写的所有 js 都是未经测试的,它应该给你一些关于如何处理你想做的事情的各个方面的想法——当然,有关任何特定方法的更多信息,请参阅文档

于 2012-11-09T17:39:17.453 回答
2

所有这些都可以使用 jQuery 完成,您不需要任何额外的 JS 工具。

由于您有很多功能要构建,所以我不打算详细介绍。但是,我可以提供一些有关如何进行流程的每个步骤的见解。

1.) 那很好。

2.) 那也很好,您只需要一个 html 页面即可完成此操作。

3.) 我建议使用 HTML 创建的所有表单,CSS 为 display none。然后随着用户的进行,您可以使用.show()来“显示”隐藏的元素。

4.) 可能想要在表单之外有一个“下一步”按钮。使用.click()触发一个函数,该函数对输入表单字段的值进行所需的任何表单验证。您可以使用.next()循环浏览表单输入。

5.) 如果您想要浏览器滚动,请使用scrollTop或 jQuery ScrollTo 插件。如果您只是想在屏幕上移动东西而不是真正滚动,请使用.animate()

6.) 随着用户的进展,您必须即时设置值。所以使用.change()来进行检测。

7.) 在提交之前,再次在所有字段上运行您的验证器,以确保您拥有所有正确的数据。您需要使用.ajax()向您的服务发出请求,并防止在实际表单提交时出现默认设置。获取您从服务返回的响应并相应地格式化信息。

这应该让您深入了解如何完成您的项目。祝你好运!

于 2012-11-09T17:27:08.010 回答