为什么javascript触发提交表单(方法get,target _blank)打开弹出窗口而不是新选项卡?

时间:2014-07-07 09:15:35

标签: javascript forms google-chrome

仅限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;
    }
});

1 个答案:

答案 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');

});