我有两种形式,我试图同时提交它们。一个是发布到我们的PHP框架,另一个是发布到外部系统(prestashop安装),这似乎要求用户通过正常的单击提交表单来“访问”页面来处理表单。
我的解决办法是,在解雇另一个表格之后开火一个表格
$(document).ready(function() {
$('#loginForm2').hide(1);
$("#loginButton").click(function() {
$("#userEmail2").val($("#userEmail").val());
$("#userPassword2").val($("#userPassword").val());
$.post(
$("#loginForm").attr("action"), $("#loginForm").serialize(), function(data) {
// alert('posted to users/login successfully');
$("#SubmitLogin").click();
}
);
return false;
});
function refresh() {
location.reload();
}
});
#loginForm2表单被发送到同一页面上的隐藏iframe,iframe在加载页面后刷新(并登录用户)。
<iframe id="loginIframe" style="display:none;" onload="refresh();"></iframe>
这在Chrome和Safari中效果很好,但在Firefox中,它会将iframe视为弹出窗口而不会执行此操作(除非用户说允许弹出窗口)。
有没有办法绕过Firefox认为这个iframe是一个弹出窗口?我明白为什么要这样做;它不是用户点击的真实事件,而是来自jquery的虚拟鼠标点击。我已经查找了一些解决方案,尝试点击“正宗”鼠标点击但没有找到任何似乎有用的东西。
答案 0 :(得分:2)
以下是解决方案:
使其成为您单击外部系统(prestashop)表单的提交按钮而不是主系统的登录按钮(使用CSS隐藏主要系统并显示外部系统)。然后这样做:
$("#SubmitLogin").click(function() {
var loaded = 0;
$("#userEmail2").val($("#userEmail").val());
$("#userPassword2").val($("#userPassword").val());
$.post(
$("#loginForm").attr("action"), $("#loginForm").serialize(), function(data) {
loaded++;
if (loaded > 1) {
location.reload();
}
}
);
$('#loginIframe').load(function() {
loaded++;
if (loaded > 1) {
location.reload();
}
});
});
加载的变量是为了确保在发送主登录的序列化数据之前加载prestashop窗口时,如果没有完成主登录,则不会刷新。
显然,iframe看起来像这样
<iframe id="loginIframe" name="loginIframe" style="display:none;"></iframe>
在Chrome Firefox和Safari中测试过。