如何判断弹出窗口是否会被阻止

How to tell if a popup will get blocked

我很欣赏浏览器在决定 window.open() 是否由点击触发时的工作方式,因为它仅在来自真实元素点击事件时才被允许。

我想自己写同样的逻辑,我该怎么做?

假设我有任何 JS 函数,可能会从我的应用程序的其余部分随时随地调用,有时在调用堆栈的开头有一个单击事件处理程序,有时则没有。我如何在我的方法中知道这一点,而不在我的应用程序中一直明确传递有关堆栈开始的信息(点击与否)?

function iNeedToKnowIfStackFrame0WasAClickEventListener() {
  var wasAClick = ???;
  if(wasAClick)
    window.open(...);
  else
    something.else();
}

您可以使用this.event.type获取事件信息。 您可以像这样将事件传递给函数:

function iNeedToKnowIfStackFrame0WasAClickEventListener(event) {   
    var wasAClick = event.type == "click";    
    if(wasAClick)
        window.open(...);   
    else
        something.else(); 
}

或者您可以取消此活动

function iNeedToKnowIfStackFrame0WasAClickEventListener() {   
    var wasAClick = this.event.type == "click";    
    if(wasAClick)
        window.open(...);   
    else
        something.else(); 
}