【问题标题】:Browser popup blocked despite user clicking button to initiate it尽管用户单击按钮启动它,但浏览器弹出窗口被阻止
【发布时间】:2021-04-02 09:50:07
【问题描述】:

我的网站上有一个按钮,允许用户使用弹出式登录屏幕通过 Yodlee/Plaid 登录他们的银行。问题是移动设备上的 safari 和 chrome 都阻止了弹出窗口。弹出窗口在桌面上工作。我已经读过,如果用户没有单击按钮来启动它们,或者如果它们从单击事件开始的时间超过一秒,则 safari 和 chrome 会阻止所有弹出窗口。

我的问题是我的前端必须在启动弹出窗口之前调用我的后端来检索令牌。所有这些都需要超过一秒钟的时间,因此会阻止弹出窗口。我对 JS 相当陌生,如果有任何意见可以解决这个问题,我将不胜感激。

//makes call to backend to get yodlee access token 
function getAccessToken(){
    $.ajax({
        url: "/request/access-token",
        headers: {'X-CSRFToken': csrf_token},
        type: "POST",
        data: {'id': uuid},
        dataType: "json",
        context: document.body,
        success: function(data){
            var accessToken = data['access_token'];
            openFastLink();
      }
    });
}

//opens fastlink popup
function openFastLink(){
    window.fastlink.open({
      fastLinkURL: 'https://fl4.prod.yodlee.com.au/...',
      accessToken: 'Bearer ' + accessToken,
      forceIframe: true,
      iframeScrolling: true,
      params: {
        configName : 'Aggregation'
      },
      onSuccess: function (data) {
        alert('account linked!')
      }
    },
    'container-fastlink');
}
<button onclick="getAccessToken()">Link Account</button>

【问题讨论】:

  • window.fastlink.open ???
  • openFastLink 不会从用户操作中执行。
  • onclick 这样的内联事件处理程序是not recommended。它们是一种obsolete, hard-to-maintain and unintuitive 注册事件的方式。始终使用 use addEventListener 或 jQuery 的 .on
  • 我明白了。我将如何直接从用户单击启动“fastlink.open”API 调用它?对不起,我对 js 很陌生。 @mplungjan

标签: javascript jquery yodlee


【解决方案1】:

您的点击没有激活打开,ajax返回是。

如果您确定用户需要访问令牌,请获取它

我没有制作实际的 sn-p,因为它不会在这里运行。

$(function() {
  let accessToken;

  $.ajax({
    url: "/request/access-token",
    headers: {
      'X-CSRFToken': csrf_token
    },
    type: "POST",
    data: {
      'id': uuid
    },
    dataType: "json",
    context: document.body,
    success: function(data) {
      accessToken = data['access_token'];
      $("#linkAccount").show()
    }
  });


  //opens fastlink popup
  $("#linkAccount").on("click", function() {
    window.fastlink.open({
        fastLinkURL: 'https://fl4.prod.yodlee.com.au/...',
        accessToken: 'Bearer ' + accessToken,
        forceIframe: true,
        iframeScrolling: true,
        params: {
          configName: 'Aggregation'
        },
        onSuccess: function(data) {
          $("#linkAccount").hide()
          $("#linked").show()
        }
      },
      'container-fastlink');
  });
});
.hide {
  display: none;
}
<button type="button" id="linkAccount" class="hide">Link Account</button>
<div id="linked" class="hide">Account linked</div>

【讨论】:

  • 谢谢。唯一的问题是我希望在与用户单击“链接帐户”时相同的操作中获取访问令牌。每个访问令牌都是收费的,所以我想在检索之前确定用户的意图。
  • 然后尝试 async false 或 promise await 并像 +getAccessToken() 一样在需要的地方获取它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多