Javascript 如何在网站中执行向导?

Javascript 如何在网站中执行向导?,javascript,http,browser,http-post,Javascript,Http,Browser,Http Post,在一个网站中,我想实现一个。它应该看起来像一系列形式 我的要求是: 用户应该能够使用前后浏览器按钮,而不会被提示重新提交表单(来回时) 如果用户在先前填写的页面上返回或前进,则字段应自动完成 如果用户在未完成前面步骤的情况下尝试访问某个页面,则应相应地重定向他(最后一个必需页面) 用户应该能够在离开和返回后恢复表单填写 在我的模型中,每一页都需要填写上一页。每个页面都有自己的验证 Url应该很漂亮 向导应该在没有javascript的情况下工作(但不是强制性的) 您将如何实施它?(一系列ht

在一个网站中,我想实现一个。它应该看起来像一系列形式

我的要求是:

  • 用户应该能够使用前后浏览器按钮,而不会被提示重新提交表单(来回时)
  • 如果用户在先前填写的页面上返回或前进,则字段应自动完成
  • 如果用户在未完成前面步骤的情况下尝试访问某个页面,则应相应地重定向他(最后一个必需页面)
  • 用户应该能够在离开和返回后恢复表单填写
  • 在我的模型中,每一页都需要填写上一页。每个页面都有自己的验证
  • Url应该很漂亮
  • 向导应该在没有javascript的情况下工作(但不是强制性的)
您将如何实施它?(一系列http post表单、http get表单、是否通过javascript提交?)


头像:

我计划在会话中存储每个信息,并在向导结束时将信息保存在数据库中并删除当前会话信息。通过这种方式,我可以自动完成字段,并知道用户在完成向导时的位置

我主要关注的是:

  • 如果我使用http posts表单实现,浏览器将提示重新提交每个表单(我不知道如何控制)
  • 如果我用HTTPGET表单实现它,URL中会充满信息,而且可能相当长。这不是GET请求的手段
  • 如果我通过javascript通过http post提交每个表单,将不会出现提示,但我的向导将无法使用javascript(可能一个解决方案是覆盖默认表单行为,使其可以使用和不使用javascript)

我将使用PHP会话变量在向导的不同页面之间存储填充的数据。通过使用html表单,如果返回浏览器历史记录,您将收到重新发送数据的提示,我不知道如何修复此问题。。。使用PHP存储变量很容易,使用
method=post
格式,并使用
$\u REQUEST
命令检索PHP文档中的信息,以避免使用
GET
的长URL。祝你好运,如果我想到任何东西,都会更新。

我不建议使用会话来存储任意数据!这会很快变得混乱,如果您最终使用会话进行登录验证,也会破坏安全模型。将auth与设置数据分开,创建一个专门用于设置的表,或者使用javascript localStorage

在您的例子中,您所描述的内容在我看来就像一个长表单,它具有多个表单部分的显示/隐藏功能,并添加了持久存储的怪癖

换句话说,不是
form1>form2>form3>form4>done

form\u section\u 1>验证、保存数据,然后显示form\u section\u 2和隐藏form\u section\u 1>验证、保存数据,然后显示form\u section\u 3和隐藏form\u section\u 2>等>真正的表单提交一次

对于没有javascript的用户,只需在提交任何部分后在php中验证所有部分的信息。如果您真的想将其存储在边缘案例中,则可以将其由会话id标识的信息存储到设置表中


为了简单起见,在这个场景中,我将使用localStorage存储每次验证时的所有数据,并使用javascript防止意外离开主窗体。如果您真的必须支持ie7(),从而使您的生活变得复杂,那么就检测localStorage,如果没有localStorage,则将数据传递给php脚本,然后将其放入单个数据容器对象中,并将其全部转换为json包,保存在会话中的单个变量中,甚至更好,在数据库的设置表中。

为什么不在一个表单中简单地使用jQuery选项卡(样式类似于多步骤向导过程)?@Kane这是个好主意。但它需要一些javascript来验证每个步骤(只提交相关字段),而无javascript回退将是一个巨大的形式。你能在公共网站上展示一个你喜欢的向导吗?@Colonel Panic显然这是最好的:还有,我将使用javascript验证表单,但如上所述将其存储在PHP中。我不建议使用会话进行任意数据存储!这会很快变得混乱,如果您最终使用会话进行登录验证,也会破坏安全模型。将身份验证与设置数据分开,并专门为设置创建一个表,或者使用localStorage!