Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么javascript触发的提交表单(方法get,目标为空)会打开弹出窗口而不是新选项卡?_Javascript_Forms_Google Chrome - Fatal编程技术网

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

为什么javascript触发的提交表单(方法get,目标为空)会打开弹出窗口而不是新选项卡?,javascript,forms,google-chrome,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> 若提交是通过实际点击“提交”按钮触发的,表单将正常工作,但若提交是通过javascript触发的,它将打开弹出窗口 我需要像这样的表单(

仅在chrome上

<form action="http://example.com" method="get" target="_blank">
<input type="text" name="somename" value="some val">
<input type="submit">
</form>
若提交是通过实际点击“提交”按钮触发的,表单将正常工作,但若提交是通过javascript触发的,它将打开弹出窗口

我需要像这样的表单(方法get,目标blank),提交必须通过javascript触发,因为在提交之前需要完成几个ajax请求

有人知道变通方法吗

适用于:邓肯·考恩

$('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;
    }
});

为了使浏览器不将其归类为弹出窗口,您需要使用可信事件(即用户单击某个对象等)触发表单提交。如果您需要在提交之前但在受信任事件之后运行ajax,则应在同步模式下运行它(
async:false

例如,用户单击某处,发出同步ajax请求,然后提交表单

如果您使用某种非用户启动的事件触发一个新窗口打开,浏览器会认为它是一个弹出窗口,并且经常会阻止它

好的,不要通过承诺来运行AJAX,只需在单击函数中直接运行它。但是,将“async”设置为“false”,以便代码停止并等待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');

});

这似乎是,它详细讨论了这个问题。你能创建plunker来重现这个问题吗?@AlexP抱歉,这对我没有帮助。但那是真的。@MichałLach这就可以了:问题是我需要ajax检索的数据作为表单的一部分。。。所以我在使用Promissions:(具体来说,您使用AJAX得到了什么?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');

});