我之前问过这个问题,但过了一段时间,我觉得我必须在遇到的问题上更明确一点。
场景:
- 1 个表单,2 个包含字段的花式框。一个花式框包含"字段 1",另一个包含"字段 2"。
对于期望的结果:
- 转到 http://testing.myautoiq.com/fancybox
- 点击"从主页提交">
正如您将注意到的那样,field_1 和 field_2 的值都以 _POST var 的形式返回。
要生成错误 1:
- 点击"打开FB 1"查看field_1
- 点击"从FB 1提交">
正如您将注意到的,仅返回field_2。
要生成错误 2:
- 单击"打开FB 2",您会看到field_2
- 点击"从FB 2提交">
正如您将注意到的,仅返回field_1。
随意在源头中挖掘,那里没有什么不寻常的。这是FB的问题吗?如果是这样,如何纠正?我快要疯了。
首先,您必须了解fancybox如何处理inline
内容:当您打开fancybox时,目标inline
内容将从其在DOM中的位置">移动"到fancybox中(而是留下占位符)
。在您的情况下,字段被"移"出form
因此当您从 Fancybox 中提交它时,form
中不存在字段field_1
或field_2
,因此它们无法返回任何值。
您需要重写代码的逻辑。我要做的是将提交fancybox中form
的链接bind
到关闭fancybox的事件(将字段返回到form
中的位置)并在之后提交form
,因此而不是这些:
<a href="#" onClick="document.testform.submit();">Submit from FB 1</a>
和
<a href="#" onClick="document.testform.submit();">Submit from FB 2</a>
会这样做
<a class="submit" href="#nogo" >Submit from FB 1</a>
和
<a class="submit" href="#nogo" >Submit from FB 2</a>
请注意,我添加了class="submit"
来处理来自此类选择器的事件。
然后,在脚本顶部创建一个标志(如下所述)
var subMitted = false;
并向选择器.submit
bind
click
事件:
$(".submit").bind("click", function(){
subMitted = true; // set to true when we click on the selector .submit only
$.fancybox.close();
});
并将afterClose
回调添加到您的 Fancybox 自定义脚本中
$(".fancybox").fancybox({
afterClose: function(){
// will submit if we clicked the selector .submit
if(subMitted){
subMitted = false; // re-initialize the flag
$("form[name='testform']").submit();
}
}
});
如果subMitted
true
,我们点击了.submit
选择器,所以我们将在关闭花式框后提交form
(我们不会提交form
如果使用close
按钮关闭花式框)
这样,您的表单将始终返回所有值,无论它是否从 fancybox 内部提交。