仅限Chrome ...
<form action="http://example.com" method="get" target="_blank">
<input type="text" name="somename" value="some val">
<input type="submit">
</form>
从控制台执行此js,超时功能或其他...
document.forms[0].submit();
如果通过实际点击“提交”按钮触发提交,表单将正常工作,但如果通过javascript触发提交,它将打开弹出窗口。
我需要这样的表格(方法获取,目标为空白),并且必须通过javascript触发提交,因为在提交之前有几个ajax请求要完成...
有谁知道解决方法?
FOR:Duncan Cowan
$('button').on('click', function(){
// Validation
// foo
// bar
// ...
// var errors = true;
window.promises = new Array;
// do ajax calls and add hidden inputs...
window.promises.push($.ajax({ /* Call ...*/ }));
window.promises.push($.ajax({ /* Call ...*/ }));
window.promises.push($.ajax({ /* Call ...*/ }));
// not always the case
var promis = true;
// once inputs are placed... submit
if (promis) {
$.when.apply($, window.promises).done(function() {
// Do submit
$('form').trigger('submit');
});
}
// errors or promises cancel submit
if ( errors || promis ) {
return false;
}
});
答案 0 :(得分:1)
为了使浏览器不将其分类为弹出窗口,您需要使用受信任事件(即用户点击某些内容等)触发表单提交。如果您需要在提交之前运行ajax,但在受信任的事件之后,您应该以同步模式(async: false
)运行它。
例如,用户点击某处,发出同步ajax请求,然后提交表单。
如果您使用某种非用户启动的事件触发新窗口打开,浏览器会认为它是一个弹出窗口,并且通常会阻止它。
好的,不是通过promises运行AJAX,而是直接在click函数中运行它。但是,设置&#39; async&#39;到&#39;假&#39;这样代码就会停止并等待ajax完成。
$('button').on('click', function(){
// Validation
// foo
// bar
// ...
// var errors = true;
// do ajax calls and add hidden inputs...
$.ajax({asyc: false, /* Call ...*/ });
$.ajax({asyc: false, /* Call ...*/ });
$.ajax({asyc: false, /* Call ...*/ });
$('form').trigger('submit');
});