如果我有一个使用iframe的jQuery colorbox(),并且其中有一个<form>(例如登录表单),则:


如果提交表单失败(例如,必填字段为空),则应重新显示该表单,并在iframe中显示错误
如果表单成功(例如密码正确),则应重新加载结果周围的页面


只有服务器请求才能知道提交是否成功(例如,登录表单的密码正确),因此不能使用target=标记上的<form>参数。 (必须在请求页面上进行设置,而响应的成功程度尚不清楚。)

如何实现这一目标?现在,我执行以下操作:


<form>没有特定的“目标”,即结果显示在iframe中
如果表单提交失败,请在iframe中重新显示表单(简单情况)
如果表单提交成功,则在iframe中显示一个包含Javascript的“响应”页面以刷新整个页面。


Javascript如下所示(wicket:id="link"表示Web框架将href=添加到链接,以指定应在整个浏览器窗口中显示的结果页面)。

<a wicket:id="link" id="linkToSuccessPage" target="_top"></a>
<script>
  $(function() {
    top.$.colorbox.close();
    top.location.href =
      document.getElementById("linkToSuccessPage").getAttribute("href");
  });
</script>


这种方法的麻烦之处在于,首先感觉不雅,但是却产生了奇怪的视觉效果。颜色框首先关闭,然后重定向发生。另一个选项不是关闭颜色框,而是在重定向发生时,颜色框的内容被空白页替换。

还有更好的方法吗?这一定是一个普遍的问题,必须有一个共同的优雅的解决方案吗?

附言由于以下原因,我必须使用颜色框的iframe方法(而不是使用JQuery将该表单放在页面的<div>中):我正在使用的Web框架(Wicket)将表单提交到相对URL 。 <form>中的相对URL相对于包含表单(=颜色框内容)的页面的URL。如果使用<div>,则会将此表单插入具有不同URL的周围页面,因此表单提交中的相对URL不起作用。

最佳答案

我认为您仍然可以在不使用iframe的情况下执行此操作,这将使您可以将内联内容用于色箱窗口。尽管此建议可以适用于iframe,但使用内联内容时它要干净得多。

首先,使用this jQuery ajax form plugin管理表单提交流程。这样,您就可以管理成功/错误代码,而无需加载任何其他内容(如前所述)来刷新页面或重新加载表单。在您的docReady中,实例化ajax表单,如下所示:

$('#login').ajaxForm({
    beforeSubmit: onSubmitForm,
    error: onServerResponse,
    success: onServerResponse,
    url: "site.com"
});


然后,您只需在这3个回调中做您需要做的事情(都在父页面的上下文中)。因为您是在此处定义url,所以检票口对表单的action属性进行的操作都无关紧要。实际上,该表单的html代码不会更改,除了现在可以省略action属性。

使用内联颜色框,在保持其数据状态(如果有)的同时在它们之间进行切换很容易。首先,假设我们为所有颜色框链接赋予类名“ colorboxLink”,我们在docReady中也需要它:

$(".colorboxLink").colorbox({
    inline:true
});


并在一个隐藏的div中,设置所有颜色框(其中一个是您的表单):

<div style="display:none">
    <form id="login" method="post">
        Username: <input type="text" name="username" /> <br>
        Password: <input type="password" name="password" />
        <input type="submit" value="Go" />
    </form>

    <div id="error">
        Error message.<br>
        <a class="colorboxLink" href="#login">&laquo; Back</a>
    </div>
</div>


因此,第一个颜色框窗口将通过链接打开,后退/前进/其他窗口可通过颜色框内的链接打开(如“错误” div中所示),并在函数中打开颜色框:

$.colorbox({
    open:true,
    href: "#error",
    inline:true
});


您也可以避免在更改窗口时出现闪烁,因为颜色框永远不会完全关闭。

this jsfiddle处查看完整的示例。

关于javascript - 如何“突破” jQuery颜色框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9455093/

10-11 03:52