【问题标题】:jQuery mobile multipage submitjQuery 移动多页提交
【发布时间】:2011-12-23 14:36:47
【问题描述】:

我正在使用 PhoneGap 和 jQuery Mobile 编写移动应用程序。为了简化导航,我想使用 div data-role="page" 将单个表单分布在多个“页面”上。这个想法是为用户提供一种类似向导的体验来填写大型表格。完成后,我需要能够在本地保存表单,或者在手机在线的情况下提交表单。

如果表单被拆分为多个“虚拟”页面,我不明白如何使用 jQuery Mobile 提交或保存表单。我在网上搜索过,但找不到任何解决此问题的教程或示例。

任何帮助将不胜感激。

更新:

我最近改变了使用多页表单的方式,这个解决方案对我来说效果很好。您基本上使用命名约定,其中字段通过以部分名称和破折号开头的 id 成为部分的一部分,例如:人名、人名。请参阅下面的答案。

【问题讨论】:

  • 我的建议是使用本地存储来保存 (davidwalsh.name/html5-storage),我认为您可以在多个页面上拥有一个表单并且仍然可以提交。我使用 Alpha 4 做了类似的事情,但是 jQM 已经从那个版本中改变了很多。只需开始测试并发布您尝试过的代码,以便我们提供更好的帮助
  • 说实话,我不知道从哪里开始。 jQuery Mobile 的多页面概念对我来说完全是个谜。实际上,您最终会得到一个分布在多个虚拟页面上的表单,但这似乎根本不对,我也无法让它工作。
  • 我添加了这个问题:PhoneGap and jQuery real world tutorial 我希望一个好的现实世界教程能够解决这个问题。
  • 您需要处理的主要问题是JQM 自动接管表单并通过Ajax 提交它们。您想为表单编写自己的处理程序并在将用户移动到下一页时存储数据。 Phill 关于使用本地存储的建议是有道理的。这个怎么样 - 今天早上我会写一篇关于它的博客文章。在 2-3 小时内寻找。
  • 实际上 - 如果您使用服务器端语言来管理用户所在的步骤 - 您可以完全不使用任何客户端 JS 代码。基本上页面加载表单 1,在提交时您的服务器端存储它并输出表单 2。由于 JQM 自动获取结果并在 DOM 中替换它,它可能只是工作。我也试试。

标签: forms jquery-mobile cordova


【解决方案1】:

为遇到相同问题的任何人提供快速帮助。我做了“形式的事情”,但它变得草率。您基本上只是将页面 div 嵌入到表单元素中,但这不是很优雅,并且给我带来了一些导航问题。

所以我最终得到了自己的解决方案,它适用于巨大的多页表单(+/- 1000 个元素)。不是最优雅的,但它就像一个魅力:

<!DOCTYPE html>

<head>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <meta charset="utf-8"/>
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" />
    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
    <script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"></script>
    <script>
        $(function () {
            $('#submit_my_form').click(function (e) {
                alert(JSON.stringify(readFormData('names')));
                alert(JSON.stringify(readFormData('dates')));
            });
        });

        function readFormData(section) {
            var sectionData;
            var els = $(':input[id|='+section+']');

            var sectionData = {};
            $.each(els, function() {
                if (this.name && !this.disabled && (this.checked
                    || /select|textarea/i.test(this.nodeName)
                    || /text|hidden|password|date|email/i.test(this.type))) {
                    sectionData[this.name.substr(section.length+1)] = $(this).val();
                    console.log(this.name + " -> " + $(this).val());
                }
            });
            return sectionData;
        }
    </script>
</head>

<body>
    <div data-role="page" id="menu" data-theme="a">
        <div data-role="header" data-position="fixed">
            <h1>Menu Page</h1>
        </div>
        <div data-role="content">
            <ul data-role="controlgroup">
                <li><a target_id="page1" href="#page1" data-role="button"
                       style="text-align:left" data-icon="arrow-r"
                       data-iconpos="right" class=".ui-icon-manditory">Page1</a></li>
                <li><a target_id="page2" href="#page2" data-role="button"
                       style="text-align:left" data-icon="arrow-r"
                       data-iconpos="right">Page2</a></li>
            </ul>
            <input id="submit_my_form" type="button" name="send" value="Submit"/>
        </div>
        <div data-role="footer" data-position="fixed" class="ui-btn-right" style="min-height:42px;">
            Menu page footer
        </div>
    </div>

    <div data-role="page" id="page1" data-theme="a">
        <div data-role="header" data-position="fixed">
            <a href="#menu" data-icon="arrow-l" data-direction="reverse">Prev</a>
            <h1>Page 1</h1>
            <a href="#page2" data-icon="arrow-r">Next</a>
        </div>
        <div data-role="content">
            <label for="names-initials">Name:</label>
            <input type="text" name="names-initials" id="names-initials" value=""/>
            <label for="names-surname">Surname:</label>
            <input type="text" name="names-surname" id="names-surname" value=""/>
        </div>
        <div data-role="footer" data-position="fixed" class="ui-btn-right" style="min-height:42px;">
        </div>
    </div>

    <div data-role="page" id="page2" data-theme="a">
        <div data-role="header" data-position="fixed">
            <a href="#page1" data-icon="arrow-l" data-direction="reverse">Prev</a>
            <h1>Page 2</h1>
        </div>
        <div data-role="content">
            <label for="dates-birthday">Birthday:</label>
            <input type="date" name="dates-birthday" id="dates-birthday" value=""/>
        </div>
        <div data-role="footer" data-position="fixed" class="ui-btn-right" style="min-height:42px;">
            <a href="#menu" data-icon="arrow-l" data-direction="reverse" data-iconpos="left"
               style="margin-left: 10px; margin-top: 5px">Back to Main From</a>
        </div>
    </div>
</body>
</html>

【讨论】:

    【解决方案2】:

    好的,我在这里发表了我的想法:http://www.coldfusionjedi.com/index.cfm/2011/11/18/Demo-of-a-multistep-form-in-jQuery-Mobile

    基本上我最终使用了一种服务器端语言来一次简单地包含表单的正确部分。 (我正在使用 ColdFusion,但任何语言都可以。)表单自我发布,并根据您在流程中的位置简单地显示正确的步骤。

    【讨论】:

    • 您的示例确实提供了一个很好的解决方法,谢谢。我仍然希望为真正的 jQuery 多页提交找到一个好的解决方案,在最终表单完成之前有效地避开服务器。
    • 您的教程显示了解决问题的好方法,非常感谢。确实做得很好,但遗憾的是没有回答问题,因为表格需要在本地填写,并且只有在完全完成后才能提交。我仍然希望找到一个依赖于使用 JQM 的多页功能的 jQuery Mobile 解决方案。在移动应用程序中,将服务器往返次数保持在最低限度通常是值得的,这对我来说非常重要。我仍在寻找解决方案,如果我在此期间得到它,我会发布它。
    • 让我看看是否可以根据您的要求重写它。应该不难。
    • 我一直在祈祷:-)
    • 好的,我搞定了。午饭后会写博客(大约 1.5 小时后)。你可以在这里看到演示:coldfusionjedi.com/demos/2011/nov/22/draft5
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多