在新窗口中打开页面,不阻止弹出窗口

问题描述 投票:0回答:7

希望您能在这里提供一点帮助... 我有一个表单,可以翻译字段中的单词,用翻译后的术语填充该字段,然后在一个提交按钮中执行所有提交操作。

提交是由 jquery 进行的。 问题是目标页面被阻止,因为所有 3 个主要浏览器都将其视为弹出窗口, 您知道如何让它作为新选项卡或新窗口打开吗? 我不想将目标设置为 _self,因为我希望人们也打开我的网站。

我相信问题出在这个字符串上:

document.forms.form1.submit();

但我也知道应该有一种方法可以重新表述它,这样目标就不会被视为弹出窗口。

这是脚本:

<script type="text/javascript">

$(function transle() {
  $('#transbox').sundayMorningReset();
  $('#transbox input[type=button]').click(function(evt) {
    $.sundayMorning(
      $('#transbox input[type=text]').val(), {
        source: '',
        destination: 'ZH',
        menuLeft: evt.pageX,
        menuTop: evt.pageY
      },
      function(response) {
        $('#transbox input[type=text]').val(response.translation);

        //document.getElementById("form1").submit();
        document.forms.form1.submit();

      }
    );
  });
});

</script>

这是形式:

<table id="transbox" name="transbox" width="30px" border="0" cellspacing="0" cellpadding="0">
  <form action="custom-page" method="get" name="form1" target="_blank" id="form1">

    <tr>
      <td>
        <input id="q" name="q" type="text" class="search_input" onFocus="if (this.value == 'Evening dress') {this.value = '';}" onBlur="if (this.value == '') {this.value = 'Evening dress';}" value="Evening dress" />
      </td>
      <td>
        <input type="button" value="Find" style="color: #333; width: 157px; font-weight:bold"></input>
      </td>
    </tr>

  </form>
</table>

编辑

我已尝试提交所有这些字符串:

document.getElementById("form1").submit();
document.forms.form1.submit();
form1.submit();

最终目标的弹出窗口被阻止。 请问,我还有其他方法可以编写代码以不让它弹出吗?

也许应该使用 onsubmit 来制作 jQuery ? 有人知道怎么做吗?

javascript jquery popup
7个回答
92
投票

如果打开选项卡/弹出窗口的命令来自可信事件,则浏览器只会打开选项卡/弹出窗口,而不会出现弹出窗口阻止程序警告。这意味着用户必须主动单击某处才能打开弹出窗口。

在您的情况下,用户执行单击,以便您获得可信事件。但是,通过执行 Ajax 请求,您确实会失去可信上下文。您的成功处理程序不再有该事件。避免这种情况的唯一方法是执行同步 Ajax 请求,该请求将在运行时阻止您的浏览器,但会保留事件上下文。

在 jQuery 中这应该可以解决问题:

$.ajax({
 url: 'http://yourserver/',
 data: 'your image',
 success: function(){window.open(someUrl);},
 async: false
});

这是您的答案:在用户单击 ajax 调用后打开没有弹出窗口阻止程序的新选项卡


21
投票

这是唯一一个在所有浏览器中真正对我有用的

let newTab = window.open();
 newTab.location.href = url;


13
投票

作为一般规则,弹出窗口拦截器会针对无需用户交互即可启动的窗口。通常单击事件可以打开一个窗口而不被阻止。 (除非它是一个非常糟糕的弹出窗口拦截器)

尝试在点击事件后启动


7
投票

PS> 我在相关问题上发布了这个答案。以下是我解决异步 ajax 请求丢失可信上下文问题的方法:

我直接在用户单击时打开弹出窗口,将 URL 定向到

about:blank
并获得该窗口的句柄。您可以在发出 ajax 请求时将弹出窗口定向到“正在加载”url

var myWindow = window.open("about:blank",'name','height=500,width=550');

然后,当我的请求成功时,我在窗口中打开我的回调网址

function showWindow(win, url) {
     win.open(url,'name','height=500,width=550');
}

4
投票

对于“提交”按钮,添加此代码,然后设置表单 target="newwin"

onclick=window.open("about:blank","newwin") 

0
投票

我的情况有点复杂,因为我最初的用户交互是

  • 单击按钮
  • 触发了事件处理程序
  • 调用了一个方法
  • 返回了一个承诺
  • 其中包含 ajax 调用
  • 当这个承诺兑现时,实际上应该打开该网址。

我让它正常工作的唯一方法是分两步,如here所建议:

function someFunctionThatsCalledByUserClick(){
    return new Promise((resolve, reject)=>{
        let newTab = window.open();     // <-- always open new tab
        return ajax_wrapper_func().then( data => {
            let url = extract_url(data);
            newTab.location.href = url;     // <-- set the url
            resolve();
        }).catch(e=>{
            newTab.close();     // <-- remove the tab on errors
            reject(e);
        });
    });
}

-2
投票
function openLinkNewTab (url){
    $('body').append('<a id="openLinkNewTab" href="' + url + '" target="_blank"><span></span></a>').find('#openLinkNewTab span').click().remove();
}
© www.soinside.com 2019 - 2024. All rights reserved.