如果我有一个使用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">« Back</a>
</div>
</div>
因此,第一个颜色框窗口将通过链接打开,后退/前进/其他窗口可通过颜色框内的链接打开(如“错误” div中所示),并在函数中打开颜色框:
$.colorbox({
open:true,
href: "#error",
inline:true
});
您也可以避免在更改窗口时出现闪烁,因为颜色框永远不会完全关闭。
在this jsfiddle处查看完整的示例。
关于javascript - 如何“突破” jQuery颜色框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9455093/