【问题标题】:How do I detect if a new window has been opened? The window opens via a submit with target="_blank"如何检测是否打开了新窗口?该窗口通过使用 target="_blank" 提交打开
【发布时间】:2013-09-17 04:56:55
【问题描述】:

我有一个包含表单的页面。表单通过 Javascript 调用提交,并通过设置为“_blank”的目标打开一个新窗口。

<div id="ajax_response_html">
    <form name="testform_name" id="testform_id" method="post" target="_blank" action="index.jsp" accept-charset="UTF-8" />
        <input type="hidden" name="textbox_name" id="textbox_id" value="test" />
    </form>
</div>

在 onclick 事件中,使用 ajax 调用在上述 div 中设置表单。那时,我用 JavaScript 提交表单。

 function setResponse() {
     var response = http.responseText;
     document.getElementById("ajax_response_html").innerHTML = response;
     document.getElementById("testform_id").submit(); 
 }

一个新窗口打开并且工作正常。但是,我有一个使用 webview 的移动应用程序 - 应用程序内的浏览器会话 - 它不会打开新窗口。目前,我无法控制该应用程序,也无法访问其源代码。我唯一的办法是修改页面以安抚应用程序和非应用程序用户。对于前者,它将在同一个窗口中打开。对于后者,它将打开一个新窗口。这就是计划。

我的想法是检测是否打开了一个新窗口。如果没有,那么我在同一个窗口中打开它。

if (!windowOpen) {
    // Open page in the same window
}

如何检测提交表单后是否打开了新窗口?

谢谢。

更新

我与该应用程序的开发人员交谈,他说他已禁用弹出窗口并且不会很快更改。

我修改了页面,因此我没有通过 ajax 调用 html 表单文件,而是使用 JavaScript window.open 函数打开同一个文件:

function openForm() {
    var formWindow = window.open('FormFile.html', '_blank', 'height=' + screen.height + ', width=' + screen.width');
}

在 FormFile.html 中,我附加了一个提交表单的 onload 事件,但目标设置为“_self”,而不是“_blank”。

现在,它会在应用内的同一个窗口中打开,并在其他任何地方打开一个新窗口。我的问题是,既然弹出窗口在应用程序中被禁用,为什么 window.open 可以工作,而我用来提交表单的原始方法却失败了?

【问题讨论】:

    标签: javascript html forms tabs window


    【解决方案1】:

    我的建议是事先检查用户是否正在使用该应用程序,然后据此修改行为,而不是检查是否打开了新窗口。我过去通过检查 screen.width 属性来完成此操作(可以在 CSS 中类似地完成),但您可以更干净地完成此操作(由 this post's 回答提供):

    if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
        // some code..
    }
    

    这样更简洁,因为您可以在加载时确定是需要在当前窗口还是新窗口中打开,而不是稍后对用户发生的事情做出反应。

    【讨论】:

    • 我认为这是个好主意。我同意你的观点,它更干净,但这并不能检测用户是否在应用程序内,只是如果他或她正在使用移动设备。例如,如果用户在 iPhone 上使用 Chrome,它应该打开一个新窗口。但是,如果它在应用程序中,它将在同一窗口中打开。
    • 无法通过其他方法(例如修改应用发布数据到网页)检测应用中是否有人,无法检测应用本身是否打开。出于安全原因,Javascript 也不允许在当前窗口之外进行任何交互,因此您只能找到一种解决方法,可能使用onblur,但它们充其量只是粗略的方法。
    • 谢谢。我愿意使用粗略的方法,直到应用程序开发人员发布新版本(我与他交谈,他已禁用弹出窗口并可能考虑在下一个版本中启用它们)。你所说的使用 onblur 的方法是什么?
    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2015-01-16
    • 2012-04-20
    • 1970-01-01
    • 2015-09-25
    • 2013-04-04
    • 1970-01-01
    相关资源
    最近更新 更多